基于ARM编译器版本5的工程迁移与适配到ARM编译器版本6.12 后续1 - 汇编代码处理问题
<p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);">为了描述方便,将ARM Compiler 5简称为AC5,将ARM Compiler 6.12简称AC6.12。</span><br/></p><p style="text-indent: 0em;"> ARM官方的迁移文档,下载地址:<a class="btn btn-success" href="https://pan.baidu.com/s/1bQUrnbFPfqyHM9X4n2Iwig" target="_blank">点此下载</a> ,密钥:<span style="color: rgb(255, 0, 0);">0iaf</span>。<br/></p><p class="artical_littlestyle1">1、armasm编译汇编代码,链接失败的问题</p><p style="text-indent: 2em;">这里新开一篇博文,专门讲讲针对ARM格式的汇编代码,使用AC6.12应该如何处理。下述内容大多来自文档<span style="color: rgb(0, 112, 192);">《migration_and_compatibility_guide_100068_0612_00_en.pdf》</span>文档的 <span style="color: rgb(0, 112, 192);">3.3 Command-line options for preprocessing assembly source code</span>。<br/></p><p style="text-indent: 2em;">我在我自己的工程中遇到过使用AC6.12编译汇编代码成功,但是链接会失败。提示内容大致是:<span style="color: rgb(255, 0, 0);">xxx.scf Error: L6236E: No section matches selector - no section to be FIRST/LAST.</span>对于这个问题,我起初以为是分散加载文件(*.scf)有问题,看了半天的分散加载文件内容,也没发现分散加载文件有问题。于是我转换方向,使用命令去手动编译<span style="color: rgb(0, 112, 192);">startup_LPC55S69_cm33_core0.s</span>,然后再手动链接,发现还是提示<span style="color: rgb(255, 0, 0);">xxx.scf Error: L6236E: No section matches selector - no section to be FIRST/LAST.</span>错误。<br/></p><p style="text-indent: 2em;">于是我再次查阅ARM官方的升级与适配手册<span style="color: rgb(0, 112, 192);">《migration_and_compatibility_guide_100068_0612_00_en.pdf》</span>,发现armasm使用<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>选项编译汇编代码时,输入源代码的后缀名是.S(大写)。然而我的工程的ARM格式的汇编代码文件的后缀名均为小写,导致了armasm处理出错。下面是文档中<span style="color: rgb(0, 112, 192);">3.3 Command-line options for preprocessing assembly source code</span>对<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>的描述:<br/><span style="color: rgb(0, 112, 192);">If you are using armasm to assemble source code that requires the use of the preprocessor, you must use both the --cpreproc and --cpreproc_opts options together. Also:<br/>• As a minimum, you must include the armclang options --target and either -mcpu or -march in --<br/>cpreproc_opts.<br/>• The input assembly source <span style="color: rgb(255, 0, 0);">must</span> have an upper-case extension .S.</span><br/></p><p style="text-indent: 2em;">其中第2点,对汇编源文件后缀名为大写.S作了一个说明吧。<br/></p><p style="text-indent: 2em;">为了处理汇编源文件后缀是小写.s的情况,文档的下面也提供了一个操作的说明吧:<br/><span style="color: rgb(0, 112, 192);">If you have existing source files, which require preprocessing, and that have the lower-case extension .s, then to avoid having to rename the files:<br/>1. Perform the preprocessing step separately using the armclang -x assembler-with-cpp option.<br/>2. Assemble the preprocessed file without using the --cpreproc and --cpreproc_opts options.</span><br/></p><p style="text-indent: 2em;">上面这段英文的内容给出了汇编源代码文件后缀是小写.s,但是又不想修改源代码后缀的方法,首先使用armclang (带编译选项<span style="color: rgb(0, 112, 192);">-x assembler-with-cpp</span>)去预处理*.s汇编代码,生成一个过程*.s文件,接着再使用armasm(不带编译选项<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>)去编译这个过程*.s文件。这里提供一个例子如下:<br/>(1).<span style="color: rgb(0, 112, 192);">armclang --target=arm-arm-none-eabi -mcpu=cortex-m33 -x assembler-with-cpp -E test.s -o test_preproc.s</span><br/>(2).<span style="color: rgb(0, 112, 192);">armasm --cpu=Cortex-M33 --fpu=FPv5-SP test_preproc.s</span><br/></p><p class="artical_littlestyle2">2、总结</p><p style="text-indent: 2em;">ARM Compiler 6.12对于ARM格式的汇编处理,这里总结下吧,分两种情况:<br/>(1).如果ARM格式汇编代码源文件的后缀名是大写的.S,那么直接使用armasm 带编译选项<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>进行编译即可,例如:<br/><span style="color: rgb(0, 112, 192);">armasm --cpu=cortex-m33 --cpreproc --cpreproc_opts=--target=arm-arm-none-eabi,-mcpu=cortex-m33 startup_LPC55S69_cm33_core0.S</span><br/>(2).如果ARM格式汇编代码源文件的后缀名是小写的.s,这里就需要特殊处理了,有两种方法:<br/>a.将ARM格式汇编代码源文件的后缀名改为大写.S,然后按照步骤(1)进行处理即可。<br/>b.首先使用armclang (带编译选项<span style="color: rgb(0, 112, 192);">-x assembler-with-cpp</span>)去预处理*.s汇编代码,生成一个过程*.s文件,接着再使用armasm(不带编译选项<span style="color: rgb(0, 112, 192);">--cpreproc</span>和<span style="color: rgb(0, 112, 192);">--cpreproc_opts</span>)去编译这个过程*.s文件。这里提供一个例子如下:<br/>(1).<span style="color: rgb(0, 112, 192);">armclang --target=arm-arm-none-eabi -mcpu=cortex-m33 -x assembler-with-cpp -E test.s -o test_preproc.s</span><br/>(2).<span style="color: rgb(0, 112, 192);">armasm --cpu=Cortex-M33 --fpu=FPv5-SP test_preproc.s</span><br/></p><p style="text-indent: 2em;">如果觉得文章写的不错,对你有帮助,欢迎点赞,关注博主哟!<br/></p>
你可能也喜欢:
暂无评论,要不要来个沙发
发表评论
JLink V9掉固件修复(灯不亮) 3Zephyr笔记2 - 在STM32F429上运行HelloWorld 2计算NandFlash要传入的行地址和列地址 1Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式 0Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式 0Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2) 0
标签云
Linux嵌入式实用技巧ARM内核学习问题集合CC++编程语言阅读笔记汇编Linux内核完全注释Windows驱动开发计算机基础ARM11ARMv7-ASTM32IDESublimeLinux内核学习eMMCMMC子系统Ubuntu操作系统OfficeVMWareAPUEgccRTOS中断漫游世界随笔感悟开发工具软件应用编程VsCodearmccarmclang编译器ZephyrSPIJLink网卡驱动安装各种芯片库函数NFSμCOS内核sambaFlashUnix命令与脚本输入法Linux内核设计与实现gitRIFFWAVJATGFTPar8161安装centos有线上网μCGUI字库工程建立右键菜单网络文件系统Firefox百度NTFS文件系统CodeBlocksCentOS数据结构算法PhotoShop51KeilQTUltraEditscanfglibc宏定义UIDGID优先级娱乐天地SourceInsight磁盘扇区总线I2CPDFBComparePythonI2SFPUMakefileSWDCPUARP软件推荐FileZilla