一、三种任务调度方式
- 优先级抢占式调度
- 每个任务都赋予了一个优先级
- 每个任务都可以存在于一个或多个状态
- 在任何时候都只有一个任务可以处于运行状态
- 调度器总是在所有处于就绪态的任务中选择具有最高优先级的任务来执行
- 选择任务优先级
这种任务调度方式是依据每个任务的运行周期来做决定的,简单来讲,就是任务运行频率越高,优先级越高,受调度运行的次数就越多。但是运行时间不定以及并非所有任务都具有周期性,会让这种方式的全面计算变得复杂。 - 协作式调度
纯粹的协作式调度器只能在运行态任务进入阻塞态或是运行态任务显式调用taskYIELD()时,才会进行上下文切换。任务永远不会被抢占,而具有相同优先级的任务也不会自动共享处理器时间,协作式调度的这种工作方式虽然比较简单,但是可能会导致系统响应不够快
二、队列管理
FreeRTOS中各个单独任务的功能实现很可能需要任务之间相互通信以提供有用的系统功能。而在FreeRTOS中所有的通信和同步机制都是基于队列实现的。
-
什么是队列
队列是数据结构中的一个概念,其最大的特性为先进先出(FIFO:First In First Out)
-
如何创建一个队列
xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength,
unsigned portBASE_TYPE uxItemSize );
-
什么是队列阻塞
读队列阻塞:读队列阻塞并不是指在读队列时遇到问题,阻塞住了。而是队列任务主动进入阻塞态以等待队列数据有效,一旦队列中数据单元有效,或者即使队列数据无效但等待时间超过100毫秒,此任务将会接触阻塞。
写队列阻塞:写队列阻塞是当被写队列已满时,任务进入阻塞态以等待队列空间有效的最长时间
-
往队列发送和从队列接收时,任务优先级会有怎样的影响
任务优先级会在阻塞情况下起作用:
在读阻塞情况下,如果有多个任务同时读阻塞,一旦队列数据有效,则最高优先级任务解除阻塞,来读数据;如果所有阻塞的任务优先级相同,则数据有效时,等待时间最长的任务解除阻塞来读数据。在写阻塞情况下,处理流程和读阻塞情况下相同
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)