嵌入式——交叉编译

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

相关推荐
17(无规则自律)9 小时前
【CSAPP 读书笔记】第一章:计算机系统漫游
linux·c语言·arm开发·嵌入式硬件·学习·ubuntu
梁洪飞9 小时前
内核启动卡死在Starting kernel ...,没有任何打印如何定位
linux·arm开发·嵌入式硬件·arm
松涛和鸣11 小时前
62、IIC通信解析
服务器·arm开发·单片机·嵌入式硬件·html
STCNXPARM12 小时前
Linux-ARM-Bootloader概述
linux·运维·arm开发·uboot·bootloader
一生只为赢1 天前
通俗易懂:ARM指令的寻址方式(三)
运维·arm开发·数据结构·嵌入式实时数据库
星瞳科技OpenMV1 天前
星瞳OpenMV官方机械臂教程|从零开始:Robot Arm机械臂快速上手
arm开发·图像处理·python·计算机视觉·ai·机器人·openmv
凉、介1 天前
ARM 架构中的内存屏障
arm开发·笔记·学习·架构·操作系统·嵌入式
一生只为赢1 天前
通俗易懂:ARM指令的寻址方式(二)
arm开发
梁洪飞1 天前
使用rockchip sdk提供的uboot调通网络
linux·网络·arm开发·嵌入式硬件·arm