- RQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先 级最高的。
- 高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类 任务。
- 低优先级的时间片调度任务:比如 emWin 的界面显示,LED 数码管的显示等不需要实时执行的都可 以归为这一类任务。实际应用中用户不必拘泥于将这些任务都设置为优先级 1 的同优先级任务,可以 设置多个优先级,只需注意这类任务不需要高实时性。
- 空闲任务:空闲任务是系统任务。
- 特别注意: IRQ 任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数即可) , 只有这样, 高优先级任务才会释放 CPU 的使用权, ,从而低优先级任务才有机会得到执行。
对于 STM32F103 来说,中断优先级的数值越小,优先级越高。
而 FreeRTOS 的任务优先级是,任务优先级数值越小,任务优先级越低。
二、
1. 中断服务函数:
中断服务函数是一种需要特别注意的上下文环境,它运行在非任务的执行环境下(一
般为芯片的一种特殊运行模式(也被称作特权模式)),在这个上下文环境中不能使用挂
起当前任务的操作,不允许调用任何会阻塞运行的 API 函数接口。另外需要注意的是,中
断服务程序最好保持精简短小,快进快出,一般在中断服务函数中只做标记事件的发生,
然后通知任务,让对应任务去执行相关处理,因为中断服务函数的优先级高于任何优先级
的任务,如果中断处理时间过长,将会导致整个系统的任务无法正常运行。所以在设计的
时候必须考虑中断的频率、中断的处理时间等重要因素,以便配合对应中断处理任务的工
作。
2. 任务:
任务看似没有什么限制程序执行的因素,似乎所有的操作都可以执行。但是做为一个
优先级明确的实时系统,如果一个任务中的程序出现了死循环操作(此处的死循环是指没
有阻塞机制的任务循环体),那么比这个任务优先级低的任务都将无法执行,当然也包括
了空闲任务,因为死循环的时候,任务不会主动让出 CPU,低优先级的任务是不可能得到
CPU 的使用权的,而高优先级的任务就可以抢占 CPU。这个情况在实时操作系统中是必须
注意的一点,所以在任务中不允许出现死循环。如果一个任务只有就绪态而无阻塞态,势
必会影响到其他低优先级任务的执行,所以在进行任务设计时,就应该保证任务在不活跃
的时候,任务可以进入阻塞态以交出 CPU 使用权,这就需要我们自己明确知道什么情况下
让任务进入阻塞态,保证低优先级任务可以正常运行。在实际设计中,一般会将紧急的处
理事件的任务优先级设置得高一些。
3. 空闲任务:
空闲任务(idle 任务)是 FreeRTOS 系统中没有其他工作进行时自动进入的系统任务。
因为处理器总是需要代码来执行——所以至少要有一个任务处于运行态。 FreeRTOS 为了保
证这一点,当调用 vTaskStartScheduler()时, 调度器会自动创建一个空闲任务,空闲任务是
一个非常短小的循环。 用户可以通过空闲任务钩子方式,在空闲任务上钩入自己的功能函
数。通常这个空闲任务钩子能够完成一些额外的特殊功能,例如系统运行状态的指示,系
统省电模式等。除了空闲任务钩子, FreeRTOS 系统还把空闲任务用于一些其他的功能,比
如当系统删除一个任务或一个动态任务运行结束时, 在执行删除任务的时候,并不会释放
任务的内存空间,只会将任务添加到结束列表中, 真正的系统资源回收工作在空闲任务完
成,空闲任务是唯一一个不允许出现阻塞情况的任务,因为 FreeRTOS 需要保证系统永远
都有一个可运行的任务。
对于空闲任务钩子上挂接的空闲钩子函数,它应该满足以下的条件:
永远不会挂起空闲任务;
不应该陷入死循环,需要留出部分时间用于系统处理系统资源回收。
4. 任务的执行时间:
任务的执行时间一般是指两个方面,一是任务从开始到结束的时间,二是任务的周期。
在系统设计的时候这两个时间候我们都需要考虑,例如,对于事件 A 对应的服务任务
Ta,系统要求的实时响应指标是 10ms,而 Ta 的最大运行时间是 1ms,那么 10ms 就是任务
Ta 的周期了, 1ms 则是任务的运行时间,简单来说任务 Ta 在 10ms 内完成对事件 A 的响应
即可。此时,系统中还存在着以 50ms 为周期的另一任务 Tb,它每次运行的最大时间长度
是 100us。在这种情况下,即使把任务 Tb 的优先级抬到比 Ta 更高的位置,对系统的实时
性指标也没什么影响,因为即使在 Ta 的运行过程中, Tb 抢占了 Ta 的资源,等到 Tb 执行
完毕,消耗的时间也只不过是 100us,还是在事件 A 规定的响应时间内(10ms), Ta 能够安
全完成对事件 A 的响应。但是假如系统中还存在任务 Tc,其运行时间为 20ms,假如将 Tc
的优先级设置比 Ta 更高,那么在 Ta 运行的时候,突然间被 Tc 打断,等到 Tc 执行完毕,
那 Ta 已经错过对事件 A(10ms)的响应了,这是不允许的。所以在我们设计的时候,必
须考虑任务的时间,一般来说处理时间更短的任务优先级应设置更高一些。
三、CPU 利用率的基本概念
CPU 使用率其实就是系统运行的程序占用的 CPU 资源,表示机器在某段时间程序运行的情况,如果这段时间中,程序一直在占用 CPU 的使用权,那么可以人为 CPU 的利用率是 100%。 CPU 的利用率越高,说明机器在这个时间上运行了很多程序,反之较少。利用率的高低与 CPU 强弱有直接关系,就像一段一模一样的程序,如果使用运算速度很慢的CPU,它可能要运行 1000ms,而使用很运算速度很快的 CPU 可能只需要 10ms,那么在1000ms 这段时间中,前者的 CPU 利用率就是 100%,而后者的 CPU 利用率只有 1%,因为1000ms 内前者都在使用 CPU 做运算,而后者只使用 10ms 的时间做运算,剩下的时间CPU 可以做其他事情。
FreeRTOS 是多任务操作系统,对 CPU 都是分时使用的:比如 A 任务占用 10ms,然后 B 任务占用 30ms,然后空闲 60ms,再又是 A任务占 10ms, B 任务占 30ms,空闲 60ms;
如果在一段时间内都是如此,那么这段时间内的利用率为 40%,因为整个系统中只有 40%的时间是 CPU 处理数据的时间。
CPU 利用率的作用
一个系统设计的好坏,可以使用 CPU 使用率来衡量,一个好的系统必然是能完美响应
急需的处理,并且系统的资源不会过于浪费(性价比高)。举个例子,假设一个系统的
CPU 利用率经常在 90%~100%徘徊,那么系统就很少有空闲的时候,这时候突然有一些事
情急需 CPU 的处理,但是此时 CPU 都很可能被其他任务在占用了,那么这个紧急事件就
有可能无法被相应,即使能被相应,那么占用 CPU 的任务又处于等待状态,这种系统就是
不够完美的,因为资源处理得太过于紧迫;反过来,假如 CPU 的利用率在 1%以下,那么
我们就可以认为这种产品的资源过于浪费,搞一个那么好的 CPU 去干着没啥意义的活(大
部分时间处于空闲状态),使用,作为产品的设计,既不能让资源过于浪费,也不能让资
源过于紧迫,这种设计才是完美的,在需要的时候能及时处理完突发事件,而且资源也不
会过剩,性价比更高。