嵌入式内核结构
setPSW()
二、任务
任务代码 μC/OS-Ⅱ中的任务 任务的状态转换
任务代码
形式参数类型-void *
允许用户应用程序传递任何类型的数据给任务
void YourTask (void *pdata) { for (;;) {
返回参数类型-void
实际上任务永不返回
删除任务-OSTaskDel( )
从OS_TCB缓冲池中得到一个 OS_TCB 若缓冲池中有空余的OS_TCB,就 将该OS_TCB初始化 在开中断的情况下初始化 (1) OS_TCB (2)
if (ptcb != (OS_TCB *)0) { OSTCBFreeList OS_EXIT_CRITICAL(); ptcb->OSTCBStkPtr ptcb->OSTCBPrio
空闲任务 OS_LOWEST_PRIO 统计任务 OS_LOWEST_PRIO-1
配置参数OS_TASK_STAT_EN置1
OS_CFG.H
系统保留的优先级号
0~ 3 OS_LOWEST_PRIO-3~ OS_LOWEST_PRIO
任务的状态转换
最多可达64个任务 任务的优先级号就是任务的编号(ID)
从就绪表中删除任务
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07])==0) OSRdyGrp &= ~OSMapTbl[prio >>3 ];
OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]; A= OSRdyTbl[prio >> 3] ; If(A == 0) OSRdyGrp &= ~OSMapTbl[prio >>3 ];
/* 用户代码 */
} } } } if(条件表达式) OSTaskDel( );
实质是使任务进入休眠态
/* 用户代码 */
μC/OS-Ⅱ中的任务
最多可达64个任务 任务的优先级号就是任务的编号(ID)
每个任务有不同的优先级 优先级越高,其优先级号越低
OS_CFG.H
系统任务
prio-任务的优先级 ptos-任务的栈顶指针 pbos-任务的栈底指针 id-任务标志符 stk_size-堆栈的容量 pext-TCB扩展块指针 opt -任务选择项
源代码分析
源代码分析
OS_ENTER_CRITICAL(); ptcb = OSTCBFreeList;
使任务进入就绪态
|= ptcb->OSTCBBitY;
(6)
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; (7)
四、就绪表
就绪表结构 使任务进入就绪态 从就绪表中删除任务 查找就绪态中优先级最高的任务 OS_TCB中的快速算法
就绪表结构
将8个任务分为一组,每位代表一组 每组中若有一个任务就绪,其相应的 位置1
= OS_NO_ERR;
为节省任务调度时间所设置的中间变量
= prio >> 3; = OSMapTbl[ptcb->OSTCBY]; = prio & 0x07; = OSMapTbl[ptcb->OSTCBX]; = (OS_EVENT *)0;
OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_SEM_EN
源代码分析
#if OS_TASK_DEL_EN ptcb->OSTCBDelReq #endif ptcb->OSTCBY ptcb->OSTCBBitY ptcb->OSTCBX ptcb->OSTCBBitX #if #endif #if #endif ptcb->OSTCBEventPtr
若OS_TASK_DEL_EN=1,则建立 任务删除强求变量
OS_CPU.H
关、开中断方式的配置-OS_CRITICAL_METHOD
置1,选择直接关、开中断 置2,通过堆栈恢复中断状态 置3,保存在局部变量中
嵌套时问题 不跟踪SP问题 多占用RAM
一、临界区的处理
1. disable
enable 2. PUSH DI PSW SP变化… POP PSW 3. Sr = getPSW() disable
.OSTCBId-任务的识别码 [暂没用]
OS_TCB的成员变量
.OSTCBNext .OSTCBPrev-OS_TCBs的双重 链接 .OSTCBEventPtr-指向事件控制块的指针 .OSTCBMsg-指向传给任务的消息的指针 .OSTCBDly -任务延时或超时限制变量
表示任务允许挂起的最多时钟节拍数 为0表示任务不延时或没有等待时间限制
OS_MAX_TASKS-应用系统最多任务数 uCOS_II.H OS_N_SYS_TASKS-系统任务数 OS_MAX_TASKS+OS_N_SYS_TASKS 存放于OSTCBTbl[ ]中 OS_CORE.H
OS_TCB的管理
uCOS_II.H
空任务控制块缓冲区-OSTCBFreeList
if (OSTCBList != (OS_TCB *)0) { OSTCBList->OSTCBPrev = ptcb; } OSTCBList = ptcb;
源代码分析
OSRdyGrp OS_EXIT_CRITICAL(); return (OS_NO_ERR); } else { OS_EXIT_CRITICAL(); return (OS_NO_MORE_TCB); } }
OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2)) ptcb->OSTCBMsg = (void *)0;
源代码分析
将初始化的OS_TCB插入到已 建任务的双向链表中
(4) = ptcb; = OSTCBList; = (OS_TCB *)0; (5)
OS_ENTER_CRITICAL(); OSTCBPrioTbl[prio] ptcb->OSTCBNext ptcb->OSTCBPrev
.OSTCBExtPtr -指向用户定义的任务控制块扩展 .OSTCBStkBottom-指向任务栈底的指针 .OSTCBStkSize-栈中可容纳的指针元数目 .OSTCBOpt-创建任务时的选择项
uCOS_II.H OS_TASK_OPT_STK_CHK-允许任务栈检验功能 OS_TASK_OPT_STK_CLR-任务栈清零 OS_TASK_OPT_SAVE_FP-任务做浮点运算
第三章 内核结构
本章主要内容
临界段代码的处理 uC/OS-Ⅱ中任务的数据结构 任务的调度 应用程序CPU的利用率 中断服务子程序ISR uC/OS-Ⅱ中时钟节拍的实现 uC/OS-Ⅱ的初始化 启动uC/OS-Ⅱ
一、临界区的处理
应用代码
{ OS_ENTER_CRITICAL(); /* µ C/OS-II 临界代码段 */ OS_EXIT_CRITICAL(); }
0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
OSRdyGrp
|=OSMapTbl[prio>>3];
OSRdyTbl[prio>>3]|=OSMapTbl[prio & 0x07];
从就绪表中删除任务
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07])==0) OSRdyGrp &= ~OSMapTbl[prio >>3 ];
若OS_TASK_CREATE_EN=1, 则插入额外的成员变量
= pext; = stk_size; = opt; = id;
ptcb->OSTCBStkBottom = pbos;
pext
stk_size pbos opt id #endif
= pext;
= stk_size; = pbos; = opt; = id;
每个任务有不同的优先级 优先级越高,其优先级号越低
OS_CFG.H
系统任务
空闲任务 OS_LOWEST_PRIO 统计任务 OS_LOWEST_PRIO-1
配置参数OS_TASK_STAT_EN置1
OS_CFG.H
系统保留的优先级号
0~ 3 OS_LOWEST_PRIO-3~ OS_LOWEST_PRIO
OSRdyTbl[n]中任意 一位置1,则 OSRdyGrp中第n位 置1
每位代表一个优先级 其长度为 OS_LOWEST_PRIO/8+1 若任务就绪,其相应的位 置1
就绪表结构
位操作 位或 | 位与 &
置位, 清位 取反 ~ 非操作 !
左移<< 右移>>
使任务进入就绪态
OSMapTbl[]= {0x01,
OSUnMapTbl[ ] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 };