uc/os中OSTaskCreate()函数分析

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

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.Huc/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个任务,并为每一个任务指派一个优先级,对于任务的就绪查询,其使用任务就绪表。

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值