1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
现在的嵌入式开发大部分都是ARM处理器了,从MCU级别的M0,M3,M4,M23,M33,到MPU级别的ARM9,ARM11,ARM-A5x,ARM-A7x。开发者很少去注意使用的编译器,一般都是使用的是IDE自带或者开发板(芯片)厂家提供的编译器。等碰到问题百度时候最终才发现很多问题和编译器有关,如果一开始就对编译器有个基本的了解完全可以避免类似问题,下面就系统的介绍一下ARM编译器的选择和使用。
1. ARM处理器的分类 1.1. 按系列分类 - Cortex-M系列(通用微处理器) 包括Cortex-M0、M3、M4,新的M23,M33,以及早期的ARM7TDMI,这类处理器一般不跑操作系统,或者只跑个RTOS
1.2. 按指令集分类
1.3. 按硬件浮点分类 这种分类有些牵强,但是和编译器有较大关系,几种之间不兼容,所以这里单独列一下。
32位CPU带硬件浮点运算功能的大部分都是这种。 64位CPU都带硬浮点,也是这种。 2. ARM编译器的分类 交叉编译工具链的一般命名规则为:arch [-vendor][-os] [-(gnu)eabi] arch - 体系架构,如ARM,MIPS verdor -工具链提供商 os - 目标操作系统 eabi - 嵌入式应用二进制接口 2 2.3. arm-linux-androideabi编译器 顾名思义是安卓编译器,64位为aarch64-linux-eabi 3. ARM编译器和ARM架构相关的编译选项 其实各芯片厂家提供的编译器主要作用就是指定了下面这些选项的默认值(当然不仅仅是下面这些选项),使用户使用起来更方便,不需要手动去指定了。 3.1. -mcpu和-march -mcpu用于指定cpu的类型,例如cortex-a7,cortex-a9,cortex-a53,cortex-a73之类的。 -march用于指定cpu的指令集,例如armv6,armv7。 一般都是直接指定-mcpu,编译器能正确推断出-march的值。 3.2. -mfloat-abi和-mfpu -mfloat-abi用于指定软浮点还是硬浮点 soft:软浮点 softfp:硬件浮点但是参数传递使用普通寄存器 hard:硬浮点并且参数传递使用硬浮点寄存器 一般armv5的CPU是soft,armv6以上的是hard,softfp的比较少 注意:不同mfloat-abi编译出来的库一般不兼容,所以整个linux系统中所有程序和库的mfloat-abi应该保持一致。 -mfpu用于指定硬浮点的类型,可以是vfp,vfpv3,neon-vfpv4。 一般32位CPU选择vfp或者vfpv3,64位CPU选择neon-vfpv4,或者直接不选择,让编译器根据CPU选择默认值即可。不同mfpu选项应该是能兼容的,这个没测试,印象中是可以的,只要CPU本身有相应的硬件支持就行。 3.3. 通过-print-multi-lib选项,可以查看编译器支持的选项 3.4. 通过readelf -a命令,查看程序和库对应的编译选项 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9055 浏览 16 评论
4086 浏览 18 评论
1174浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 18:58 , Processed in 1.258229 second(s), Total 78, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号