【ARM 裸机】BSP 工程管理

ops/2024/10/18 23:32:26/

回顾一下上一节:【ARM 裸机】NXP 官方 SDK 使用,我们发现工程文件夹里面各种文件非常凌乱;
在这里插入图片描述
那么为了模块化整理代码,使得同一个属性的文件存放在同一个目录里面,所以学习 BSP 工程管理非常有必要。

1、准备工作

新建文件夹,准备将同一个属性的文件存放在一起;
在这里插入图片描述
将 .h 文件放在 imx6u 目录里面;
在这里插入图片描述
将 main.c 与 start.s 放在 project 目录里面;
在这里插入图片描述
进入 bsp 目录,新建三个目录(clk,delay,led);
在这里插入图片描述
现在在工程目录(5_ledc_bsp)的结构如下;
在这里插入图片描述
删除 ledc_sdk.code-workspace 工作区文件,然后在 VSCcode 中打开文件夹 5_ledc_bsp,然后将工作区另存为 ledc_bsp;
在这里插入图片描述
在这里插入图片描述

2、处理驱动文件

上面已经创建了 clk、delay、led 目录,但并未存放文件,需要创建对应的驱动文件并放在对应的目录;

2.1、clk

选择 clk,新建 bsp_clk.c 与 bsp_clk.h;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2、delay

选择 delay,新建 bsp_delay.c 与 bsp_delay.h;
在这里插入图片描述
在这里插入图片描述

2.3、led

选择 led,新建 bsp_led.c 与 bsp_led.h;
在这里插入图片描述
在这里插入图片描述

2.4、main.h

为了方便起见,在 project 目录下创建一个 main.h;
在这里插入图片描述
在 main.c 中的头文件包含如下;
在这里插入图片描述

2.5、设置 VScode 头文件路径

先创建 vscode 目录(在 VScode 中不好创建,直接在终端创建);
在这里插入图片描述
打开 c/c++ 配置器,在 VScode 中按住 ctrl + shift + p,输入 c/c++:ed 即可打开;
在这里插入图片描述
修改 c_cpp_properties.json 文件如下;
在这里插入图片描述
经过整理之后,现在的工程结构如下;
在这里插入图片描述
显然清晰且明,不再是乱乱的了。

3、重新编写 Makefile

在这里插入图片描述
原来的 Makefile 已经不能用了,需要重新编写才行,首先指定头文件和源文件;
在这里插入图片描述
需要使用 patsubst 函数,
在这里插入图片描述
在这里插入图片描述
测试一下 patsubst 函数的使用是否正确;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
wildcard 是关键字,可以让通配符在变量中展开,测试一下;
在这里插入图片描述
再来处理 obj 目录;
在这里插入图片描述
指定搜索路径;在这里插入图片描述
在这里插入图片描述
使用了 Makefile 的静态模式,$(SOBJS) : obj/%.o : %.s 这一行的意思是将所有的 .s 文件编译为 .o 文件并且存放到 obj 目录下, $(SOBJS) : obj/%.o : %.c 这一行的意思是将所有的 .c 文件编译为 .o 文件并且存放到 obj 目录下;
在这里插入图片描述
完整的 Makefile 文件如下;

CROSS_COMPILE   ?= arm-linux-gnueabihf-
TARGET          ?= ledcCC            := $(CROSS_COMPILE)gcc
LD            := $(CROSS_COMPILE)ld
OBJCOPY       := $(CROSS_COMPILE)objcopy 
OBJDUMP       := $(CROSS_COMPILE)objdumpINCUDIRS      := imx6u \bsp/clk \bsp/delay \bsp/led \SRCDIRS       := project \bsp/clk \bsp/delay \bsp/led \INCLUDE       := $(patsubst %,-I %, $(INCUDIRS))SFILES        := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/ *.s))
CFILES        := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/ *.c))SFILENDIR     := $(notdir $(SFILES))
CFILENDIR     := $(notdir $(CFILES))
SOBJS         := $(patsubst %, obj/%, $(SFILENDIR:.s=.o))
COBJS         := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))OBJS          := $(SOBJS) $(COBJS)VPATH         := $(SRCDIRS).PHONY:clean$(TARGET).bin : $(OBJS)$(LD) -Timx6ul.lds -o $(TARGET).elf $^$(OBJCOPY) -O binary -S $(TARGET).elf $@$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis$(SOBJS) : obj/%.o : %.s$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<$(COBJS) : obj/%.o : %.c$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<clean:rm -rf $(OBJS)rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).disprint:@echo INCLUDE = $(INCLUDE)@echo SFILES  = $(SFILES)@echo CFILES  = $(CFILES)@echo SFILENDIR  = $(SFILENDIR)@echo CFILENDIR  = $(CFILENDIR)@echo SOBJS  = $(SOBJS)@echo COBJS  = $(COBJS)

