嵌入式实时抢占操作系统PT(preemption thread)RTOS——任务状态和任务控制块(2)

来源:互联网 发布:2016域名投资趋势 编辑:程序博客网 时间:2024/05/20 05:27

编程风格

(1)类型采用全部pt_+小写下划线+_t

(2)宏定义采用全部大写+下划线(可选)

(3)变量 采用单词首字母大写+多单词组合(无下划线)

(4)函数采用名动词,单词首字母大写+多单词组合(无下划线)


任务状态,主要有以下几种

采用宏定义方式 ,可以由1个字节保存(如果采用枚举,将取决于MCU类型,M3就要占用4个字节)

/*> thread status definitions */
#define RT_TASK_READY                 0    //> Ready status 
#define RT_TASK_PEND_DLY                1    //> Suspend in delay time status
#define RT_TASK_PEND_IPC              2    //> Suspend in IPC status
#define RT_TASK_PEND_IPC_DLY           3    //> Suspend in IPC status,but apply for delay
#define RT_TASK_RUNNING               4    //> Running status
#define RT_TASK_SLEEP                5    //> interrupt status
#define RT_TASK_CLOSE                 6    //> close status

目前RTOS针对单核MCU,所以RT_TASK_RUNNING 该状态没使用


任务主要有RT_TASK_READY (就绪),  RT_TASK_PEND_DLY(时间延时), RT_TASK_PEND_IPC(事件延时)和RT_TASK_PEND_IPC_DLY(事件和时间延时共发)4中主要运行状态

 RT_TASK_RUNNING(用于多核MCU)    

RT_TASK_SLEEP (用于MCU休眠)  

RT_TASK_CLOSE  (用于MCU回收资源,主要是动态分配后,静态申请不能回收,僵进程,调试使用)                                             



双向链表:

双向链表是其内部使用最多的对象,合理有效的抽象出来会带来不可思议的方便(当然也省掉不少Flash空间)

struct pt_list{
struct pt_list *PreNode;
struct pt_list *NextNode;
} ;

typedef struct pt_list pt_list_t;

//通过列表成员地址计算得到整个结构体的地址(列表是属于结构体的一员)

#define pt_list_entry(node, type, member)    ((type *)((pt_uint8_t*)(node) - (pt_umcu_t)(&((type *)0)->member)))

//都定义成内敛函数

pt_inline unsigned char pt_list_isempty(pt_list_t *p)  //链表有无内容判定,‘1’-空链表  ‘0’-有链表存在

pt_inline void rt_list_init(pt_list_t *p) //初始化,前后节点都指向自己

pt_inline void rt_list_insert_after(pt_list_t *p,pt_list_t *k)  //将链表k插入到p之后

pt_inline void rt_list_insert_before(pt_list_t *p, pt_list_t *k)  //将链表k插入到p之前

pt_inline void rt_list_delete(pt_list_t *p //将列表p删除并同时将p进行初始化


任务控制块

该对象属于关键定义,初步定义如下,以后如果有组件需要添加,则需要另外添加定义

/*> pt task structure */
struct pt_tcb_object
{
  pt_stk_t        *StackP;   /*> need check the mcu's architecture */
char *Name;
void (*Entry)(void *Para);
void          *Para;

pt_tick_t        TcbStaticTick;
pt_umcu_t       TcbEveryTick;
pt_umcu_t        TcbTaskSlice;

pt_list_t             TaskList; // task list
  
pt_list_t             IpcTaskList;  // ipc list which used point the task


  pt_uint32_t        TcbGrpMask;

#if PT_IPC_EVENT_EN > 0
pt_uint32_t EventValue;
pt_uint8_t EventType;
#endif

  #if TASK_PRIVATE_EN > 0
void           *PrivateData;
pt_uint16_t           PrivateSize;
  pt_uint16_t           PrivateInoffset;
  pt_uint16_t           PrivateOutoffset;
  #endif

pt_uint16_t      StackSize;
pt_uint8_t      TcbPrioMask;
pt_uint8_t      Error;
pt_uint8_t      Status;
pt_uint8_t      InitPrio;
pt_uint8_t      CurrPrio;
};

typedef struct pt_tcb_object pt_tcb_t;

注:为了节省内存,尽量将所有同类型的放在一起(使得程序阅读上带来稍许困难而已)




0 0
原创粉丝点击