|
为了解决这个问题,倒腾了一下午,一开始研究的方向跑偏了,耽误了不少时间。
当前的RTX5支持MDK,GCC和IAR,所以也专门配套的三种Port文件,我们这里主要说MDK AC6和AC5。
1、先说MDK AC5
这里要说的是MDK AC5的移植文件,当前提供的移植文件irq_armv7m.s(之前是irq_cm4f.s)开头如下:
- IF :LNOT::DEF:RTX_STACK_CHECK
- RTX_STACK_CHECK EQU 0
- ENDIF
- IF ({FPU}="FPv4-SP")
- FPU_USED EQU 1
- ELSE
- FPU_USED EQU 0
- ENDIF
复制代码
这句IF ({FPU}="FPv4-SP")非常欠考虑,这个是M4内核单精度使用的,如果在MDK下使用M7内核芯片STM32H7,并且使用了浮点,这就完全不能用了。
M7单精度要使用FPv5-SP,双精度要使用FPv5-D16。最终修改决定使用 IF {FPU} != "SoftVFP" 判断是否使用软件浮点更简单,屏蔽了用户需要切来切去的问题。
修改后代码如下:
- IF :LNOT::DEF:RTX_STACK_CHECK
- RTX_STACK_CHECK EQU 0
- ENDIF
- IF {FPU} != "SoftVFP"
- FPU_USED EQU 1
- ELSE
- FPU_USED EQU 0
- ENDIF
复制代码
2、再说MDK AC6
MDK AC5的问题解决了,我使用MDK RTE创建了一个AC6的工程,我一看更惊呆了,直接用的GCC的Port文件。
- .syntax unified
- #include "rtx_def.h"
- #if (defined(__ARM_FP) && (__ARM_FP > 0))
- .equ FPU_USED, 1
- #else
- .equ FPU_USED, 0
- #endif
- .equ I_T_RUN_OFS, 20 // osRtxInfo.thread.run offset
- .equ TCB_SP_OFS, 56 // TCB.SP offset
- .equ TCB_SF_OFS, 34 // TCB.stack_frame offset
- .equ FPCCR, 0xE000EF34 // FPCCR Address
- .equ osRtxErrorStackOverflow, 1 // Stack overflow
复制代码
当然,编译是没问题的,注意选择这个选项:
这次新版升级的用户体验略差,究其根本原因是没有考虑M7内核的单精度浮点和双精度浮点使用RTX5的情况。
|
|