📄 internal.h
字号:
//*************************************************************************
//
// Copyright (C) SEIKO EPSON CORP. 1997
// All Rights Reserved
//
// Filename : internal.h
// Function : internal use header for ros33
// Revision :
// 1997/08/01 H.Matsuoka start
// 1999/08/26 H.Matsuoka Add message buffer function
// 1999/09/29 H.Matsuoka interrupt mask by IL
// 2000/02/23 H.Matsuoka Fix suspend status problem
// 2000/11/21 Y.Taka Add Memory Pool Management
// 2000/11/29 Y.Taka Add Enter/Return_critical_section
// 2001/02/07 Y.Taka flg to 16 bit & cyclic/alarm handler
// 2001/03/08 Y.Taka Del critical section sub.
// 2001/04/24 Y.Taka Add semaphore max counter
//
//*************************************************************************
//
// Copyright (C) Asic Center. 2001
// All Rights Reserved
// Revision :
// 2002/04/17 Pessia Move context structure to HAL file
//*************************************************************************
/*
Internal data structure
@Ready queue, bi-directional list
ready_queue[0] - task - task -
ready_queue[1] - task - task(suspend) - task
:
:
ready_queue[LAST] - task - task -
@Ready TimeHandler queue, bi-directional list
readyhndr_queue - timehandler - timehandler -
@Semaphre control block, task is bi-directional list.
g_sSmphcb[0] - task - task -
+--bSmphCnt
g_sSmphcb[1] - task - task -
+--bSmphCnt
:
:
g_sSmphcb[LAST] - task - task -
+--bSmphCnt
@Flag control block, task is bi-directional list.
g_sFlgcb[0] - task - task -
|
+--flag_pattern
+--wait_pattern
+--wait_flag_mode
g_sFlgcb[1] - task - task -
|
+--flag_pattern
+--wait_pattern
+--wait_flag_mode
:
:
g_sFlgcb[LAST] - task - task -
|
+--flag_pattern
+--wait_pattern
+--wait_flag_mode
@Mail box control block, task is bi-directional list.
g_sMlbxcb[0] - task - task -
|
+--message - message -
g_sMlbxcb[1] - task - task -
|
+--message - message -
:
:
g_sMlbxcb[LAST] - task - task -
|
+--message - message -
@Message buffer control block, task is bi-directional list.
g_sMsgbufcb[0]
|
+- rcv_task - rcv_task -
+- snd_task - snd_task -
+-buffer
+-buffer_size
@Variable-size Memory Pool control block, task is bi-directional list.
g_sMplcb[0]
|
+- get_task - get_task -
+-pool_adr
+-row
+-block_size
@Fixed-size Memory Pool control block, task is bi-directional list.
g_sMpfcb[0]
|
+- get_task - get_task -
+-pool_adr
+-row
+-block_size
@Sleep status task
+--->----+
| |
+= task =+
| |
+---<----+
@Suspend
suspend task still connect to ready queue.
*/
#define INT_MASK_IL
#include "multsk.h" //02-8-24 14:27
#include "itron.h"
typedef struct t_node
{
struct t_node *pNxt;
struct t_node *pPrv;
} T_NODE;
typedef struct
{
UW* pNxtTimeOutTsk;
UW* pPrevTimeOutTsk;
} T_TIMEOUTTSK; // time out task list
typedef struct
{
UW* pNxtTsk;
UW* pPrvTsk;
} T_READYQUEUE;
typedef struct
{
UW* pNxtTimeHndr;
UW* pPrvTimeHndr;
} T_TIMEHNDR; // time waiting handler list
typedef struct
{
UW* pNxtReadyHndr;
UW* pPrvReadyHndr;
} T_READYHNDR; // ready handler list
// mail box control block 12 bytes
typedef struct
{
UW* pNxtTsk;
UW* pPrvTsk;
UW count;//pessia: message counts
T_MSG* pMsg; // message list
} T_MLBXCB;
// flag control block 16 bytes (alignment)
typedef struct
{
UW* pNxtTsk;
UW* pPrvTsk;
UH uhFlgPtn; // flag pattern
UH uhWaiPtn; // wait pattern
B bWaiMode; // wait flag mode
} T_FLGCB;
// semaphore control block 12 bytes (alignment)
typedef struct
{
UW* pNxtTsk;
UW* pPrvTsk;
UB ubSmphMax; // semaphore max count
UB ubSmphCnt; // semaphore count
} T_SMPHCB;
// message buffer control block 40bytes
typedef struct
{
UW* pNxtTsk;
UW* pPrvTsk;
UW* pNxtSndTsk; // snd_msgbuf task wait until buffer empty
UW* pPrvSndTsk;
VP bufst; // message buffer start address
VP bufend; // message buffer end address
VP head; // first message start address in queue
VP tail; // last message end next address in queue
INT maxmsz; // max message size
UB ubEmpty;// empty flag
} T_MSGBUFCB;
// memory pool control block 32bytes
typedef struct
{
UW* pNxtTsk;
UW* pPrvTsk;
VP StartAlloc; // allocate area, start adddress
VP EndAlloc; // allocate area, end adddress
VP NxtAlcp; // next allocate address pointer
VP TblPtr; // next address for table
UW ulRow; // table counter
UW ulBlksz; // Block size
} T_MPLCB;
// task control block 68 bytes (alignment)
typedef struct
{
UW* pNxtTsk; //0
UW* pPrvTsk; //4
UW* pNxtTmoTsk; //8
UW* pPrvTmoTsk; //12
UW uwSP; //16 stack pointer while dispatching(use in asm)
UW uwIniSP; //20 initial stack pointer (use in asm)
FP fpPC; //24 task (program counter)
UINT* pFlgptn; //28 wait flag pattern
T_MSG** pMsg; //32 message point
VP pMsgbuf; //36 message buffer
INT msgsize; //40 receive message size
VP pMplblk; //44 memory pool block address
UW blksize; //48 memory pool block size
UW ltime ; //52 time limit lower 32 bits
H utime; //56 time limit upper 16 bits
UH uhWupcnt; //58 wakeup count
B bPriority; //60 task priority (0 to MAX_TSKPRI-1)
B bIniPriority; //61 initial task priority (0 to MAX_TSKPRI-1)
UB ubIntinfo; //62 interrupt information (use in asm)
UB ubStatus; //63 task status (use in asm)
// 0b00001 RUN
// 0b0001x READY
// 0b001xx WAIT
// 0b010xx SUSPEND
// 0b011xx WAIT-SUSPEND
// 0b1xxxx DORMANT
UH ubWaitStat; //64 wait status(990826 change forMSGBUF ub->uh)
// see status pattern include\itron.h
T_FSCB fscb; // file system 02-8-24 9:55
} T_TSKCB;
// cyclic handler control block 36bytes
typedef struct
{
UW* pNxtTimeHndr;
UW* pPrvTimeHndr;
FP fpPC; // handler (program counter)/
UINT cycact; // cyclic active flag
UINT tmmode; // alarm time mode
UW Iniltime; // Init time limit lower 32 bits
H Iniutime; // Init time limit upper 16 bits
UW ltime; // time limit lower 32 bits
H utime; // time limit upper 16 bits
UB ubHndrStat; // Handler Status
} T_HNDRCB;
extern T_TSKCB* g_pCurTsk; // current task
extern T_HNDRCB* g_pCurHndr; // current handler
extern UB g_ubIntNestCnt; // interrupt nesting
extern UB g_ubSysStat; // system status
extern UB g_blDelay; // delayed dispatching
extern SYSTIME g_sSysTime; // system time
extern T_TIMEOUTTSK g_sTimeOutTsk; // time out task list
extern T_READYQUEUE g_sReadyQueue[];// ready queue
extern T_TIMEHNDR g_sTimeHndr; // time waiting handler list
extern T_READYHNDR g_sReadyHndr; // ready handler list
extern T_MLBXCB g_sMlbxcb[]; // mail box control block
extern T_SMPHCB g_sSmphcb[]; // semaphre control block
extern T_FLGCB g_sFlgcb[]; // flag control block
extern T_MSGBUFCB g_sMsgbufcb[]; // message buffer control block
extern T_MPLCB g_sMplcb[]; // variable-size memory pool control block
extern T_MPLCB g_sMpfcb[]; // fixed-size memory pool control block
extern T_TSKCB g_sTskcb[]; // task control block
extern T_HNDRCB g_sCycHndrcb[]; // cyclic handler control block
extern T_HNDRCB g_sAlmHndrcb[]; // alarm handler control block
/*02-6-19 16:01 Pessia:
* no const!!!*/
extern UH g_uhIntTime; // interrupt time
// Initialize member
#define mInitMember(pMember) {(pMember)->pNxt = pMember; \
(pMember)->pPrv = pMember;}
extern void vfnDelAddMember(T_NODE* , T_NODE* );
extern void vfnDelInitMember(T_NODE*);
extern void vfnAddTimer(T_NODE*);
extern void vfnAddTimeHndr(T_NODE*);
// inside subroutin groupe
extern int ros_put_mbf(T_MSGBUFCB* pMsgbufcb, VP msg, INT msgsz);
extern int ros_get_mbf(T_MSGBUFCB* pMsgbufcb, VP msg);
extern int ros_mem_alloc(T_MPLCB* pMplcb, VP *p_blk, INT blksz);
extern int ros_mem_free(T_MPLCB* pMplcb, VP blk);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -