正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-11.1,11.2-BSP文件目录组织

 前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第11.1讲, 11.2讲” 的读书笔记。第11.1,11.2讲介绍如何将我们写的C语言LED驱动程序组织成为一个业界典型的BSP目录的形式。

1. 将C语言LED驱动程序组织为BSP目录形式

上一节中移植了NXP SDK的文件到 C 语言LED驱动程序中,并调用 NXP SDK 里定义的api接口来设置GPIO 接口的IO接口复用模式和IO接口的电气特性,最后在 main.c 文件里调用api接口函数来实现 I.MX6ULL APLHA/Mini 开发板的 LED 指示灯闪烁。

在上一节的C语言LED驱动程序中,在 main.c 源文件中声明并定义了 'clk_init()', 'led_init()', 'delay_short()' , 'delay()' 这些函数并在 main.c 源文件中直接调用了这些函数。并且移植的 .h 头文件和 main.c 文件都是放在根目录下面的。在后续学习开发过程中,随着项目越来越复杂,项目的源文件也会越来越多,大量的源文件混在同一个根目录下面会让项目的管理变得混乱。本节中我们将会使用芯片驱动开发业界通用的模式,把项目的源码文件组织成BSP形式的目录形式,分门别类的把项目的源文件和头文件放到专门的目录里。按照BSP的方式来组织项目源码,项目的源码文件管理就变得清晰有条理。使用BSP的方式来管理项目的源码也从侧面反映出开发人员的是否有成熟专业素养。

BSP目录组织中的主要目录如下:

目录描述
bsp该目录存放项目的 BSP 开发 api 接口源码,和芯片底层相关的API接口的文件都放在该目录下
imx6u该目录存放项目存放特定处理器相关的文件,例如 I.MX6ULL 芯片的寄存器地址文件。
obj项目编译出来的 .o 中间文件放在这个目录
project项目的主体源码文件存放在该目录下,如 main.c start.s 

2. 根据BSP目录格式写Makefile

按照BSP的方式来组织项目源码,项目的源码文件按照类别分别放在了不同的目录里,例如 'bsp/', 'project', 'imx6u'等,之前的Makefile就不能满足当前这种多层目录结构的项目组织形式,我们需要修改 Makefile 来编译 BSP这种多层目录结构的源码。

本节Makefile将使用多用的make函数语法,本节写的是一个通用的makefile,在后续的正点原子 I.MX6U 裸机开发例程中都将使用本节写的Makefile,仅仅需要多Makefile做很小的修改就能适应不同的I.MX6U开发实验例程。

本节会使用到的makefile语法,主要有以下几种:

makefile函数:描述:
$(foreach <var>,<list>,<text>)这个函数的意思是,把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。
 
$(patsubst <pattern>,<replacement>,<text>)查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。这里,<pattern>可以包括通配符“%”, 表示任意长度的字串
 
