嵌软八股大全11 - FreeRTOS 相关问题汇总

1、什么是 FreeRTOS?

FreeRTOS 是轻量级的实时操作系统,广泛应用于嵌入式系统中

2、RTOS 最重要最核心的东西是什么?

  1. 实时性
  2. 确定性

3、任务调度?

根据 configUSE_PREEMPTIONconfigUSE_TIME_SLICING 两个宏定义决定了 FreeRTOS 有 3 种不同的任务调度策略

  1. 协作式调度
  2. 不使用时间片轮询的抢占式调度
  3. 时间片轮询的抢占式调度(最常用的方法)

对于使用时间片轮询的抢占式调度方法,FreeRTOS 的调度器将始终保持系统中就绪态的最高优先级任务得到执行(也即高优先级的任务可以抢占低优先级的任务得到执行),如果多个任务优先级一致,还会通过时间片在优先级一致的多个任务中轮流执行

以上为关于任务调度基本的理论知识,下面我简单介绍下 FreeRTOS 任务调度的底层原理,主要有这样几个问题:

  1. 什么时候切换任务?
  2. 怎么切换任务?

关于第一个问题:对于基于时间片轮询的抢占式调度,当出现以下几种情况时会产生任务的切换

  1. 任务的状态发生变化,比如任务调用阻塞延时函数、延时函数到期、任务结束或退出、任务创建和删除等
  2. 更高优先级任务就绪(抢占优先级)
  3. FreeRTOS 心跳,心跳中一般对阻塞延时计数,对同等优先级的任务时间片轮询

关于第二个问题:对于工作在 Cortex-M4 内核上的 FreeRTOS 来说,任务切换是在可挂起中断服务函数 PendSV 中执行的,这个函数一般在整个NVIC中抢占优先级设置为最低,防止影响到其他高优先级中断的处理,这个函数由汇编编写,主要做了这样几个工作:

  1. 保存当前执行任务的上下文
  2. 跳转到调度函数中寻找下一个要执行的任务
  3. 恢复新任务的上下文
  4. 从中断异常退出

alt

4、内存管理?

对于 FreeRTOS 的内存管理,其提供了 5 种动态内存分配的机制,包括 heap_1 ~ heap_5,每一种都有其自己的特点和使用场景,但具体我不清楚,一般我直接使用 heap_4

5、中断管理?

在 FreeRTOS 支持中断优先级的管理,在部分中断函数中还可以调用中断安全版本的 API 函数,但是不是NVIC 中所有的中断都能够被 FreeRTOS 管理

FreeRTOS 能管理的中断是依靠 中断的最低优先级数值(LOWEST_INTERRUPT_PRIORITY) 和 可管理的最高优先级(MAX_SYSCALL_INTERRUPT_PRIORITY) 两个宏决定的,对于 4 位抢占优先级的 NVIC 来说,最低优先级为 15 ,如果设置可管理的最高优先级为 5 那么优先级号为 15-5 的中断都可以被 FreeRTOS 所管理

同时 FreeRTOS 也提供了临界区函数,可以在临界区中屏蔽掉可管理的中断

6、时间管理?

FreeRTOS 需要为其提供一个固定的心跳,其通过这个心跳来管理时间,实现 软件定时器,时间片轮询 和 阻塞延时函数 等功能

7、什么是优先级反转?

一个低优先级任务持有某个共享资源的锁,此时一个高优先级的任务尝试获取共享资源,但由于共享资源被低优先级任务持有,因此高优先级任务进入阻塞状态

然后一个中等优先级的任务就绪,其抢占了低优先级任务得到执行,等到中等优先级任务执行完毕,低优先级任务继续执行直到释放共享资源的锁,这时候高优先级的任务才能够从阻塞状态恢复得以运行

这样就造成了中等优先级的任务反而比高优先级的任务先执行,我们称其为优先级反转

8、如何避免优先级反转?

  1. 优先级继承,当高优先级的任务尝试获取已经被低优先级任务持有的共享资源而进入阻塞状态时,临时将低优先级任务的优先级提高到与高优先级任务优先级一致,避免了中等优先级的干扰
  2. 优先级天花板协

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。

全部评论

相关推荐

评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务