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

news2024/10/6 10:37:51

 前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]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.coloradmin.cn/o/1642573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PowerJob】从源码编译到k8s部署

前言 虽然PowerJob官方说支持JPA各种数据源&#xff0c;但在PG数据库的兼容性上&#xff0c;确实存在小问题&#xff0c;issue也有相关原理描述&#xff0c;官方采用的优雅方式并未真正解决问题&#xff0c;因为只解决了从Lob字段读取的时候&#xff0c;自动建表的时候还是会生…

手机恢复出厂设置ip地址会变吗

当我们对手机进行恢复出厂设置时&#xff0c;很多人会担心手机的IP地址是否会发生变化。IP地址对于手机的网络连接至关重要&#xff0c;它决定了手机在网络中的身份和位置。那么&#xff0c;手机恢复出厂设置后&#xff0c;IP地址到底会不会发生变化呢&#xff1f;虎观代理小二…

OneFlow深度学习框原理、用法、案例和注意事项

本文将基于OneFlow深度学习框架&#xff0c;详细介绍其原理、用法、案例和注意事项。OneFlow是由中科院计算所自动化研究所推出的深度学习框架&#xff0c;专注于高效、易用和扩展性强。它提供了一种类似于深度学习库的接口&#xff0c;可以用于构建神经网络模型&#xff0c;并…

CMakeLists.txt语法规则:部分常用命令说明四

一. 简介 前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;部分常用命令说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;部分常用命令说明二-CSDN博客 CMakeLi…

mac nvm install node<version> error 404

mac m2芯片遇到的问题&#xff0c;估计m系列的应该也有这个问题&#xff0c;在这里记录一下 解决方案&#xff1a; ## 需要先处理一下兼容就OK了arch -x86_64 zsh nvm install returns curl: (22) The requested URL returned error: 404 Issue #2667 nvm-sh/nvm GitHub

平平科技工作室-Python-猜数字游戏

一.代码展示 import random print(__猜数字游戏__) print(由平平科技工作室制作) print(游戏规则:1至10随机数随便猜) print (三次没猜对游戏结束) numrandom.randint (1,10) for i in range(3):aint(input(输入你想要猜测的数字))if a>num:print (数字猜的有点大了)elif a…

Three.js的摄像机

什么是摄像机 一般情况下&#xff0c;显示屏是二维的&#xff0c;如何把三维的场景显示到屏幕上呢&#xff1f;摄像机就是这样的一个抽象&#xff0c;它定义了三维空间到二维屏幕上的投影方式。 根据投影方法的不同&#xff0c;摄像机又分为正交投影照相机和透视投影摄像机。…

未发表!QRCNN-BiGRU-MultiAttention实现区间预测!轻松发顶刊!区间预测全家桶再更新!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 结果展示 数据介绍 原理讲解与流程 1.CN…

IOS 开发 - block 使用详解

1.Blobk的定义 block的写法相对难记,不必司机应被,只需要在xcode里打出"inlineBlock"--回车, 系统会自动帮你把基础版写法给你匹配出来 //Block的基础声明//等号""之前是blobk的声明,等号“”后面是block的实现/*returnType:返回类型(void、int、String *…

设计模式——行为型模式——策略模式

策略模式 定义 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。 策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&a…

ThreeJS:常见几何体与基础材质入门

在前文《ThreeJS:Geometry与顶点|索引|面》中&#xff0c;我们了解了与Geometry几何体相关的基础概念&#xff0c;也尝试了如何通过BufferGeometry自定义几何体。 常见Geometry几何体 ThreeJS内部也提供了诸多封装好的几何体&#xff0c;常见的Geometry几何体如下图所示&#…

Java | Leetcode Java题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuffer ans new StringBuffer();int n Math.max(a.length(), b.length()), carry 0;for (int i 0; i < n; i) {carry i < a.length() ? (a.charAt(a.leng…

【平衡二叉树】AVL树(右单旋和左单旋的情况)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | 初阶数据结构 | Linux 文章目录 1. AVL树的定义2. C实现AVL树2.1 插入——左左型的右旋2.2 插入——右右型的左旋 3. 总结 1. AVL树的定…

本地部署大模型ollama+docker+open WebUI/Lobe Chat

文章目录 大模型工具Ollama下载安装运行Spring Ai 代码测试加依赖配置写代码 ollama的web&Desktop搭建部署Open WebUI有两种方式Docker DesktopDocker部署Open WebUIDocker部署Lobe Chat可以配置OpenAI的key也可以配置ollama 大模型的选择 本篇基于windows环境下配置 大模型…

【多变量控制系统 Multivariable Control System】(3)系统的状态空间模型至转换方程模型(使用Python)【新加坡南洋理工大学】

一、转换式 二、系统的状态空间模型 由矩阵A, B, C, D给出&#xff1a; 三、由状态空间模型转化为转换方程模型 函数原型&#xff08;版权所有&#xff1a;scipy&#xff09;&#xff1a; def ss2tf(A, B, C, D, input0):r"""State-space to transfer functi…

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计

毕业设计&#xff08;论文&#xff09;任务书 毕业设计&#xff08;论文&#xff09;题目&#xff1a; 基于大数据的高考志愿推荐系统 设计&#xff08;论文&#xff09;的主要内容与要求&#xff1a; 主要内容&#xff1a; 高…

Unity 编辑器工具 - 资源引用查找器

在Unity项目开发过程中&#xff0c;管理和维护资源之间的引用关系是至关重要的。当然我们项目也是需要这个功能 毕竟项目大了之后查找资源引用还是交给 资源引用查找器 比较好。 功能概述 资源引用查找器允许开发者选择一个目标资源&#xff0c;并在整个项目中查找引用了该资…

STM32:GPIO输出

文章目录 1、GPIO介绍1.1 GPIO的基本结构1.1 GPIO的位结构 2、 GPIO工作模式3、GPIO标准外设库接口函数3.1 RCC接口函数3.2 GPIO接口函数3.2.1 GPIO的读取函数3.2.1 GPIO的写入函数 4、GPIO的初始化 1、GPIO介绍 GPIO&#xff08;General Purpose Input Output&#xff09;通用…

腾讯云CentOS7使用Docker安装ElasticSearch与Kibana详细教程

文章目录 一、安装ElasticSearch二、安装Kibana 一、安装ElasticSearch 使用Docker拉取ElasticSearch镜像 这里版本选择的是7.15.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.22. 查看ElasticSearch的镜像id docker images3. 创建ElasticSearch容器 …

Linux基础指令001

名称日期版本说明作者了解并熟练运用Linux基础指令2024/05/04v0.0.1汇总篇lgb 一&#xff0c;了解Linux,并安装 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协…