4、编译

编译之前,修改一下 imx6u.lds,将原来的 start.o 改为 obj/start.o,main.o 可以去掉,保存;
在这里插入图片描述
在终端输入 make,可以看到 obj 目录下有很多输出文件;
在这里插入图片描述
在终端输入 make clean,可以看到 obj 目录下的输出文件被清理了;
在这里插入图片描述

5、烧写验证

在终端输入 ./imxdownload ledc.bin /dev/sdb 即可;
在这里插入图片描述
可以看到开发板上 led1 以 500 ms 的间隔进行亮灭。

好了,总结一下,可以说本节(BSP 工程管理)创建了一个基本的 ARM 裸机开发的模板,本节又添加了很多东西在 Makefile 里面,现在已经比较完善了,以后对于不同的工程,只需要修改一下工程名头文件路径源文件路径即可,连接脚本也是不需要修改什么,为我们的学习提供了大大的方便,打下了基础。


http://www.ppmy.cn/ops/20884.html

相关文章

每天一个数据分析题(二百九十)——直方图与条形图

关于直方图与条形图的描述&#xff0c;下列说法正确的是&#xff08;&#xff09; A. 直方图用于展示分类型数据的分布情况 B. 直方图用来展示数值型数据的分布情况 C. 条形图只能用于展示顺序型数据的分布情况 D. 条形图只能用于展示分类型数据的分布情况 题目来源于CDA模…

合肥高新区党工委委员、管委会副主任方向民一行调研昂辉科技

4月24日&#xff0c;合肥高新区党工委委员、管委会副主任方向民&#xff0c;合肥高新区经发局产业处处长王佳奇&#xff0c;产业创新处陈珂&#xff0c;合肥高投投资管理二部副总经理张雪松&#xff0c;兴泰资本章延隽一行莅临昂辉科技调研指导。昂辉科技董事长方菱、总经理徐封…

Day17.一刷数据结构算法(C语言版) 654最大二叉树;617合并二叉树;700二叉搜索树中的搜索;98验证二叉搜索树

又是破防的一天...... 一.654最大二叉树 又是构造二叉树&#xff0c;昨天大家刚刚做完 中序后序确定二叉树&#xff0c;今天做这个 应该会容易一些&#xff0c; 先看视频&#xff0c;好好体会一下 为什么构造二叉树都是 前序遍历 题目链接&#xff1a;最大二叉树 文章讲解&…

windows ubuntu sed,awk,grep篇:2:sed 替换命令

目录 6.sed 替换命令语法 7.全局标志 g 8.数字标志(1,2,3 ….) 9.打印标志 p(print) 10.写标志 w 11.忽略大小写标志 i (ignore) 12.执行命令标志 e (excuate) 13.使用替换标志组合 14.sed 替换命令分界符 15.单行内容上执行多个命令 16.&的作用——获取匹配到的模式 17.分…

ES的索引和文档CRUD,RestHighLevelClient使用

目录 索引库操作 创建索引库和映射 查询索引库 修改索引库 删除索引库 文档操作 新增文档 查询文档 删除文档 修改文档 在Java中使用RestHighLevelClient mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型…

ARP模块——计算机网络

ARP模块指的是“地址解析协议”&#xff08;Address Resolution Protocol&#xff09;模块&#xff0c;这是计算机网络中用于将网络层的IP地址解析成链路层的物理地址&#xff08;如以太网MAC地址&#xff09;的一种协议。在IP网络中&#xff0c;设备之间的数据传输通常需要知道…

手写线程池|C语言版(二)|定义线程池的结构、创建线程池实例

文章目录 定义线程池结构任务结构体定义线程池结构体 组织头文件创建线程池实例函数原型定义线程池创建函数实现初始化线程池结构体指针初始化线程池结构体的各类参数 定义线程池的结构C代码创建线程池总体C代码 本文中&#xff0c;我们将创建线程池的结构体&#xff0c;该结构…

解决VMware启动异常

问题1&#xff1a;该虚拟机似乎正在使用中。如果该虚拟机未在使用&#xff0c;请按“获取所有权(T)”按钮获 取它的所有权。否则&#xff0c;请按“取消(C)”按钮以防损坏。 解决步骤&#xff1a; 按弹框提示的配置文件目录下删除后缀为lck的文件&#xff08;lock&#xff09;。…