嵌入式——交叉编译

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

相关推荐
梁洪飞1 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠2 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟3 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9563 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
unicrom_深圳市由你创科技3 天前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发
松涛和鸣3 天前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
松涛和鸣3 天前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发
切糕师学AI3 天前
ARM 架构中的 CurrentEL
arm开发·架构