使用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基础之后,学习之后的小型嵌入式系统,会很得心应手。

 

posted @ 2017-08-30 16:37  Liu_Jing  Views(1238)  Comments(0Edit  收藏  举报