汇编
为什么要学习Cotex-A汇编:
①、需要用汇编初始化一些SOC外设
②、使用汇编初始化DDR,IMX6U不需要
③、设置SP指针,一般指向DDR,设置好C语言运行环境
C语言运行环境搭建
①设置处理器模式
设置6ULL处于SVC模式。设置CPSR寄存器的bit4-0为0x13,读写状态寄存器需要使用MRS和MSR指令
②设置SP指针
SP可以指向内部RAM,也可以指向DDR,512MB的范围0x80000000~0x9FFFFFFF。
栈大小 0x200000 = 2MB,A7处理器栈增长方式为向下增长,故设置SP指针指向0x80200000.
③跳转到C语言函数
使用b函数跳转到main函数
交叉编译
编译工具链和目标程序运行在相同的架构平添,叫做本地编译
编译工具链和目标程序运行在不同的架构平台,叫做交叉编译
在ubuntu系统中使用gcc编译的可执行文件是x86架构的,只能在x86架构下执行,但例如IMX6ULL、jetson nano是ARM架构的,就无法直接运行在x86架构下编译出的可执行文件,而是需要在x86架构下使用可以编译出ARM架构可执行文件的工具,这个工具就是交叉编译器
#安装arm-gcc工具链
sudo apt install gcc-arm-linux-gnueabihf #imx6ull的交叉编译工具
sudo apt install gcc-aarch64-linux-gnu
GCC编译过程
编译
引用头文件
如果使用#include
库文件也会在指定的lib目录查找,或通过-L dir(指定的库文件位置)自行设置
运行时:动态库在/lib /usr/lib等固定目录,或者通过自己指定LD_LIBRARY_PATH环境变量
很有用的选项
gcc -E main.c //查看预处理结果,比如头文件是哪个
gcc -E -dM main.c > 1.txt //把所有的宏展开,存在1.txt里
gcc -Wp,-MD,adc.dep -c -o main.0 main.c //生成依赖文件abd.dep,后面Makefile会用
echo 'main(){}' | gcc -E -v - // 它会列出头文目录、库目录(LIBRARY_PATH)