硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4791|回复: 1
收起左侧

[FreeRTOS教程] 第34章 使用FreeRTOS时注意事项总结

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2016-9-18 16:38:01 | 显示全部楼层 |阅读模式



第34章   使用FreeRTOS时注意事项总结



        本章节主要是总结了FreeRTOS使用中几个常见问题的解决办法。
34.1 使用FreeRTOS注意事项
34.2 FreeRTOS官方整理的FAQ
34.3 总结



34.1  使用FreeRTOS注意事项


        下面都是初学者容易犯错误的地方,特此总结一下,望初学者在使用时注意这些问题。

34.1.1     MDK和IAR版本问题


IDE:支持两种IDE开发环境,MDK和IAR
        (1)用MDK4.7X或者MDK5.XX均可,保证支持STM32F103F407F429即可(不可以使用MDK4.7X以下版本,一方面是不支持F429,另外就是FreeRTOS V8.2.3要用到C代码中嵌套汇编代码,MDK4.7X以下版本是不支持的)。
        (2)IAR固定使用IAR7.5版本,由于IAR向下兼容性稍差,别的版本未做支持。

34.1.2     FreeRTOS的初始化流程


        推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须采用这种初始化方式,适合自己项目的才是最好的:
  1. int main(void)
  2. {
  3.      /*
  4.        在启动调度前,为了防止初始化STM32外设时有中断服务程序执行,这里禁止全局中断(除了NMI和HardFault)。
  5.        这样做的好处是:
  6.        1. 防止执行的中断服务程序中有FreeRTOS的API函数。
  7.        2. 保证系统正常启动,不受别的中断影响。
  8.        3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。
  9.        在移植文件port.c中的函数prvStartFirstTask中会重新开启全局中断。通过指令cpsie i开启,__set_PRIMASK(1)
  10.        和cpsie i是等效的。
  11.      */
  12.      __set_PRIMASK(1);
  13.    
  14.      /* 硬件初始化 */
  15.      bsp_Init();
  16.         
  17.      /* 创建任务 */
  18.      AppTaskCreate();
  19.      /* 创建任务通信机制 */
  20.      AppObjCreate();
  21.    
  22.     /* 启动调度,开始执行任务 */
  23.     vTaskStartScheduler();
  24.      /*
  25.        如果系统正常启动是不会运行到这里的,运行到这里极有可能是用于定时器任务或者空闲任务的
  26.        heap空间不足造成创建失败,此要加大FreeRTOSConfig.h文件中定义的heap大小:
  27.        #define configTOTAL_HEAP_SIZE        ( ( size_t ) ( 17 * 1024 ) )
  28.      */
  29.      while(1);
  30. }
复制代码

34.1.3     中断优先级分组设置


        强烈推荐用户将Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429的NVIC优先级分组设置为4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断优先级的管理将非常方便。此函数在bsp_Init中第一个被调用:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: bsp_Init
  4. *    功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
  5. *             全局变量。
  6. *    形    参: 无
  7. *    返 回 值: 无
  8. *********************************************************************************************************
  9. */
  10. void bsp_Init(void)
  11. {
  12.    
  13.      /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  14.      bsp_InitUart();    /* 初始化串口 */
  15.      bsp_InitLed();     /* 初始LED指示灯端口 */
  16.      bsp_InitKey();     /* 初始化按键 */
  17. }
复制代码

34.1.4     任务优先级分配方案


        这个问题在第13章,13.2小节中有详细讲解。

34.1.5     任务栈和系统栈大小的分配


        任务栈的大小及其溢出检测,我们在第11章进行了详细讲解,而系统栈不容易测试,用户可以简单的计算最大的中断嵌套层数,并在此基础上再增加些空间。
        一般情况下,用户分配1-2KB的系统栈大小即可。

34.1.6     FreeRTOS中使用中断注意事项


         对于初学者来说,首先,务必要把第12章:FreeRTOS中断优先级配置弄明白,非常重要。其次,FreeRTOS中断方式的同步或者通信机制,在教程中都有配套的例子及其使用注意事项,使用时务必要注意。另外,用户要注意以下两个问题,在前面的章节中也有啰嗦过:
        (1)PendSV中断,SysTick中断和SVC 0中断用户不可调用,这三个被FreeRTOS占用。
        (2)对于STM32F103STM32F407STM32F429来说,当用户将优先级分组设置为4的时候,PendSV的中断优先级是15SysTick的中断优先级也是15,而SVC的中断优先级是0。其中SVC中断,仅在系统启动的时候调用了一次。

34.2  FreeRTOS官方整理的FAQ


        官方总结的问题汇总地址:http://www.freertos.org/FAQ.html

34.3  总结


        这里仅为大家总结了七条常见问题,使用中还会遇到其它的问题,望初学者不断积累这方面的经验,让自己的工程代码更加健壮。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2016-10-8 00:03:59 | 显示全部楼层
[s:141]  [s:141]  [s:141]  [s:141]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 16:38 , Processed in 0.198633 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表