OSTaskCreate()函数分析
在uc/os系统中,对于任务的描述和管理是通过任务控制快-OS_TCB来实现的,OS_TCB本质上是一些驻留在在RAM中的结构体。由以下内容构成
| typedef struct os_tcb { |
| OS_STK *OSTCBStkPtr;//OS_STK定义为32位无符号数据,该行定义当前任务所分配的堆栈的栈顶指针(该栈顶指针是指任务切换后自动保存的r0~r15等一系列数据后的堆栈指针),对于堆栈,uc/os可以对每一个任务分配一个任意大小的堆栈。 |
|
|
| #if OS_TASK_CREATE_EXT_EN//如果使能勒扩展任务控制块,则定义以下数据 |
| void *OSTCBExtPtr;//扩展任务块指针,扩展控制块的引入,使得可以在不改变uc/os源代码的前提下,加入扩展功能,此外如果需要使用该功能,则需在OS_CFG.H(uc/os配置文件)中将OS_TASK_CREATE_EXT_EN置一,允许建立任务函数的扩展 |
| OS_STK *OSTCBStkBottom;指向任务堆栈的栈底(就是数据最后进入的地址)如果堆栈增长方式是递增的话,那么它指向堆栈的最高地址,反之指向最低地址,改参数在使用OSTaskStkChk()函数是需要使用 |
| INT32U OSTCBStkSize;//该参数是任务堆栈大小,对于堆栈大小是指栈中所能容纳的指针数目,而不是字节数目。假设堆栈容量是1000,如果地址宽度是32位的,那么堆栈包含4000字节,但是其容量是1000 |
| INT16U OSTCBOpt;//选择项,支持三个选择,OS_TASK_OPT_STK_CHK该参数用于告知TaskCreateExt()函数在建立任务时对堆栈进行检查(uc/os不会自动进行堆栈检查,必须使用改选项来设定),OS_TASK_OPT_STK_CLR该参数设定,则在任务建立的过程中将任务栈清零(只有在需要使用栈检验功能时才将栈清零)OS_TASK_OPT_SAVE_FP该参数是通知任务需要做浮点数运算 |
| INT16U OSTCBId;用于存储任务的识别码,现在还没使用,感觉他会发展风linux中的PID。 |
| #endif |
|
|
| struct os_tcb *OSTCBNext; |
| struct os_tcb *OSTCBPrev;//任务控制块的组成双向链表是所需的变量,分别指向该任务的后一个任务控制快和前一个任务控制块。 |
|
|
| #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN |
| OS_EVENT *OSTCBEventPtr;//如果定义了队列,消息邮箱,信号量系统资源,则使用该指针指向事件控制块。 |
| #endif |
|
|
| #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN |
| void *OSTCBMsg;//如果定义队列和邮箱,则指针指向所要传递的消息 |
| #endif |
|
|
| INT16U OSTCBDly;//任务延时的时间,或者等待某事件发生的超时限制,在时钟没每生一次中断的时候,时钟节拍函数OSTimeTick()将通过任务控制块的链表访问该变量并将其减一从而刷新该变量 |
| INT8U OSTCBStat;//该变量用于描述任务的状态 |
| INT8U OSTCBPrio;//任务优先级 |
|
|
| ① INT8U OSTCBX;//表示任务优先级在就绪表中的X轴的位置,相当说明该优先级是某一组中的哪一个位元素。 |
| INT8U OSTCBY;//表示任务优先级在就绪表中的Y轴的位置,相当说明该优先级是处于第几个组元素 |
| INT8U OSTCBBitX;//说明该优先级对应的OSTCBTBL[prio&0x7]中元素的赋值 |
| INT8U OSTCBBitY;//说明该优先级对应的OSRdyGrp的元素,将该元素与OSRdyGrp相于就获得当前的OSRdyGrp所对应的值 |
|
|
| #if OS_TASK_DEL_EN |
| BOOLEAN OSTCBDelReq;该参数表明该任务是否需要删除。只有在OS_FLAG_EN置为一是才会出现在OS_TCB中 |
| #endif |
| } OS_TCB; |
Ø 对于OS_TCB的管理,uc/os采用了两个链表进行管理,在任务初始化时所有的空闲OS_TCB被连接成单向的空任务链表。另外当任务建立时,空任务控制块指针OSTCBFreeList指向的控制块分配给该任务,当有多个任务建立时,所申请的任务控制块构成一个双向的任务控制块链表
Ø 对于任务就绪表的说明:在uc/os中最多支持64个任务,并为每一个任务指派一个优先级,对于任务的就绪查询,其使用任务就绪表。

本文详细分析了uc/os操作系统中任务创建的过程,包括任务控制块的管理、任务就绪表的结构以及OSTaskCreate()函数的工作原理。OSTaskCreate()通过申请任务控制块,初始化任务堆栈,并更新任务就绪表来创建新任务。
最低0.47元/天 解锁文章
4075

被折叠的 条评论
为什么被折叠?



