Cortex-A9 zynq7 & freeRTOS的double坑
问题
Cortex-A9支持浮点处理,但是freeRTOS 9.0以前版本中断和任务切换是不保存64bit浮点寄存器的,即不保存现场的d系列寄存器。
后果就是,浮点计算莫名奇妙的错误,偶发、随机错误。
解决方法
- freeRTOS 9.0以上版本:
configUSE_TASK_FPU_SUPPORT is set to 2 in FreeRTOSConfig.h. - freeRTOS 9.0以下版本,自己保存现场:
中断入口:__asm(“VPUSH {d0-d15}”); // FPU 寄存器入栈
中断出口:__asm(“VPOP {d0-d15}”); // FPU 寄存器出栈
每个任务开始处:portTASK_USES_FLOATING_POINT()
感谢相关链接
https://zhuanlan.zhihu.com/p/568004511
https://www.freertos.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html#floating-point