
M4和M7内核有硬件FPU1.不要在中断中处理浮点2.在rtos移植中要注意硬件浮点在任务压栈时会多压很多栈空间要注意加大任务堆栈3.不要注释掉FreeRTOSConfig.h中的不要注释掉这个 /* FreeRTOS中断服务函数相关定义 */ #define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler 不要这样 void SVC_Handler(void) { vPortSVCHandler() ; } void PendSV_Handler(void) { xPortPendSVHandler() ; }PendSV必须“裸跳转”不能“函数调用”开启FPU后xPortPendSVHandler是一个用__attribute__((naked))修饰的裸函数。它内部会手动处理FPU寄存器的压栈和出栈最后执行bx lr返回。写法xPortPendSVHandler();会被编译器生成标准调用指令但这与裸函数内部的状态完全冲突会导致堆栈严重错乱函数入口的压栈和裸函数内部的压栈叠加任务栈指针偏移量全乱。FPU上下文损坏xPortPendSVHandler会通过检查lr来判断是否需压栈FPU寄存器。你的C包装函数打乱了lr的值导致判断错误浮点上下文要么被遗漏要么被重复压栈。直接死机HardFault最典型的结果就是任务切换时进入HardFault。