记了几篇笔记后发现,基本就是在抄书,而且由于本人绘图能力有限,也无法贴上图表去说明,可能导致后来的读者完全摸不清头脑,所以再次声明,本人只是在给自己做知识点笔记,相关图标和介绍请阅读书籍《嵌入式实时操作系统us/os-iii》
任务管理
任务创建
- 任务需要创建,当创建任务时,必须制定该任务使用的任务控制块的地址,任务的优先级,任务堆栈所在的RAM区以及一些其他参数。具体在
OS_Create();
函数中。 - ucos-iii最多会创建五个系统任务:空闲任务,时钟节拍任务,统计任务,中断服务管理任务和定时器任务。空闲任务和时钟节拍任务是必须要创建的任务。
`void OSTaskCreate (OS_TCB *p_tcb,
CPU_CHAR *p_name,
OS_TASK_PTR p_task,
void *p_arg,
OS_PRIO prio,
CPU_STK *p_stk_base,
CPU_STK_SIZE stk_limit,
CPU_STK_SIZE stk_size,
OS_MSG_QTY q_size,
OS_TICK time_quanta,
void *p_ext,
OS_OPT opt,
OS_ERR *p_err)
- 多任务管理其实就是在多个任务间调度和切换CPU使用权的过程。
- 在任务的相继执行过程中,CPU的使用权在任务间不断切换,多任务管理系统看起来就像有多个CPU在执行多个任务,实际上这也是使CPU得到最大化利用。
- 任务的类型有两种:运行至完成型 、 无限循环型,嵌入式系统中的任务大都是无限循环型。
- 运行至完成型:必须通过
OSTaskDel();
函数将自己删除,由于运行的 时候创建和删除任务会带来一定的开销,因此,在嵌入式系统中,最好不要有很多这样的任务。
- 任务可以创建其他任务,也可以挂起和恢复其他的任务,向其他任务发信号量和消息,与其他任务共享资源等。
- 最为嵌入式操作系统的一个通用规则,不要使用递归调用。
任务状态:可剥夺!可剥夺!可剥夺!重要的事情说三遍!
用户角度看,任务的状态共有五种:休眠态、就绪态、运行态、等待态、中断服务态;
休眠态:指任务已存在寄存器中,但不受系统的管理,可以通过OSTaskCreate();创建任务接收系统的管理,当不需要这个任务时,可以调用OSTaskCreate();删除任务,删除实际上是使该代码无法获得CPU的使用权。
就绪态:任务准备运行时,就进入了就绪态,任务就绪表根据任务的优先级顺序对任务进行排序。
运行态:CPU会调用当前就绪态中优先级最高的任务,使其获得CPU的使用权,但是此时如果有更高优先级的任务就绪,CPU会立即收回任务,调用更高优先级的任务,使其获得CPU的使用权。
等待态:当用户调用使其进入等待某个事件的函数时,任务就会进入等待态,并自动放入等代表,直到其等待的事件发生,就会自动进入就绪态,并放入就绪表,当ucos-iii系统服务会判断这个就绪任务的优先级是否最高,如果是,CPU会剥夺当前的任务的CPU使用权,而刚就绪的任务会获得CPU的使用权。
中断服务态:CPU允许中断,当中断发生,由于中断服务程序的优先级最高,所以CPU会保存当前正在运行的任务的状态,然后进入中断服务程序,中断服务程序推荐写的尽量的少,最好只是发送某个消息、信号,某个任务在消息队列中收到消息后,任务会进入就绪态,此时中断服务程序结束,CPU查看任务就绪表中是否有更高优先级任务就绪,如果有,更高优先级的任务会进入到运行态,CPU会进入到更高优先级任务运行,如果就绪表中没有更高优先级的任务,CPU会恢复到之前运行的任务的状态,恢复现场,回到之前运行的任务继续运行。
任务如果调用了OSTimaeDly();或者OSTimeDlyHMSM();,任务可以让自己延时一段时间,此时任务会进入就绪态,CPU会立即运行下一个更高优先级的任务,不会浪费时间在延时上,当延时结束,CPU判断该任务是否是最高优先级的任务,如果是就继续运行,如果不是就会进入就绪态,等待运行。OSTimeDlyResume();的调用也会结束延时状态。
任务既可以被自身挂起,也可以被其他任务挂起。
任务控制块
- uC/OS-III是如何生成任务控制块的实体的呢?答案很简单,uC/OS-II是以结构体数组的形式生成了任务控制块的实体。具体在os.h的
struct os_tcb {}
结构体中,各个参数的意思我就不一一说明了,感兴趣的可以自己看看。