嵌入式——交叉编译

Makefile

步骤

(1)使用arm-linux-gnueabihf-gcc只汇编不链接

arm-linux-gnueabihf-gcc -c start.S -o start.o -g

(2)使用arm-linux-gnueabihf-ld链接代码到特定地址(得到可执行,可连接程序linux executable linkable file)

arm-linux-gnueabihf-ld -Ttext 0x87800000 start.o -o start.elf

(3)使用arm-linux-gnueabihf-objcopy 格式转换

arm-linux-gnueabihf-objcopy -O binary -S -g start.elf start.bin

(4)使用arm-linux-gnueabihf-objdump 反汇编(此处只是为了阅读代码,非必要步骤)

arm-linux-gnueabihf-objdump -D start.elf > start.dis

-c:只汇编不连接

-g:去掉调试信息

-Ttext:指定安装位置

-O:指定输出文件格式

-S:去掉符号信息

-D:反汇编

>:重定向

代码

在makefile中,引用变量需要用$(变量名)

冒号左侧为目标文件,右侧为依赖文件

LED

原理图

右侧为网络标号,左侧为SOC引脚的物理名称

所需引脚GPIO

General Purpose Input/Output,通用输入输出

注:PAD为物理引脚,梯形为IOMUX

对于复杂SOC,对于一个引脚,需要进行交叉复用功能设置,对于一个引脚。可能有多种功能,同一时刻只能使用一种,需要提前配置。图中的IOMUXC输入输出复用控制器就是来控制所有外设,类似于单刀多置开关,多个输入一个输出。

所需寄存器

其中Reserved表示保留,即不做任何改动

代码

基本写法

汇编调用C语言

由于GPIO中状态寄存器的地址连续,所以定义类型指针,这种类型偏移量为4,定义总的结构体把这些类型放里面,所以可以改成下图

时钟配置

Makefile

然而在最开始中的makefile中没有C文件,只有S文件,所以要对makefile再次配置

%:通配符,表示任意字符序列

$@:目标生成文件

$^:所有依赖文件

手册写法

在手册中,对于引脚等配置有专属的函数

注意:复用函数的0是填充无实际功能的寄存器保留位,而电气函数的非0值是配置GPIO 正常工作必需的硬件特性(如上拉、驱动能力),因此一个为0一个不为0

BSP板级支持包工程管理

到目前,我们将所有的源码文件都放到工程根目录下,即使这个工程只是完成了一个简单的流水灯的功能,但是其工程根目录下的源码文件就已经不少了。如果在添加一些其他的功能文件,那么文档就会更大,显得很混乱,所以我们需要对这个工程进行整理,将源码文件分模块、分功能整理。

这里我们把这些文件分为4类,并保存到4个不同的文件夹里。首先在新的工程文件夹里创建一个名为bsp文件夹,之后我们编写的类似led驱动,clk驱动等等外设驱动程序都放在这个文件夹里面;再创建一个project文件夹,存放 start.s和 main.c 文件,也就是应用文件; 一个imx6ul文件夹,用来保存NXP提供的相关库,如cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h 这四个文件;最后再创建一个obj文件夹 用来存放编译生成的.o 文件。

文件夹建立好之后,就可以把我们之前写的代码重构一下了。在bsp文件夹中创建led.c和led.h,将有关led的函数分别放在这两个文件里定义和声明;再bsp文件夹中创建clk.c和clk.h,CCM初始化函数放在这两个文件中定义和声明。最后把之前写好的链接脚本文件imx6ul.lds和Makefile文件考本到工程根目录下。由于我们的程序文件现在分散在多个不同的目录中,因此Makefile必须能够找到这些文件。

优化Makefile

相关推荐
一抹晴空9 小时前
Keil MDK AC6 compiler编译报错,与AC5区别
c语言·arm开发·单片机
运维成长记10 小时前
关于“有x86镜像,没有Dockerfile” 怎么制作arm架构的镜像
arm开发·架构
熠速17 小时前
PolarBox高性能实时仿真系统
arm开发·fpga开发·嵌入式实时数据库·硬件在环半实物仿真
天下·第二2 天前
如何在【x86】服务器上打包构建【arm】镜像
服务器·arm开发·eureka
止观止2 天前
在 WSL2 上从零搭建 ARM 混合编程环境
汇编·arm开发·嵌入式开发·混合编程
陌上花开缓缓归以2 天前
nand flash bbt和bmt管理
arm开发
小熊officer3 天前
AMD架构与ARM架构
arm开发·架构
_kerneler3 天前
arm虚拟机实时性优化总结
arm开发
口袋里のInit3 天前
基础知识——ARM M核入栈出栈流程
开发语言·arm开发
2035去旅行4 天前
WIFI传输带宽
arm开发·嵌入式硬件