嵌入式面经-FreeRTOS

本文详细介绍了FreeRTOS中的关键概念,如队列和信号量的使用,以及它们在任务间的数据交换和同步中的作用。讨论了抢占式、时间片和合作式调度,以及优先级翻转和继承现象。此外,还着重讲解了Heap_4动态内存管理算法及其内存优化策略。
摘要由CSDN通过智能技术生成
  • FreeRTOS

    • 什么是队列:队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)

    • 什么是信号量:信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问(信号量用于传递状态)

    • 二值信号量和互斥信号量的区别是什么

      • 二值信号量的本质是一个长度为 1 的队列 ,该队列就只有空和满两种情况

      • 互斥信号量其实就是一个拥有优先级继承的二值信号量

      • 任务和任务,任务和中断之间同步,用二值信号量最合适

      • 互斥访问,用互斥信号量更合适

    • 四种任务状态

      • 运行态:正在执行的任务,该任务就处于运行态,在STM32中,同一时间仅一个任务处于运行态

      • 就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态

      • 阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态

      • 挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态

    • 任务是如何切换的:以下两种情况会发生任务切换

      • systick中断处理

      • 主动调用taskYIELD及其变种

    • 调度方式

      • 抢占式调度:每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的 API 函数,比如 vTaskDelay。

      • 时间片调度:每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如vTaskDelay,才会执行同优先级任务之间的任务切换

      • 合作式调度

    • 什么是优先级翻转:高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。从现象上看,就像是中优先级的任务比高优先级,任务具有更高的优先权(即优先级翻转)

    • 优先级继承:当一个互斥信号量正在被一个低优先级的任务持有时, 如果此时有个高优先级的任务也尝试获取这个互斥信号量,那么这个高优先级的任务就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级。

    • 内存管理是怎么样的

      • FreeRTOS提供了5种内存管理方式

      • Heap_4 算法属于动态内存申请,就是内存的分配和释放是在运行时进行的,而不是在编译时确定的,不需要程序员指定变量的内存大小和位置,也就是可以在程序运行过程中动态创建和删除内核对象

      • heap_4 内存管理算法使用最先适合最先使用算法来分配堆内存,自动将堆内存池中相邻的小块堆内存块组合成一个大的堆内存块,来解决内存碎片问题

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于 FreeRTOS 的八股,以下是一些常见的问题和答案: 1. 什么是 FreeRTOSFreeRTOS 是一个开源的实时操作系统 (RTOS),被广泛应用于嵌入式系统中。它提供了轻量级的任务调度、内存管理、同步和通信机制,旨在实现可靠和高效的实时应用程序。 2. FreeRTOS 的特点有哪些? - 小巧:FreeRTOS 的内核非常小巧,适用于资源有限的嵌入式系统。 - 可移植性强:FreeRTOS 提供了多个移植层,使其可以轻松移植到不同的处理器架构和开发环境。 - 任务调度:FreeRTOS 使用基于优先级的抢占式任务调度算法,可以有效地管理多个任务。 - 事件驱动:FreeRTOS 支持事件驱动的任务通信机制,如信号量、消息队列和事件标志组等。 3. FreeRTOS 的任务创建过程是怎样的? 任务的创建可以通过调用 `xTaskCreate()` 函数来完成。该函数需要指定任务函数、任务名称、堆栈大小、优先级等参数。调用该函数后,FreeRTOS 将会创建一个新的任务并开始执行。 4. FreeRTOS 中的任务通信机制有哪些? FreeRTOS 提供了多种任务通信机制,包括: - 信号量:用于任务之间的同步和资源访问控制。 - 消息队列:用于任务之间传递消息和数据。 - 事件标志组:用于任务之间的事件通知和等待。 5. FreeRTOS 如何处理中断? FreeRTOS 提供了一个中断嵌套执行机制,即可以在中断处理程序中调用 FreeRTOS 的 API 函数。在中断处理程序中,可以使用 `xSemaphoreGiveFromISR()`、`xQueueSendFromISR()` 等函数来释放信号量或者向消息队列发送数据。 这些是关于 FreeRTOS 的一些常见问题和答案,希望能对你有所帮助。如需了解更多细节,请参考 FreeRTOS 官方文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值