⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 internal.h

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 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 + -