写得不错,最近移植UCOSII的时候正不知道ccs中怎么处理FPU有关的问题,官方只有M4在keil和IAR部分的内容。看到这知道了应该在os_cpu_a,asm中写上 .if __TI_FPV4SPD16_SUPPORT__ = 1就和keil中IF {FPU} != "SoftVFP"及IAR中的#ifdef __ARMVFP__一样来获取编译器的配置情况决定是否编译和FPU堆栈有关的代码。
补充一下楼主说的第二种情况。以CCS为例,当编译器使能了fpu选项后在运行到主函数前的启动代码栏有这么一段
- _c_int00: .asmfunc
- .if !__TI_ARM_V7M__ & !__TI_ARM_V6M0__
- .if __TI_NEON_SUPPORT__ | __TI_VFP_SUPPORT__
- ;*------------------------------------------------------
- ;* SETUP PRIVILEGED AND USER MODE ACCESS TO COPROCESSORS
- ;* 10 AND 11, REQUIRED TO ENABLE NEON/VFP
- ;* COPROCESSOR ACCESS CONTROL REG
- ;* BITS [23:22] - CP11, [21:20] - CP10
- ;* SET TO 0b11 TO ENABLE USER AND PRIV MODE ACCESS
- ;*------------------------------------------------------
- MRC p15,#0x0,r0,c1,c0,#2
- MOV r3,#0xf00000
- ORR r0,r0,r3
- MCR p15,#0x0,r0,c1,c0,#2
即一旦检查到编译器使能了FPU,则会将CPACR寄存器中的CP11、CP10置为11,以便程序能在特权级和用户级两种模式下使用FPU的协处理器,这相当与函数FPUEnable()干的事,而FPULazyStackingEnable()用于设置寄存器FPCCR的ASPEN为和LSPEN位为1,以启动中断发生时与FPU相关的寄存器的压栈特性,但这个位复位值就是为1。所以在编译器设置了FPU的情况下即使不调用这两个函数,编译器也能够产生汇编指令,并不会发生错误。
本帖最后由 鬼眼刀道 于 2014-11-29 17:25 编辑