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 集成开发环境中的语言库包含:
-
ARM C语言库:标准C语言函数集等
-
Rogue Wave C++库:
-
支持库:对不同体系结构、处理器的支持;
编译的选项与路径
编译时 -i,-j,-fk,-fd选项
环境变量ARMINC的值
绝对路径与相对路径
尖括号与双引号
内存中的文件系统
ARM编译器将ANSI C语言库头文件组织成一个特殊、压缩、基于内存的文件系统,在命令行编译时,默认使用。
C++库中与C有关的,也在其中,特有部分不在;
使用
#include<>时,编译器默认头文件是系统头文件,会首先从文件系统中搜索;
使用
#include""时,编译器不认为是系统头文件,会在搜索路径中搜索;
当前位置
编译器搜索源文件头头文件是相对当前位置进行搜索
ARMINC环境变量
命令行编译时,搜索完 -i后,搜索ARMINC 指定的路径,如果指定了-j,ARMINC 就被忽略
编译的搜索路径
编译时命令行选项 -i、-j-fk、-fd 会影响编译搜索路径
ARM编译器命令行格式
![](https://i-blog.csdnimg.cn/blog_migrate/0e8266c882fd9b81d02548eae21a0036.png)
内容较多,在 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__
...有几十个。