汇编

为什么要学习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编译过程

file

编译

引用头文件

如果使用#include来引用头文件,系统给会在指定的目录中查找,可以在编译是加上 -I dir(指定头文件位置)自行设置

库文件也会在指定的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)

By karlren

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注