使用FreeRTOS时注意事项总结(基础篇教程完结)
以下内容转载自安富莱电子:http://forum.armfly.com/forum.php
FreeRTOS 的初始化流程
推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须采用这种初始化方式,适合自己项目的才是最好的:
int main(void) { /* 在启动调度前,为了防止初始化 STM32 外设时有中断服务程序执行,这里禁止全局中断(除了 NMI 和 HardFault)。 这样做的好处是: 1. 防止执行的中断服务程序中有 FreeRTOS 的 API 函数。 2. 保证系统正常启动,不受别的中断影响。 3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。 在移植文件 port.c 中的函数 prvStartFirstTask 中会重新开启全局中断。通过指令 cpsie i 开启,__set_PRIMASK(1) 和 cpsie i 是等效的。 */ __set_PRIMASK(1); /* 硬件初始化 */ bsp_Init(); /* 创建任务 */ AppTaskCreate(); /* 创建任务通信机制 */ AppObjCreate(); /* 启动调度,开始执行任务 */ vTaskStartScheduler(); /* 如果系统正常启动是不会运行到这里的,运行到这里极有可能是用于定时器任务或者空闲任务的 heap 空间不足造成创建失败,此要加大 FreeRTOSConfig.h 文件中定义的 heap 大小: #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ) */ while(1); }
中断优先级分组设置
强烈推荐用户将 Cortex-M3 内核的 STM32F103 和 Cortex-M4 内核的 STM32F407 以及 F429 的NVIC 优先级分组设置为 4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断优先级的管理将非常方便。 此函数在 bsp_Init 中第一个被调用:
FreeRTOS 中使用中断注意事项
对于初学者来说,首先,务必要把FreeRTOS 中断优先级配置弄明白,非常重要。 其次,FreeRTOS 中断方式的同步或者通信机制,在教程中都有配套的例子及其使用注意事项,使用时务必要注意。 另外,用户要注意以下两个问题,在前面的章节中也有啰嗦过:
PendSV 中断,SysTick 中断和 SVC 0 中断用户不可调用,这三个被 FreeRTOS 占用。
对于 STM32F103,STM32F407 和 STM32F429 来说,当用户将优先级分组设置为 4 的时候,PendSV的中断优先级是 15,SysTick 的中断优先级也是 15,而 SVC 的中断优先级是 0。 其中 SVC 中断,仅
在系统启动的时候调用了一次。
FreeRTOS 官方整理的 FAQ
官方总结的问题汇总地址:http://www.freertos.org/FAQ.html
写在最后:
到这里,FreeRTOS的基础篇,即了解基本操作系统原理和能使用提供的API函数操作已经告一段落,如果确实到了需要分析源码和汇编的时候,再进行之后的提高练习。先做好应用层,再慢慢深入。提高自身水平的永远是自己的不断学习,不断练习,多动手操作,多动脑思考,有了FreeRTOS基础之后,学习之后的小型嵌入式系统,会很得心应手。
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并,获取更多隐藏干货,QQ交流群:859800032 微信公众号:Crystal软件学堂
作者:Liu_Jing bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |