最近在听原子的ucosIII的网课,之前写了两篇,后面他主要是在讲api函数,单做一个博客有点少,就把知识点都放到一起了。
一、任务管理
操作系统最重要的一个就是任务管理,操作系统通过切换cpu处理的任务,来达到资源利用率最大的效果。
(1)在ucos中使用任务前,先初始化任务,然后再创建任务。
(2)任务分休眠态,就绪态,运行态,等待态,中断服务态。
(此处挂一个原子的任务状态转换图)当任务遇到这些函数时会发生对应的状态转换。
(3)一个任务,需要任务堆栈,任务控制块,任务函数。
任务控制块:是一个结构体,作用是存储任务的状态。
任务堆栈:是一个数组,在任务进行切换是用来保存当前任务的值,以便于复原现场。
先讲下任务就绪表:
就绪表分两种:
优先级位映射表:反应层面是在不同任务优先级间,表明哪个优先级有任务已经就绪了。
就绪任务表:因为ucos有时间片的特质,所以该表反映的是一个任务优先级下,任务就绪的顺序。一个任务就绪完了,就回去排队。
(4)因为ucos是可剥夺任务的内核,所以在每个时钟节拍结束后有中断去检查当前优先级,如果有比当前任务优先级更高的,直接去执行更高的。
这里涉及了任务调度器。当执行到任务调度器时进行一次任务调度,查看当前就绪的任务最高优先级是哪个并执行。
有个任务调度器加锁的东西,字面意思,加上锁,调度器无法改变任务执行情况。
时间片轮转也有个调度器,当当前任务时间片运行完,检查该调度器下是否还有其他就绪任务并执行下一个就绪的任务。
二、ok任务是个什么东西已经说完了,接下来讲讲ucos的内部任务
1、空闲任务:当没有其他任务运行时,cpu便会运行空闲任务。空闲任务在ucos中无需收容创建,初始化时会自动创建。注:空闲任务的优先级最低。
2、时钟节拍任务:任务是跟踪正在延时的任务,以及在正定时间内等待某个内核对象的任务。这个优先级最好高一点,一般是1.
注:内部任务无需手动创建,以上两个任务是必需要有的
3、统计任务:在 UCOSIII 中统计任务可用来统计 CPU 的使用率、各个任务的 CPU 使用率和各任务的堆栈使用情况,默认情况下统计任务是不会创建的,如果要使能统计任务的话需要将宏OS_CFG_STAT_TASK_EN 置 1。统 计 任 务 的 优 先 级 通 过 宏
OS_CFG_STAT_TASK_PRIO 设 置 , ALIENTEK 将 统 计 任 务 的 优 先 级 设 置 为
OS_CFG_PRIO_MAX-2,也就是倒数第二。
4、定时任务:UCOSIII 提供软件定时器功能,定时任务是可选的,将宏 OS_CFG_TMR_EN 设置为 1 就会使能定时任务。
5、中断服务管理任务:在 UCOS 中可以通过关闭中断和任务调度器上锁两种方式来管理临界段代码(,如果采用后一种,即调度器上锁的方式来管理临界段代码的话,那么在中断服务函数中调用的“post”类函数就不允许操作诸如任务就绪表、等待表等系统内部数据结构。
当 ISR(中断服务函数)调用 UCOSIII 提供的“post”函数时,要发送的数据和发送的目的地
都会存入一个特别的缓冲队列中,当所有嵌套的 ISR 都执行完成以后 UCOSIII 会做任务切换,运行中断服务管理任务,该任务会把缓存队列中存放的信息重发给相应的任务。这样做的好处就是可以减少中断关闭的时间,否则,在 ISR 中还需要把任务从等待列表中删除,并把任务放入就绪表,以及做一些其他的耗时操作。
主要目的就是会加快处理速度
6、钩子函数:这个函数的作用就是对以上的内部任务进行功能的扩展,每跑一次内部任务,对应的钩子函数就会被调用一次
——————————参考资源——————正点原子《STM32F1 UCOS开发手册_V2.0》
UCOSIII学习总结(上)
最新推荐文章于 2020-12-21 15:35:16 发布