嵌入式——交叉编译

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

相关推荐
zhouwy1131 天前
ARM汇编指令集详解
汇编·arm开发
山后太阳2 天前
Keil5(MDK-ARM)完整下载安装教程+入门教程:从零搭建STM32开发环境
arm开发·stm32·嵌入式硬件
zz_lzh2 天前
arm版AI牛马:armbian(rk3588)设备部署openclaw
arm开发·人工智能·arm
lanxiao88883 天前
F1C100S 内核
arm开发
杰杰桀桀桀3 天前
基于stm32ARM库函数的IIR二阶巴特沃斯低通滤波器--附完整代码
arm开发·stm32·嵌入式硬件·数字滤波器·巴特沃斯低通滤波
TBrL7UtdTELTTdut4BAL3 天前
ARM Cortex-A53 (无AES)平台加密网络转发性能测试与对比分析
arm开发·集成测试
AI服务老曹3 天前
架构实战:如何基于 GB28181 与异构计算构建跨平台(X86/ARM)AI 视频管理系统?源码交付深度解析
arm开发·人工智能·架构
CinzWS4 天前
A53 FPGA原型验证:从RTL到可运行系统的挑战
arm开发·嵌入式·芯片验证·原型验证·a53
AI服务老曹4 天前
深度解析:支持 GB28181/RTSP 及异构计算(X86/ARM+GPU/NPU)的 AI 视频管理平台架构方案(附源码交付与 Docker 部署)
arm开发·人工智能·音视频
2302_813806224 天前
基础环境篇 – 交叉编译环境搭建与NFS服务配置
arm开发