任务控制块os_tcb

OS_TCB是操作系统中的核心结构,它包含了任务的堆栈指针、链表指针、事件控制块指针、延时计数、状态和优先级等关键信息。OSTimeTick函数用于处理任务延时,遍历任务控制块链表,当延时计数为0时,任务进入就绪状态。任务创建和删除时,OS_TCB会在链表中增删。OSTCBEventPtr指向与任务同步或通信相关的事件控制块,OSTCBMsg则用于存储接收的消息数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

typedrf struct os_tcb {

通常,操作系统会将当前所有任务控制块组成一个双向的链表OSTCBList,这个链表将在函数OSTimeTick中被用到。
OSTimeTick函数是系统的时钟处理函数,他负责系统各任务的延时工作,一般情况下,OSTimeTick会被周期性的调用,其本质是操作上面所说的OSTCBList,它遍历链表中的每一个任务控制块的OSTCBDly字段,并将需要延时的任务的OSTCBDly值减1,当某人物的该字段值减为0时,这个任务就会在就绪表中被标记,任务结束等待进入就绪状态。
每个任务创建时,都会被加入链表OSTCBList中,在任务被删除时,相应控制块也会在链表中清除。

OS_STK *OSTCBStkPtr; //任务堆栈栈顶指针

struct os_tcb *OSTCBNext; //指向后一个任务控制块

stryct os_tcb *OSTCBPrev; //指向前一个任务控制块

OSTCBEventPtr用来指向当前和任务密切相关的事件控制块,所谓密切相关,即任务阻塞在该事件上。在ucosII中,所有的任务同步与通信机制,包括信号量、邮箱、消息队列等都是通过事件控制块来描述,当任务请求同步或通信服务,并阻塞在相应事件上,OSTCBEventPtr字段就记录了这个事件对应的事件控制块.
OS_EVENT *OSTCBEventPtr; //指向与任务当前事件相关的事件控制块

OSTCBMsg字段在任务中使用邮箱或消息队列传输数据时被使用,该字段用于记录其他任务传递个本任务的数据的地址(即数据指针)。
void *OSTCBMsg; //用于指向从邮箱或队列中接收到的消息

INT16U OSTCBDly;

//开始任务函数 void start_task(void *p_arg) { OS_ERR err; CPU_SR_ALLOC(); p_arg = p_arg; CPU_Init(); #if OS_CFG_STAT_TASK_EN > 0u OSStatTaskCPUUsageInit(&err); //统计任务 #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间 CPU_IntDisMeasMaxCurReset(); #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候 //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms OSSchedRoundRobinCfg(DEF_ENABLED,1,&err); #endif OS_CRITICAL_ENTER(); //进入临界区 //创建gui任务(图形任务界面) OSTaskCreate((OS_TCB * )&GUITaskTCB, //任务控制块 (CPU_CHAR * )"gui task", //任务名字 (OS_TASK_PTR )gui_task, //任务函数 (void * )0, //传递给任务函数的参数 (OS_PRIO )GUI_TASK_PRIO, //任务优先级 (CPU_STK * )&GUI_TASK_STK[0], //任务堆栈基地址 (CPU_STK_SIZE)GUI_STK_SIZE/10, //任务堆栈深度限位 (CPU_STK_SIZE)GUI_STK_SIZE, //任务堆栈大小 (OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度, (void * )0, //用户补充的存储区 (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项 (OS_ERR * )&err); //存放该函数错误时的返回值 //创建Heat任务 OSTaskCreate((OS_TCB * )&HeatTCB, (CPU_CHAR * )"Heat task", (OS_TASK_PTR )heat_task, (void * )0, (OS_PRIO )HEAT_PRIO, (CPU_STK * )&HEAT_STK[0], (CPU_STK_SIZE)HEAT_STK_SIZE/10, (CPU_STK_SIZE)HEAT_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建触摸任务 OSTaskCreate((OS_TCB * )&TOUCHTASKTCB, (CPU_CHAR * )"touch task", (OS_TASK_PTR )touch_task, (void * )0, (OS_PRIO )TOUCHTASK_PRIO, (CPU_STK * )&TOUCHTASK_STK[0], (CPU_STK_SIZE)TOUCHTASK_STK_SIZE/10, (CPU_STK_SIZE)TOUCHTASK_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); #if BR_601USS_W //创建状态栏任务 OSTaskCreate((OS_TCB * )&STATUSBARTASKTCB, (CPU_CHAR * )"statusbar task", (OS_TASK_PTR )statusbar_task, (void * )0, (OS_PRIO )STATUSBARTASK_PRIO, (CPU_STK * )&STATUSBARTASK_STK[0], (CPU_STK_SIZE)STATUSBARTASK_STK_SIZE/10, (CPU_STK_SIZE)STATUSBARTASK_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); #endif OS_TaskSuspend((OS_TCB*)&HeatTCB,&err);//挂起Heat任务,当中断接收到指令恢复任务,处理完之后再挂起Heat任务,避免死循环占用CPU OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起开始任务 【开始任务不需要被挂起】 OS_CRITICAL_EXIT(); //退出临界区 }解释一下这个函数,
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值