ARM 体系结构与编程

ARM C/C++ 编译器与语言库
编译器名称
编译器种类
源文件类型
源文件后缀
输出的目标文件类型
armcc
C
C
.C
32位ARM代码
tcc
C
C
.C
16位Thumb代码
armcpp
C++
C/C++
.C/.CPP
32位ARM代码
tcpp
C++
C/C++
.C/.CPP
16位Thumb代码
上述编译器将符合ANSI 标准的源程序编译成 32位或者16位的ARM、Thumb代码,编译输出的是 ELF格式的 .o  目标文件
ARM 集成开发环境中的语言库包含:
  1. ARM C语言库:标准C语言函数集等
  2. Rogue Wave C++库:
  3. 支持库:对不同体系结构、处理器的支持;

编译的选项与路径
编译时 -i,-j,-fk,-fd选项
环境变量ARMINC的值
绝对路径与相对路径
尖括号与双引号
内存中的文件系统
ARM编译器将ANSI C语言库头文件组织成一个特殊、压缩、基于内存的文件系统,在命令行编译时,默认使用。
C++库中与C有关的,也在其中,特有部分不在;
使用 #include<>时,编译器默认头文件是系统头文件,会首先从文件系统中搜索;
使用 #include""时,编译器不认为是系统头文件,会在搜索路径中搜索;
当前位置
编译器搜索源文件头头文件是相对当前位置进行搜索
ARMINC环境变量
命令行编译时,搜索完 -i后,搜索ARMINC 指定的路径,如果指定了-j,ARMINC 就被忽略
编译的搜索路径
编译时命令行选项 -i、-j-fk、-fd 会影响编译搜索路径

ARM编译器命令行格式
内容较多,在 MDK option 界面 中的各种勾勾选项, 即是对上述选项参数的改变,具体可查阅手册

 


#PRAGMA 的作用
控制编译时的行为
e.g
#progma 

ARM 编译器特定关键词
告诉编译器特殊处理,是ARM特定的功能,是对ANSI C 的扩展!
声明函数的关键词
__asm,C 嵌入汇编,参数传递要符合 ATPCS
__inline,编译器认为合理则展开函数,不会变成子程序
__irq,函数被修饰后,有特定的表现形式,不能返回参数或数值,具体查手册
__pure,函数输出只依赖于输入,且没负面效应,可以用之声明
__softfp,使用硬浮点还是软浮点,都可使用相同C库
__swi,
__swi_indirect,
__value_in_regs,
__weak,声明一个外部函数,如果编译时没有找到,就不会报错,运行时将这个函数当做NULL处理
声明变量的关键词
在C/C++ 中与ARM特性有关的变量
register,告诉编译器尽量将变量保存到寄存器中,代码可能不一样
__int64,long long 同义词
__global_reg(val),将一个已经声明的变量分配到一个全局整数寄存器中。
限定数据类型的关键词
特殊处理,与ARM特性有关
__align(1/2/4/8),修饰对象的内存对齐方式,不能修饰typedef,struct,函数形参
LDM,STM要求数据是8字节对齐的,所以做了对齐可保证速度;
ATPCS要求数据栈是8字节对齐的;
C库存储模型保证了堆是8字节对齐的;
__packed,限定其数据是1字节对齐
它的对象使用非对齐访问;
不能用于浮点或包含浮点的结构与联合,前面没有__packed的
__volatile,保证该变量不被编译器优化,告诉编译器随时可能被改变
如IO相关寄存器,遇到该变量就要读取,不能优化掉。
__weak,限定对象,链接时若不存在也不报错,?

ARM 编译器基本数据类型
char,8,1对齐;
short,16, 2对齐;
int,32,4对齐
long,32, 4对齐
long long,64, 4对齐
float,32, 4 对齐
double,64, 4 对齐
long double,64, 4 对齐
all pointers,32, 4 对齐
Bool,32, 4对齐
size_t 被定义为 unsigned int
ptrdiff_t 被定义为 signed int

ARM 编译器中的预宏定义
编译器自带了很多定义好的宏定义,如:
__DATA__
__arm__
__ARM_VERSION
__FILE__
__func__
__LINE__
...有几十个。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值