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()中被调用)


猜你喜欢

转载自blog.csdn.net/e2dward/article/details/79933835