FreeRTOS 项目剖析

FreeRTOS 应用程序与非 RTOS 应用程序的启动和执行方式并无二致, 如果调用 vTaskStartScheduler() 的话,另当别论。vTaskStartScheduler() 通常从应用程序的 main() 函数调用。RTOS 仅控制 调用 vTaskStartScheduler() 后的执行顺序。

我们强烈建议您确保代码在选择的目标上正确执行 (正确的启动代码、正确的链接器配置等), 然后再开始尝试使用 RTOS 功能。

一、源文件

FreeRTOS 作为标准 C 源文件提供, 与项目中的其他 C 文件共同构建。FreeRTOS 源文件 以 zip 文件形式分发。RTOS 源代码组织页面 介绍了 zip 文件夹中的文件结构。 

您的项目必须至少包含以下源文件:

  • FreeRTOS/Source/tasks.c
  • FreeRTOS/Source/queue.c
  • FreeRTOS/Source/list.c
  • FreeRTOS/Source/portable/[compiler]/[architecture]/port.c
  • FreeRTOS/Source/portable/MemMang/heap_x.c 其中 "x" 可以是 1、2、3、4 或 5

 如果包含 port.c 文件的目录也包含程序集语言文件, 那么也必须使用程序集语言文件。

二、可选源文件 

如果需要软件定时器功能,请在项目中添加 FreeRTOS/Source/timers.c。

如果需要事件组功能,请在项目中添加 FreeRTOS/Source/event_groups.c。

如果需要流缓冲区或消息缓冲区功能,请在项目中添加 FreeRTOS/Source/stream_buffer.c。

如果需要协程功能,请在项目中添加 FreeRTOS/Source/croutine.c(请注意,协程已弃用, 不推荐用于新设计)。

 三、头文件

 

以下目录必须位于编译器的 include 路径中(必须告知编译器在这些目录中搜索 头文件):

  • FreeRTOS/Source/include
  • FreeRTOS/Source/portable/[compiler]/[architecture]。
  • 无论哪个目录包含要使用的 FreeRTOSConfig.h 文件,请参阅下文“配置文件”段落。

根据移植的不同,也可能需要将相同的目录放在汇编器的 include 路径中。

四、配置文件 

每个项目还需要一个名为 FreeRTOSConfig.h 的文件。 FreeRTOSConfig.h 它为正在构建的应用程序量身定制 RTOS 内核。因此,它是取决于应用程序的,而不是 RTOS,并且应位于应用程序目录中, 而不是 RTOS 内核源代码目录中。

如果您的项目包含 heap_1、heap_2、heap_4 或 heap_5,则 FreeRTOSConfig.h 的 configTOTAL_HEAP_SIZE 定义将决定 FreeRTOS 堆的大小。如果configTOTAL_HEAP_SIZE设置得太高,则您的应用程序将无法建立连接。

FreeRTOSConfig.h 中的 configMINIMAL_STACK_SIZE 定义 设定了闲置任务使用的堆栈大小。如果 configMINIMAL_STACK_SIZE 设置得太低, 则空闲任务将造成栈溢出。建议您找到使用相同微控制架构的 FreeRTOS 官方演示, 复制其中的 configMINIMAL_STACK_SIZE设置。FreeRTOS 演示 项目存储在 FreeRTOS/Demo 目录的子目录中。 请注意,一些演示项目的时间距离现在比较久,因此不包含所有可用的配置选项。

五、中断矢量

每个 RTOS 移植都使用定时器来生成周期性滴答中断。许多移植使用额外的中断 来管理上下文切换。RTOS 移植所需的中断由提供的 RTOS 移植源文件 提供服务。

RTOS 移植所提供的中断处理程序的安装方法取决于 所使用的移植和编译器。请参阅针对所使用移植提供的官方演示应用程序, 必要时也可复制。另请参阅官方演示应用程序配套的文档页面。

 

### FreeRTOS 项目性能优化技巧与最佳实践 FreeRTOS 是一种实时操作系统,广泛应用于嵌入式系统开发中。为了提高其性能和效率,可以采取以下方法或建议[^1]: #### 1. 内存管理优化 FreeRTOS 提供了多种内存分配方案(heap_1 至 heap_5),其中 heap_4 是一种较优的选择,因为它支持动态内存分配的同时避免了内存碎片化问题。通过深入理解 heap_4 的实现原理及其源码,开发者可以更好地调整内存分配策略以适应特定应用场景[^1]。 ```c // 示例:使用 heap_4 进行动态内存分配 void *pvPortMalloc(size_t xWantedSize); void vPortFree(void *pv); ``` #### 2. 调整任务优先级 任务优先级的合理分配对系统的实时性和性能至关重要。应确保高优先级任务能够及时抢占低优先级任务的资源。同时,避免频繁的任务切换以减少上下文切换开销[^1]。 #### 3. 减少中断延迟 中断处理是嵌入式系统中的关键部分。尽量缩短中断服务程序(ISR)的执行时间,并合理配置中断优先级,以降低系统整体延迟[^1]。 #### 4. 配置合适的堆栈大小 每个任务都需要分配一定大小的堆栈空间。过大的堆栈会浪费内存,而过小的堆栈可能导致堆栈溢出。可以通过调试工具监控堆栈使用情况,并根据实际需求调整堆栈大小[^1]。 #### 5. 使用 Tickless Idle 模式 Tickless Idle 模式可以在空闲时关闭定时器中断,从而显著降低功耗。对于电池供电设备,这种模式尤为重要。需要根据具体硬件平台实现相应的低功耗功能[^1]。 #### 6. 精简内核配置 FreeRTOS 提供了许多可选功能,但并非所有功能都适用于每个项目。通过精简内核配置(如禁用不必要的组件或功能),可以减少代码体积和运行时开销[^1]。 ```c // 示例:在 FreeRTOSConfig.h 中配置选项 #define configUSE_IDLE_HOOK 0 #define configUSE_TICK_HOOK 0 #define configUSE_MALLOC_FAILED_HOOK 0 ``` #### 7. 利用 Trace 工具进行性能分析 借助 FreeRTOS 提供的 Trace 工具(如 Percepio Tracealyzer),可以直观地分析任务调度、中断处理以及内存使用等情况,从而发现潜在的性能瓶颈并加以改进[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值