OS_TCBInit()分析

INT8U         OS_TCBInit              (INT8U            prio,
                                       OS_STK          *ptos,
                                       OS_STK          *pbos,
                                       INT16U           id,
                                       INT32U           stk_size,
                                       void            *pext,
                                       INT16U           opt);

整个函数流程

1、检查空闲任务块指针,假如不为0,表示该空闲任务可用;否则关闭中断,返回错误代码。以下皆为空闲任务块可用。

2、赋值新的空闲任务块指针,为下一次(或其他)任务控制块申请做准备,然后开中断,涉及到关键数据,都要在临界段中执行,防止被其他任务中断导致系统错误

3、赋值该任务的栈顶指针、任务优先级、任务状态、任务挂起状态、任务延时时间

4、假如是扩展创建任务,需要赋值

5、填充整个tcb结构体,默认值等待后续补齐

6、就绪组和就绪表的计算。当系统优先级最大为63的时候,分为8组,每组8个任务;bitmask--假如任务为0,bit0位需要置位,也就是1<<prio;当系统优先级最大为256,需要分为16个组,每组16个任务

7、清空事件有关标志(假如定义了的话)

8、初始化有关任务性能分析方面的变量

9、将本任务启动地址添加至OSTCBPrioTbl[prio]中位置

10、完善就绪任务链表。OSTCBList的配置过程。

OSTCBList:指向TCB链表中就绪任务控制块TCB的最后一个(就是刚就绪的任务)。

OSTCBFreeList:指向TCB链表中空闲的任务控制块TCB的第一个。

OSTCBList是一个双向链表,一开始指向0,当有任务建立时,将新任务的tcb指向OSTCBList,若OSTCBList不是指向0(说明在这之前已有任务建立),则OSTCBList->prev再指向tcb,然后再将OSTCBList指向tcb。这样做的目的是将所建立的新的tcb形成一个双向链表,新建立的任务总是在这张表的表头,并且OSTCBList也指向这个表头

11、置位就绪组和就绪表,任务计数器+1,准备运行任务。


注意:关系到可能发生多任务竞争的变量,必须关中断进行操作




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值