编程风格
(1)类型采用全部pt_+小写下划线+_t
(2)宏定义采用全部大写+下划线(可选)
(3)变量 采用单词首字母大写+多单词组合(无下划线)
(4)函数采用名动词,单词首字母大写+多单词组合(无下划线)
任务状态,主要有以下几种
采用宏定义方式 ,可以由1个字节保存(如果采用枚举,将取决于MCU类型,M3就要占用4个字节)
/*> thread status definitions */
目前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 */typedef struct pt_tcb_object pt_tcb_t;
注:为了节省内存,尽量将所有同类型的放在一起(使得程序阅读上带来稍许困难而已)