很多嵌入式开发者通常是从裸机编程开始,然后逐渐过渡到使用RTOS。本文旨在向大家分享有关RTOS调度的基本原理。
如果你不太理解这些概念,那是很正常的。一下子就完全理解了反而有些不正常。
什么是裸机,什么是多任务?
对于初学者来说,最初接触的可能就是临界段、调度、信号量、互斥锁等这些概念,这可能会让你感到困惑。
大多数人可能都是从裸机阶段开始的。裸机系统通常也被称为单任务系统、轮询系统或前后台系统。
这些概念相信大家都能理解,轮询就是在一个大的while循环中执行任务。前后台系统指的是在执行while循环时,会有中断(前台)响应的系统。
int main(void){ /* 初始化 */ while(1) { /* 循环处理多项事情 */ }}
那么,什么是多任务呢?
当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务。
因为任务调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。
—来自百度百科
初学者可以理解为:有类似上面的多个轮询系统。
如下代码,将大while中的多项事情,分为几个事情,分别处理。
void Task1(void)
{
/* 初始化 */
while(1)
{
/* 处理事情1 */
}
}
void Task2(void)
{
/* 初始化 */
while(1)
{
/* 处理事情2 */
}
}
这里就要牵涉到各个任务之间的切换:任务调度。
任务调度
说任务调度之前,先说一插曲:
我开始学RTOS时,觉得CPU这么短时间(1ms)在各个任务之间来回切换,而且切换还需要执行那么多代码,这样CPU还能执行多少代码啊?
其实,我当时太低估了处理器的能力。
拿STM32F103跑72M来说,1ms时间可以执行的代码有多少,你们心里有概念吗?
沿着这个问题,大家进一步思考其实都能明白,区区那切换(任务调度)的几行代码对于CPU速度来说,这个处理时间可以忽略不计(当然,这是相对高速处理而言。如果低频的处理器,这个时间可能相对较长)。
1.任务调度
任务调度可以分抢占调****度和轮询调度。
在RTOS中,为了使任务得到实时响应,一般使用抢占调度方式,我们拿UCOS为例:
你会发现只程序执行过程中,如果有高优先级任务带来,高优先级任务就会打断低优先级任务。
直到高优先级任务执行完,低优先级任务才得到相应。
这里有人可能会问:如果高优先级一直或长时间执行可以吗?
答案是:NO
这里就关系到任务优先级分配,以及任务设计问题。
一般来说,高优先级任务是在等待一个事件的触发,执行一件紧急,而不会太耗时的事情。
太耗时任务一般留给低优先级任务,在系统不忙时慢慢处理。
2.调度过程
我们设置系统滴答为1ms时间,那么系统就会间隔1ms检查一次就绪任务中优先级更高的任务。
这个1ms滴答是由定时器中断产生,一般像在STM32由内核滴答定时器产生。
如上图,他在(2)的位置就检测到有更高优先级任务(7)就绪,此时就会跳转到任务(7)去执行。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !