嵌入式实时抢占操作系统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;
注:为了节省内存,尽量将所有同类型的放在一起(使得程序阅读上带来稍许困难而已)
- 嵌入式实时抢占操作系统PT(preemption thread)RTOS——任务状态和任务控制块(2)
- 嵌入式实时抢占操作系统PT(preemption thread)RTOS——任务设计(3)
- 嵌入式实时抢占操作系统PT(preemption thread)RTOS——抢占内核设计(1)
- 实时多任务操作系统(RTOS)
- RTOS(2):任务状态转变
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(2) ――任务控制
- 基于嵌入式操作系统VxWorks的多任务并发程序设计(2) ――任务控制
- (嵌入式 实时操作系统 rtos nuttx 7.1 stm32 源代码分析)
- ucos任务状态及任务控制块
- 了解实时多任务操作系统(RTOS),进入单片机开发领域
- 实时操作系统的任务调度示例之抢占
- 嵌入式实时操作系统任务调度算法
- 【操作系统】HRT任务和SRT任务(实时系统中的硬实时系统和软实时系统)
- 实时操作系统任务调度
- 浅谈实时操作系统任务管理 和 调度
- RTOS任务
- ·嵌入式实时操作系统uC/OS-II中的任务管理
- 基于嵌入式操作系统的实时性多任务划分方法
- 好的照片前后其都必须要下足功夫
- HTTP Status 500 - java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
- debug,release 和 distribution 的区别
- two sum
- lua--从小白开始(3)
- 嵌入式实时抢占操作系统PT(preemption thread)RTOS——任务状态和任务控制块(2)
- JavaScript使用focus()设置焦点失败的一个解决方法
- 贡献式编程(二)
- 中水处理设备:小区中水回用设备特性剖析
- java正则表达式
- jQuery循环滚动展示代码[转]
- 【转】关于Linux内核模块的编写
- 配置hibernate根据实体类自动建表功能
- 修改Windows 7/8/8.1右键“发送到”菜单项目