Mercurial > ecos
diff packages/kernel/current/include/kapidata.h @ 0:3111d98ba7b3 ecos-v1_1-release
Initial commit of eCos version 1.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 11:16:07 +0000 |
| parents | |
| children | 443894e2e912 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/kernel/current/include/kapidata.h @@ -0,0 +1,386 @@ +#ifndef CYGONCE_KERNEL_KAPIDATA_H +#define CYGONCE_KERNEL_KAPIDATA_H + +/*============================================================================= +// +// kapidata.h +// +// Native API data structures +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Cygnus eCos Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://sourceware.cygnus.com/ecos +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Cygnus Operating System, released +// September 30, 1998. +// +// The Initial Developer of the Original Code is Cygnus. Portions created +// by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg +// Date: 1998-03-13 +// Purpose: Native API data structures +// Description: This file defines the structures used in the native API. The +// sizes of these structures are dependent on the system +// configuration and must be kept in step with their real +// counterparts in the C++ headers. +// Usage: included by kapi.h +// +//####DESCRIPTIONEND#### +// +//==========================================================================*/ + +#include <pkgconf/kernel.h> + +#include <cyg/infra/cyg_type.h> +#include <cyg/hal/hal_intr.h> // exception defines + +/*---------------------------------------------------------------------------*/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*---------------------------------------------------------------------------*/ + +#ifndef CYGNUM_KERNEL_SCHED_BITMAP_SIZE +#if defined(CYGSEM_KERNEL_SCHED_MLQUEUE) +#define CYGNUM_KERNEL_SCHED_BITMAP_SIZE 32 +#elif defined(CYGSEM_KERNEL_SCHED_BITMAP) +#define CYGNUM_KERNEL_SCHED_BITMAP_SIZE 32 +#endif +#endif + +#if CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 8 +typedef cyg_ucount8 cyg_sched_bitmap; +#elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 16 +typedef cyg_ucount16 cyg_sched_bitmap; +#elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 32 +typedef cyg_ucount32 cyg_sched_bitmap; +#elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 64 +typedef cyg_ucount64 cyg_sched_bitmap; +#else +#error Bitmaps greater than 64 bits not currently allowed +#endif + +typedef struct +{ +#if defined(CYGSEM_KERNEL_SCHED_BITMAP) + + cyg_sched_bitmap map; + +#elif defined(CYGSEM_KERNEL_SCHED_MLQUEUE) + + cyg_thread *queue; + +#elif defined(CYGSEM_KERNEL_SCHED_LOTTERY) + + cyg_thread *queue; + +#else + +#error Undefined scheduler type + +#endif +} cyg_threadqueue; + +/*---------------------------------------------------------------------------*/ + +struct cyg_interrupt +{ + cyg_vector_t vector; + cyg_priority_t priority; + cyg_ISR_t *isr; + cyg_DSR_t *dsr; + CYG_ADDRWORD data; + +#ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS_LIST + cyg_ucount32 dsr_count; + cyg_interrupt *next_dsr; +#endif +#ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN + cyg_interrupt *next; +#endif +}; + + +/*---------------------------------------------------------------------------*/ + +struct cyg_counter +{ +#if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST) + cyg_alarm *alarm_list; +#elif defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST) + cyg_alarm *alarm_list[CYGNUM_KERNEL_COUNTERS_MULTI_LIST_SIZE]; +#endif + cyg_tick_count_t counter; + cyg_uint32 increment; +}; + +/*---------------------------------------------------------------------------*/ + +struct cyg_clock +{ + cyg_counter counter; + cyg_resolution_t resolution; +}; + +/*---------------------------------------------------------------------------*/ + +struct cyg_alarm +{ +#if defined(CYGIMP_KERNEL_COUNTERS_SINGLE_LIST) || defined(CYGIMP_KERNEL_COUNTERS_MULTI_LIST) + cyg_alarm *next; +#endif + cyg_counter *counter; + cyg_alarm_t *alarm; + CYG_ADDRWORD data; + cyg_tick_count_t trigger; + cyg_tick_count_t interval; + cyg_bool enabled; +}; + +/*---------------------------------------------------------------------------*/ +/* Exception controller */ + +#ifdef CYGPKG_KERNEL_EXCEPTIONS +typedef struct +{ +#ifdef CYGSEM_KERNEL_EXCEPTIONS_DECODE + cyg_exception_handler_t *exception_handler[CYG_EXCEPTION_COUNT]; + + CYG_ADDRWORD exception_data[CYG_EXCEPTION_COUNT]; +#else + cyg_exception_handler_t *exception_handler; // Handler function + + CYG_ADDRWORD exception_data; // Handler data +#endif + +} cyg_exception_control; + +#endif + +/*---------------------------------------------------------------------------*/ +/* Thread structure */ + +typedef struct +{ + CYG_ADDRESS stack_base; /* pointer to base of stack area */ + cyg_uint32 stack_size; /* size of stack area in bytes */ +#ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT + CYG_ADDRESS stack_limit; /* movable stack limit */ +#endif + CYG_ADDRESS stack_ptr; /* pointer to saved state on stack */ + CYG_ADDRWORD entry_point; /* main entry point (code pointer!) */ + CYG_ADDRWORD entry_data; /* entry point argument */ +#ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT + void *saved_context; // If non-zero, this points at a more + // interesting context than stack_ptr. +#endif + +} cyg_hardwarethread; + +typedef struct +{ +#if defined(CYGSEM_KERNEL_SCHED_BITMAP) + + cyg_priority_t priority; /* current thread priority */ + +#elif defined(CYGSEM_KERNEL_SCHED_MLQUEUE) + + cyg_thread *next; + cyg_thread *prev; + + cyg_priority_t priority; /* current thread priority */ + +#elif defined(CYGSEM_KERNEL_SCHED_LOTTERY) + + cyg_thread *next; + cyg_thread *prev; + + cyg_priority_t priority; /* current thread priority */ + + cyg_priority_t compensation_tickets; /* sleep compensation */ + +#else + +#error Undefined scheduler type + +#endif + + cyg_threadqueue *queue; + +#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE + cyg_count32 mutex_count; +#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE_SIMPLE + cyg_priority_t original_priority; + cyg_bool priority_inherited; +#endif +#endif + +} cyg_schedthread; + +typedef struct +{ + cyg_alarm alarm; + cyg_thread *thread; +} cyg_threadtimer; + + +typedef int cyg_reason_t; /* cyg_reason is originally an enum */ + +struct cyg_thread +{ + cyg_hardwarethread hwthread; + cyg_schedthread schedthread; + + cyg_uint32 state; + cyg_ucount32 suspend_count; + cyg_ucount32 wakeup_count; + CYG_ADDRWORD wait_info; + cyg_uint16 unique_id; + + +#if defined(CYGPKG_KERNEL_EXCEPTIONS) && !defined(CYGSEM_KERNEL_EXCEPTIONS_GLOBAL) + + cyg_exception_control exception_control; + +#endif + +#ifdef CYGFUN_KERNEL_THREADS_TIMER + cyg_threadtimer timer; +#endif + + cyg_reason_t sleep_reason; + cyg_reason_t wake_reason; + +#ifdef CYGVAR_KERNEL_THREADS_DATA + + CYG_ADDRWORD thread_data[CYGNUM_KERNEL_THREADS_DATA_MAX]; + +#endif + +#ifdef CYGVAR_KERNEL_THREADS_NAME + + char *name; + +#endif + +#ifdef CYGVAR_KERNEL_THREADS_LIST + + cyg_thread *list_next; + +#endif + +}; + +/*---------------------------------------------------------------------------*/ + +struct cyg_mbox +{ + cyg_count32 base; /* index of first used slot */ + cyg_count32 count; /* count of used slots */ + cyg_threadqueue get_threadq; /* Queue of waiting threads */ +#ifdef CYGMFN_KERNEL_SYNCH_MBOXT_PUT_CAN_WAIT + cyg_threadqueue put_threadq; /* Queue of waiting threads */ +#endif + void * itemqueue[ CYGNUM_KERNEL_SYNCH_MBOX_QUEUE_SIZE ]; +}; + +/*---------------------------------------------------------------------------*/ + +struct cyg_sem_t +{ + cyg_count32 count; /* The semaphore count */ + cyg_threadqueue queue; /* Queue of waiting threads */ +}; + +/*---------------------------------------------------------------------------*/ + +struct cyg_flag_t +{ + cyg_flag_value_t value; /* The flag value */ + cyg_threadqueue queue; /* Queue of waiting threads */ +}; + +/*---------------------------------------------------------------------------*/ + +struct cyg_mutex_t +{ + cyg_bool locked; /* true if locked */ + cyg_thread *owner; /* Current locking thread */ + cyg_threadqueue queue; /* Queue of waiting threads */ + +}; + +/*---------------------------------------------------------------------------*/ + +struct cyg_cond_t +{ + cyg_mutex_t *mutex; /* Associated mutex */ + cyg_threadqueue queue; /* Queue of waiting threads */ +}; + +/*---------------------------------------------------------------------------*/ + +/* This corresponds to the extra fields provided by the mempoolt template + not the actual size of the template in any given instance. */ +typedef struct cyg_mempoolt { + cyg_threadqueue queue; +} cyg_mempoolt; + + +struct cyg_mempool_var_memdq { + struct cyg_mempool_var_memdq *prev, *next; + cyg_int32 size; +}; + +struct cyg_mempool_var { + struct cyg_mempool_var_memdq head; + cyg_uint8 *obase; + cyg_int32 osize; + cyg_int32 oalign; + cyg_uint8 *bottom; + cyg_uint8 *top; + cyg_int32 alignment; + cyg_int32 freemem; + cyg_mempoolt mempoolt; +}; + +struct cyg_mempool_fix { + cyg_uint32 *bitmap; + cyg_int32 maptop; + cyg_uint8 *mempool; + cyg_int32 numblocks; + cyg_int32 freeblocks; + cyg_int32 blocksize; + cyg_int32 firstfree; + cyg_uint8 *top; + cyg_mempoolt mempoolt; +}; + +/*------------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +/*---------------------------------------------------------------------------*/ +/* EOF kapidata.h */ +#endif /* CYGONCE_KERNEL_KAPIDATA_H */
