stm32+FreeRTOS遇到的坑

问题

最近把项目移植进FreeRTOS时,发现开始任务都不能启动;

机器是stm32f407,使用的arm固件和FreeRTOS都是最新版本;

裸机运行没有问题,但是使用任务运行就运行不了;

排查

首先尝试了教程用的点灯代码,发现可以正常运行;然后使用我自己的代码点灯,发现还是运行不了;

自己代码比教程多了一些初始化程序,猜测是初始化出了问题;

一开始以为是延时函数或者是中断的问题,但是当我使用了不会触发任务调度的延时,允许了所有中断使用后,问题还是没有解决;

再把问题缩小在具体每个初始化程序中,注释了一些初始化程序,发现有时候可以运行,有时候运行不了;

通过逐个排除,和网上查询资料,最后发现应该是浮点运算的问题,在我的mpu6050和触摸屏初始化程序里,使用到了浮点运算,注释这两个程序,系统就能正常运行;

检查了keil的设置没有问题,已经选择了单精度的浮点支持;

解决

最后发现应该是port.c文件的问题,我原先使用的是FreeRTOS\Source\portable\RVDS\ARM_CM3里的port.c,然而stm32的arm内核为m4,所以应该选择FreeRTOS\Source\portable\RVDS\ARM_CM4F里的port.c,ARM_CM4F即表示m4内核,支持浮点运算;

修改后,程序正常运行,现在任务可以正常调度了;

踩的坑

我是按照教程资料移植的(教程资料描述不具体),移植时我没有注意port.c文件的不同,移植教程里使用的是针对stm32f107的代码;

当stm32f407使用ARM_CM3里的port.c文件在不涉及浮点运算时运行是没有问题的,但是一旦设计浮点运算系统就会卡死不运行,具体原理也不清楚;

你可能感兴趣的:(嵌入式开发学习,stm32,嵌入式硬件,单片机,FreeRTOS)