$(wildcard $(dir)/*.c)wildcard 函数在定义变量的地方将通配符‘*’进行扩展,如果有符合通配符的格式字符串就返回改字符串,如果没有符合通配符格式的字符串就返回空。

通过这些makefile 模式匹配,模式替换,模式扩展函数,我们的新Makefile的内容如下,这是一种通用的 makefile 格式,它通过对 BSP 子目录里源文件的匹配替换,makefile语法格式中的模式替换函数对字符串的操作,实现了对BSP子目录中“*.c”,"*.s" 源文件的自动搜索并生成以来关系。在后续的正点原子I.MX6ULL APHAP/Mini开发例程实验里,只需要在makefile里加上BSP的子目录,就可以自动的生成编译目标的以来关系。

CROSS_COMPILE	?= arm-linux-gnueabihf-
TARGET 		:= ledc

CC			:= 	$(CROSS_COMPILE)gcc
LD			:= 	$(CROSS_COMPILE)ld
OBJCOPY		:= 	$(CROSS_COMPILE)objcopy
OBJDUMP		:= 	$(CROSS_COMPILE)objdump


INCLUDEDIRS :=  bsp/clk \
				bsp/delay \
				bsp/led \
				imx6ull

SRCDIRS		:=	bsp/clk \
				bsp/delay \
				bsp/led \
				project

INCLUDE		:= 	$(patsubst %, -I %, $(INCLUDEDIRS))


#SFILES		:=	$(patsubst %.s,%.s,$(wildcard $(SRCDIRS)/*.s))
#CFILES		:=	$(patsubst %.c,%.c,$(wildcard $(SRCDIRS)/*.c)) 
#SFILES		:=	$(wildcard $(SRCDIRS)/*.s)
#CFILES		:=	$(wildcard $(SRCDIRS)/*.c)

#错误的语法格式,因为 $(wildcard $(SRCDIRS)/*.c) 展开之后为 "$(wildcard bsp/clk bsp/delay bsp/led project/*.c)",这样只有最后一个展开为了 $(wildcard project/*.c)的形式
#按照我们的预期,应该使用 Makefile 的 $(foreach var,list,text) 函数
##

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)


$(TARGET).bin : $(OBJS)
	echo $(LD) $(TARGET).elf
	$(LD) -Timx6u.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

# #%.o : %.s
$(SOBJS) : obj/%.o : %.s
	$(CC) -Wall -nostdlib $(INCLUDE) -c -o $@ $<

#%.o : %.c
$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib $(INCLUDE) -c -o $@ $<

clean:
	rm -rf obj/*.o $(TARGET).bin $(TARGET).elf


.PHONY : print clean 

print:
	@echo "INCLUDE=" $(INCLUDE)
	@echo "SFILES="  $(SFILES)
	@echo "CFILES="  $(CFILES)
	@echo "SFILENDIR=" $(SFILENDIR)
	@echo "CFILENDIR=" $(CFILENDIR)
	@echo "SOBJS="   $(SOBJS)
	@echo "COBJS="   $(COBJS)
	@echo "OBJS="    $(OBJS)

3. 修改 imx6u.lds 链接文件

修改Makefile之后,执行编译项目,编译器输出如下错误:

错误提示信息显示,实在链接阶段 'ld' 找不到 'start.o'文件,因为本节中我们把LED驱动源程序组织成了 BSP 目录格式形式,所以在  imx6u.lds 链接文件中之前指定的 'start.o' ,在当前目录下就找不到 start.o 文件,在新的编译目录该文件的路径是 './obj/start.o' 所以需要修改 imx6u.lds 链接文件,执行 start.o 的文件目录为新的位置。

修正 imx6u.lds 链接文件之后,重新执行“make”命令进行编译,项目可以正确的编译成功并生成 .bin 文件。

4. 烧录SD卡,并验证LED灯是否正常闪烁

烧录SD卡验证LED灯,使用正点原子提供的 'imxdownload' 烧录SD卡,然后把SD卡查到正点原子 I.MX6U APLHA/Mini 开发板上验证移植的 NXP SDK LED 灯驱动程序是否运行正常,LED灯正常闪烁。我本地实验验证结果是 LED 正常闪烁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的全国风景区WebGIS按省展示实践

目录 前言 一、全国风景区信息介绍 1、全国范围内数据分布 2、全国风景区分布 3、PostGIS空间关联查询 二、后台查询的设计与实现 1、Model和Mapper层 2、业务层和控制层设计 三、WebGIS可视化 1、省份范围可视化 2、省级风景区可视化展示 3、成果展示 总结 前…

【Vulhub靶场】Nginx 中间件漏洞复现

【Vulhub靶场】Nginx 中间件漏洞复现 一、Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09;1. 影响版本2. 漏洞原理3. 漏洞复现 二、Nginx越界读取缓存漏洞&#xff08;CVE-2017-7529&#xff09;1. 漏洞详情2. 影响版本3. 漏洞复现 三、Nginx 配置错误导致漏洞&…

建发弘爱 X 袋鼠云:加速提升精细化、数字化医疗健康服务能力

厦门建发弘爱医疗集团有限公司&#xff08;简称“建发弘爱”&#xff09;创立于2022年&#xff0c;是厦门建发医疗健康投资有限公司的全资子公司&#xff0c;专业从事医疗健康领域的医疗服务。 建发弘爱通过医疗、健康及产业服务三大板块&#xff0c;为百姓提供医疗和健康全生…

【MySQL基本查询(下)】

文章目录 一、update案例 二、Delete案例注意&#xff1a;delete 全表数据的行为慎用&#xff01;truncate 三、插入查询结果案例 四、了解一些函数1.count函数2.sum函数3. avg函数4.max函数5. min函数 五、group by子句的使用案例having和where 一、update 该关键字的功能就是…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决&#xff1a;关键文件缺失&#xff0c;多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

(Mac)RocketMQ的本地安装测试(详细图示)

目录 部署服务 namesrv / broker下载解压缩运行 namesrvnohup ./bin/mqnamesrv & 启动命令详解运行 broker 测试收发消息运行自带的生产者测试类运行自带的消费者测试类 部署 Dashboard 可视化下载打包运行访问 部署服务 namesrv / broker 下载解压缩 官网下载 https://r…

Excel——项目管理,设置时间到期自动提醒及颜色高亮

效果图 第一步、自动获取合同到期日期 1、首先合同【签约日期】和【到期日期】下面的数据必须是日期格式&#xff0c;不能是其它的格式否则无法计算&#xff0c;如果是其它格式需要转换成标准的日期格式&#xff0c;如下图所示。 2、在“到期日期”下面的第一个单元格中输入公…

7 系列 FPGA 产品介绍及选型

目录 Spartan-7 FPGAsArtix-7 FPGAsKintex-7 FPGAsVirtex-7 FPGAsFPGA芯片命名规则DSP资源BRAM资源Transceivers 资源Transceivers 总带宽I/O 个数及带宽参考文档 Spartan-7 FPGAs Artix-7 FPGAs Kintex-7 FPGAs Virtex-7 FPGAs FPGA芯片命名规则 DSP资源 BRAM资源 Transceiver…

快速上手prometheaus grafana 监控

介绍 prometheaus 一个定时输出指标数据的巡检组件&#xff1f; grafana 一个读取指标&#xff0c;可视化的提供了好看界面的组件&#xff1f; 教程 如何和springboot项目集成 【IT老齐153】超级实用&#xff01;十分钟掌握Prometheus与Grafana监控SpringBoot应用_哔哩哔哩_…

100000订单直接拒掉,君子爱财,取之有道

近一个月询盘可谓寥寥无几&#xff0c;成交率为0&#xff0c;今天好不容易接了一个客户询盘&#xff0c;订单总价高达100000&#xff0c;听完细节直接拒掉&#xff0c;至于原因懂的都懂&#xff0c;不懂得等我慢慢道来。 前两天有2个询盘&#xff0c;其中一个是二次开发&#x…

【Python爬虫实战入门】:教你一个程序实现PPT模版自由

文章目录 &#x1f4a5;一、PPT模版爬取&#x1f525;1.1 第一个爬虫&#x1f6b2;1. 获取下载页面链接 ❤️1.2 第二个爬虫&#x1f6b2;1.3 第三个爬虫&#x1f388;2. 文件保存 ❤️1.4 翻页处理 &#x1f525;二、完整代码 &#x1f525;&#x1f525;&#x1f525; Pytho…

大腾智能网站正式上线

4月30日&#xff0c;我们翘首以盼的时刻终于来临&#xff0c;大腾智能官网&#xff08;www.da-teng.com&#xff09;正式上线&#xff0c;我们对此感到无比兴奋和自豪&#xff01;此刻&#xff0c;我们诚挚地邀请每一位朋友&#xff0c;共同踏上这个全新的数字之旅&#xff0c;…

从需求到实现的关键

版本封面 内容&#xff1a;产品logo&#xff0c;项目名称&#xff0c;所属公司&#xff0c;产品名称&#xff0c;文档类型&#xff0c;版本号&#xff0c;时间&#xff0c;相关人员&#xff08;最好说明下负责人&#xff09;。 作用&#xff1a; 突出重要信息&#xff0c;将…

【软考高项】三十八、风险管理7个过程

一、规划风险管理 1、定义、作用 定义&#xff1a;定义如何实施项目风险管理活动的过程作用&#xff1a;确保风险管理的水平、方法和可见度与项目风险程度相匹配&#xff0c;与对组织和其他干系人的重要程度相匹配 2、输入 项目管理计划 项目章程 项目文件 干系人登记册…

debian10 (armbian) 配置CUPS 服务

更新apt apt-update安装相关软件 apt-get install ghostscript apt-get install dc apt-get install foomatic-db-engine apt-get install cups3.修改配置文件 nano /etc/cups/cupsd.conf Listen localhost:631改为 Listen 0.0.0.0:631 以下四段配置加入Allow All # Only li…

中国地面气候资料日值数据获取方式

数据简介 环境气象数据服务平台提供了全国大约2100个点位&#xff0c;2000年至2023年的逐日数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF reanalysis-era5-land、reanalysis-era5-single-levels 以及中国2100站点地面气候资料日值观测数据&#xff0c;使用机器…

GAMMA Lab——知识图谱和LLM大模型

图机器学习的发展与分类 图基础模型 LLM基础模型 GNN LLM 前沿工作

Box86源码解读记录

1. 背景说明 Github地址&#xff1a;https://github.com/ptitSeb/box86 官方推荐的视频教程&#xff1a;Box86/Box64视频教程网盘 2. 程序执行主体图 Box86版本: Box86 with Dynarec v0.3.4 主函数会执行一大堆的初始化工作&#xff0c;包括但不限于&#xff1a;BOX上下文 …

Golang面向对象编程(一)

文章目录 结构体基本介绍结构体定义方式创建结构体变量结构体内存对齐结构体类型转换字段的Tag标签 方法基本介绍方法的定义和调用方法调用的传参机制String方法 结构体 基本介绍 基本介绍 Go支持面向对象编程特性&#xff0c;包括封装、继承和多态&#xff0c;但Go中没有类&a…

技术创作者在千帆AppBuilder中获得的极致体验

目录 前言 千帆AppBuilder简介 传统的技术文章写作方式 借助千帆AppBuilder提高写作质量和效率 千帆AppBuilder详细搭建步骤 1、注册百度智能云账号 2、登录百度智能云控制台 3、创建千帆AppBuilder应用 4、配置千帆AppBuilder应用 5、调试和发布千帆AppBuilder应用 …
最新文章