uCosIII复习笔记(一)
1.UCOSIIII启动和初始化:OSInit()初始化,OSTaskCreate()创建任务,OSStart()启动UCOSIII
2.UCOSIII任务状态:休眠态、就绪态(等待cpu使用权)、运行态、等待态(运行中等待某个时间/事件,从而暂时让出cpu使用权)、中断服务态(中断发生时当前任务被挂起,cpu执行中断服务)
3.任务控制块:OS_TCB,结构体
创建:OS_TCB XXXTaskTCB;
初始化:创建任务时OSTaskCreate()中会调用OS_TaskInitTCB()
4.任务堆栈:任务切换时保存工作现场(内部寄存器值)
创建:#define XXX_STK_SIZE 512//堆栈大小
CPU_STK XXX_TASK_STK[XXX_STK_SIZE]; //任务堆栈
初始化:创建任务时OSTaskCreate()中会调用OS_TaskStkInit()
5.任务就绪表:
5.1优先级位映射表OSPrioTbl[] 记录哪个优先级下有任务就绪
CPU_DATAOSPrioTbl[OS_PRIO_TBL_SIZE],64优先级下OS_PRIO_TBL_SIZE=2
OS_PrioGetHighest()计算前导零的方法找到就绪的最高优先级任务
5.2就绪任务列表 OSRdyList[] 记录每个优先级下所有就绪的任务
同一优先级下,永远先运行HeadPtr所指向的任务
6.任务调度:
6.1可剥夺型调度:终止当前正在运行的任务转而去执行其他任务(UCOSIII为可剥夺型内核,高优先级任务准备就绪可剥夺低优先级任务的CPU使用权),包括任务级调度器OSSched()和中断级调度器OSIntExit()。
调度器上锁和解锁:代码执行过程中不想被打断,可以通过OSSchedLock()给调度器上锁,OSSchedUnLock()解锁。
常见的任务调度点:1.使用延时函数OSTimeDly()或者OSTimeDlyHMSM();2.创建任务;3.删除任务;4.任务通过调用OSTaskSuspend()将自身挂起;5.解挂某个挂起的任务;6.用户调用OSSched()。
6.2时间片轮转调度:某个优先级下有多个任务,每个执行指定的时间(时间片),然后轮到下一个任务。一个任务不想运行时也可放弃时间片。
时间片轮转调度函数OS_SchedRoundRobinCfg()
7.任务切换:UCOSIII切换到另一个任务时,保存当前任务现场(寄存器值)到堆栈中,恢复新的现场并执行新的任务。
任务级切换OSCtxSw() (在任务级调度OSSched()中被调用)
中断级切换OSIntCtxSw()(在中断级调度OSIntExit()中被调用)