笔者在keil上移植CMSIS DSP函数库时,会出现如下报错信息:
打开arm_bitreversal2.S 发现该代码的开头是一些C语言中常见的条件编译和宏定义,如下所示:
#if defined ( __CC_ARM ) /* Keil */
#define CODESECT AREA ||.text||, CODE, READONLY, ALIGN=2
#define LABEL
#elif defined ( __IASMARM__ ) /* IAR */
#define CODESECT SECTION `.text`:CODE
#define PROC
#define LABEL
#define ENDP
#define EXPORT PUBLIC
#elif defined ( __CSMC__ ) /* Cosmic */
#define CODESECT switch .text
#define THUMB
#define EXPORT xdef
#define PROC :
#define LABEL :
#define ENDP
#define arm_bitreversal_32 _arm_bitreversal_32
#elif defined ( __TI_ARM__ ) /* TI ARM */
#define THUMB .thumb
#define CODESECT .text
#define EXPORT .global
#define PROC : .asmfunc
#define LABEL :
#define ENDP .endasmfunc
#define END
#elif defined ( __GNUC__ ) /* GCC */
#define THUMB .thumb
#define CODESECT .section .text
#define EXPORT .global
#define PROC :
#define LABEL :
#define ENDP
#define END
.syntax unified
#endif
......
这样在汇编arm_bitreversal2.S代码时是一定会报错,因为汇编的语法跟C语言是有区别的,那我们应该怎么处理呢?打开keil的Options,在Asm栏目中的Misc Controls中,输入--cpreproc,这样编译就不会报错了,如下图所示:
--cpreproc选项是告诉armasm在汇编代码时先调用armclang来处理该汇编代码,然后再将处理后的代码给armasm来汇编成机器码。当汇编代码中有文件包含和条件编译时,我们需要联合--cpreproc_opts 选项来一起使用,该--cpreproc_opts 选项的作用是使能armasm 发送配置参数给armclang,比如宏定义和头文件路径,如下是armasm 汇编包含C语言预处理的举例:
armasm --cpu=cortex-a9 --cpreproc --cpreproc_opts=--target=arm-arm-none-eabi,-mcpu=cortex-a9,-D,DEF1,-D,DEF2 -I /path/to/includes1 -I /path/to/includes2 input.S