转 本章节主要是总结了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均可,保证支持STM32F103,F407和F429即可(不可以使用MDK4.7X以下版本,一方面是不支持F429,另外就是FreeRTOS V8.2.3要用到C代码中嵌套汇编代码,MDK4.7X以下版本是不支持的)。
(2)IAR固定使用IAR7.5版本,由于IAR向下兼容性稍差,别的版本未做支持。
0
|
|
|
|
34.1.2 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);
}
|
|
|
|
|
34.1.3 中断优先级分组设置
强烈推荐用户将Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及F429的NVIC优先级分组设置为4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断优先级的管理将非常方便。此函数在bsp_Init中第一个被调用:
复制代码
/*
*********************************************************************************************************
* 函 数 名: bsp_Init
* 功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
* 全局变量。
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{
/* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
bsp_InitUart(); /* 初始化串口 */
bsp_InitLed(); /* 初始LED指示灯端口 */
bsp_InitKey(); /* 初始化按键 */
}
|
|
|
|
|
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)对于STM32F103,STM32F407和STM32F429来说,当用户将优先级分组设置为4的时候,PendSV的中断优先级是15,SysTick的中断优先级也是15,而SVC的中断优先级是0。其中SVC中断,仅在系统启动的时候调用了一次。
|
|
|
|
|
34.2 FreeRTOS官方整理的FAQ
官方总结的问题汇总地址:http://www.freertos.org/FAQ.html
|
|
|
|
|
34.3 总结
这里仅为大家总结了七条常见问题,使用中还会遇到其它的问题,望初学者不断积累这方面的经验,让自己的工程代码更加健壮。
|
|
|
|
|