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,准备运行任务。
注意:关系到可能发生多任务竞争的变量,必须关中断进行操作