目录
入门知识:
裸机与FreeRTOS:
裸机:
RTOS系统:
基础知识:
任务调度:
分类:
时间片调度:
任务状态(四种):
四种状态图片:
入门知识:
裸机与FreeRTOS:
裸机:
又称前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应程序
RTOS系统:
全称为:Real Time OS,就是实时操作系统,强调的是:实时性
堆栈:存放断点的数据,以便继续执行
(1)中断是可以打断任意任务的
(2)任务可以同等优先级
最后一点:软件优先级是没有任何限制的,硬件优先级是有限制的,如stm32为32位,硬件优先级为0到31(ISR中断请求寄存器位数)
基础知识:
任务调度:
使用相关调度算法来决定当前需要执行的哪个任务
分类:
- 抢占式调度(Preemptive Scheduling):
- 这是FreeRTOS默认的调度方式。在这种方式下,调度器始终运行优先级最高且可运行的RTOS任务。如果某个更高优先级的任务变为就绪状态(例如,由于等待的事件发生或延时结束),则当前运行的任务将被抢占,高优先级任务将立即获得CPU控制权并开始执行。这种调度方式确保了系统对紧急任务的快速响应。
1.数值越大优先级就越高
2.高优先级任务不停止,低优先级任务就无法执行
3.被抢占的任务将会进入就储态
- 协作式调度(Cooperative Scheduling):
- 协作式调度不是FreeRTOS的默认调度方式,但在某些情况下可以使用。在这种方式下,一旦一个任务开始执行,它将持续运行,直到它主动放弃CPU控制权(例如,通过调用特定的函数如
taskYIELD()
或vTaskDelay()
,或者进入阻塞状态等待事件或资源)。协作式调度简化了任务间共享资源的管理,但要求每个任务都必须定期放弃CPU控制权,否则可能导致系统响应性能下降。
- 协作式调度不是FreeRTOS的默认调度方式,但在某些情况下可以使用。在这种方式下,一旦一个任务开始执行,它将持续运行,直到它主动放弃CPU控制权(例如,通过调用特定的函数如
- 时间片轮转调度(Round-Robin Scheduling):
- 对于具有相同优先级的任务,FreeRTOS采用时间片轮转调度。这意味着这些任务将轮流获得CPU时间片,每个时间片结束后,任务将被挂起,下一个同优先级的任务将获得执行机会。时间片的大小可以通过配置FreeRTOS的tick中断频率和调度器的时间片长度来设置。
时间片调度:
同等优先级任务轮流地享有相同CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期
在FreeRTOS中,时间片调度(Time-Slicing)是一种用于管理具有相同优先级的任务执行顺序的机制。当多个任务具有相同的优先级时,它们会轮流获得CPU的使用权,每个任务执行一个预设的时间片长度后,就会让出CPU给下一个同优先级的任务,以此循环。这种调度方式有助于确保系统公平地分配CPU资源给所有同优先级的任务。
时间片调度的关键要素
- 时间片长度:
- 时间片长度是指一个任务在不被抢占或中断的情况下能够连续执行的最长时间。在FreeRTOS中,时间片长度通常与系统的时钟节拍(Tick Rate)相关,一个时间片就等于一个SysTick中断周期。
- 时间片长度可以通过配置FreeRTOS的
configTICK_RATE_HZ
宏来设置。例如,如果configTICK_RATE_HZ
被设置为1000,那么每个时间片的长度就是1毫秒(ms)。- 任务优先级:
- 在FreeRTOS中,任务可以具有不同的优先级。时间片调度主要适用于具有相同优先级的任务。
- 当存在多个同优先级的任务时,它们会按照时间片轮转的方式获得CPU使用权。
- 抢占式调度与合作式调度的结合:
- FreeRTOS支持抢占式调度和合作式调度。在时间片调度中,抢占式调度仍然有效,即如果更高优先级的任务变为就绪状态,它会立即抢占当前正在执行的任务的CPU使用权。
- 而在同优先级的任务之间,则采用时间片轮转的方式进行调度。
1.同等优先级任务,轮流执行:时间片流转
2.一个时间片大小,取决为滴答定时器中断周期
3.注意没有用完时间片不会再使用,下次任务Task3得到执行还是按照一个时间片的时钟节拍运行
任务状态(四种):
- 运行状态(Running):
- 当任务正在占用CPU资源并实际执行时,该任务处于运行状态。在单核处理器系统中,同一时间只能有一个任务处于运行状态。
- 运行状态的任务可以因为各种原因(如时间片结束、更高优先级任务就绪、任务主动让出CPU等)而转换为其他状态。
- 就绪状态(Ready):
- 任务已经准备好执行,但因为某些原因(如当前CPU正在被其他任务占用或更高优先级的任务正在运行)而暂时未获得CPU使用权。
- 就绪状态的任务会排入相应的就绪列表中,等待调度器根据优先级或时间片策略进行调度。
- 当任务从阻塞状态或挂起状态恢复时,也会进入就绪状态。
- 阻塞状态(Blocked):
- 任务因等待某个事件(如信号量、消息队列、延时等)而无法继续执行时,会进入阻塞状态。
- 阻塞状态的任务会排入相应的阻塞列表中,直到等待的事件发生或超时后才会被唤醒并转换为就绪状态。
- 阻塞是任务调度中常见的一种状态转换,用于实现任务间的同步和通信。
- 挂起状态(Suspended):
- 任务被明确挂起后,将不再参与调度,即不会获得CPU使用权。
- 挂起状态的任务需要通过特定的恢复函数(如vTaskResume())来唤醒并重新加入就绪列表。
- 挂起状态通常用于临时停止任务执行,以便进行调试、更新或重新配置等操作