正点原子[第二期]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 		:= ledcCC			:= 	$(CROSS_COMPILE)gcc
LD			:= 	$(CROSS_COMPILE)ld
OBJCOPY		:= 	$(CROSS_COMPILE)objcopy
OBJDUMP		:= 	$(CROSS_COMPILE)objdumpINCLUDEDIRS :=  bsp/clk \bsp/delay \bsp/led \imx6ullSRCDIRS		:=	bsp/clk \bsp/delay \bsp/led \projectINCLUDE		:= 	$(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.rhkb.cn/news/324020.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具&#xff0c;专为Mac用户打造&#xff0c;旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式&#xff0c;用户可轻松创建各种标签、信封和卡片&#xff0c;满足个性化需…

【CSDN搜材料的小技巧】怎么快速查到高质量最新的内容

问题描述: 我最近搜CSDN已经搜累了&#xff0c;好多东西明显是有问题的&#xff0c;还有一堆人复制粘贴&#xff0c;从海量文章中提取出最新且高质量文章成了当务之急&#xff01; 解决方案: 我本来想写个爬虫按照文章的收藏或者点赞排序的&#xff0c;无意中看到了这篇文章…

基于Spring Cloud的房产销售平台设计与实现

基于Spring Cloud的房产销售平台设计与实现 开发语言&#xff1a;Java 框架&#xff1a;SpringCloud JDK版本&#xff1a;JDK1.8 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 前台首页界面&#xff0c;前台首页包括房源信息、…

重载,重写,重定义,纯虚函数,多态习题

只要不够成重写就是重定义。 重定义&#xff1a; 抽象类&#xff1a; 包含纯虚函数的类就是抽象类。 1.纯虚函数的作用&#xff0c;强制子类去完成重写。 2.表示抽象的类型。 抽象就是在现实中没有对应的实体。 1. 下面哪种面向对象的方法可以让你变得富有( a) A 继承 B…

Google搜索广告怎么开户?谷歌广告开户投放引流技巧、账户搭建、谷歌ads广告推广投放策略 #搜索引擎 #谷歌广告#互联网营销

Google搜索广告开户步骤&#xff1a; 选择代理商&#xff1a;首先&#xff0c;您需要选择一个经验丰富、信誉良好的Google广告代理商。可以选择上海上弦来广告开户和代运营。 初步咨询&#xff1a;与代理商进行初步沟通&#xff0c;了解他们的服务内容、成功案例、收费标准等。…

上海AI Lab开源首个可替代GPT-4V的多模态大模型

与开源和闭源模型相比&#xff0c;InternVL 1.5 在 OCR、多模态、数学和多轮对话等 18 个基准测试中的 8 个中取得了最先进的结果。 上海AI Lab 推出的 InternVL 1.5 是一款开源的多模态大语言模型 (MLLM)&#xff0c;旨在弥合开源模型和专有商业模型在多模态理解方面的能力差距…

Agent AI智能体的未来

Agent AI智能体的未来 Agent AI智能体代表了人工智能在智能个人助理和虚拟代理人领域的最新进展。未来&#xff0c;Agent AI智能体将继续发挥着重要的作用&#xff0c;并且在以下几个方面实现更多的发展和创新&#xff1a; 个性化服务&#xff1a;Agent AI智能体将通过对用户行…

5月白银现货最新行情走势

美联储5月的议息会议举行在即&#xff0c;但从联邦公开市场委员会&#xff08;FOMC&#xff09;近期透露的信息来看&#xff0c;降息似乎并没有迫切性。——美联储理事鲍曼认为通胀存在"上行风险"&#xff0c;明尼阿波利斯联邦储备银行行长卡什卡利提出了今年不降息的…

华为招聘目的:不是筛选人才,而是筛选忠诚度。。

华为招聘 日常瞎逛发现一篇「机械应届生锐评华为」的帖子&#xff1a; 楼主提到&#xff1a;华为很会营销&#xff0c;华为和爱国之间的等号已经植入到老一辈的思想中&#xff0c;这就导致家里父母总是不断关心华为招聘的进展。 虽然楼主原本并不反感华为&#xff0c;但却被本次…

git 常用命令 git怎么撤销命令 持续更新中!!!!

基本流程 # 拉取仓库 git clone 仓库地址 # 拉取最新版本 git pull # 本地提交 git add . git commit -m "本次提交信息&#xff01;" # 推送上云 git push分支 # 创建分支 git checkout -b cart # 删除本机的分支 git branch -d cart # 切换分支 本地切换到主分支…

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度&#xff0c;还增强了用户界面的动态性和交互性&#xff0c;允许开发者将应用界面划分为多个独立、可重用的部分&#xff0c;每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…

self-attention 的 CUDA 实现及优化 (上)

self-attention 的 CUDA 实现及优化 (上) 导 读 self-attention 是 Transformer 中最关键、最复杂的部分&#xff0c;也是 Transformer 优化的核心环节。理解 self-attention &#xff0c;对于深入理解 Transformer 具有关键作用&#xff0c;本篇主要就围绕 self-attention 展…

机器学习每周挑战——二手车车辆信息交易售价数据

这是数据集的截图 目录 背景描述 数据说明 车型对照&#xff1a; 燃料类型对照&#xff1a; 老规矩&#xff0c;第一步先导入用到的库 第二步&#xff0c;读入数据&#xff1a; 第三步&#xff0c;数据预处理 第四步&#xff1a;对数据的分析 第五步&#xff1a;模型建…

unreal engine4 创建动画蒙太奇

UE4系列文章目录 文章目录 UE4系列文章目录前言一、创建动画蒙太奇 前言 动画蒙太奇的官方解释&#xff1a;Animation Montages are animation assets that enable you to combine animations in a single asset and control playback using Blueprints.You can use Animation…

postman常用功能超全使用教程

Postman 使用 一、Postman 简介 Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求(如:get/post/delete/put…等等),将请求数据发送至服务端,获取对应的响应结果。 二、Postman 功能简介 三、Postman 下载安装 Post…

shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)

目录 一、GeoJSON是什么 二、GeoJSON的结构组成 2.1、点&#xff08;Point&#xff09;数据示例 2.2、线&#xff08;LineString&#xff09;数据示例 2.3、面&#xff08;Polygon&#xff09;数据示例 2.4、特征&#xff08;Feature&#xff09;数据示例 2.5、特征集合&…

element ui的table多选

使用el-table的selection-change事件来获取选中的值&#xff1b; 例&#xff1a; html代码&#xff1a; <el-button type"primary" click"openTableSet">列表设置</el-button><!-- 列表设置弹框 --> <el-dialog :close-on-click-mo…

在uniapp里面使用 mp-html 并且开启 latex 功能

在uniapp里面使用 mp-html 并且开启 latex 功能 默认情况下 mp-html 是不会开启 latex 功能的, 如果需要开启 latex 功能是需要到代码操作拉取代码自行打包的。 这里说一下 mp-html 里面的 latex 功能是由 https://github.com/rojer95/katex-mini 提供的技术实现&#xff0c;…

五一反向旅游,景区“AI+视频监控”将持续助力旅游业发展

一、建设背景 每年五一劳动节出去旅游都是人挤人状态&#xff0c;这导致景区的体验感极差。今年“五一反向旅游”的话题冲上了热搜&#xff0c;好多人选择了五一之后再出去旅游&#xff0c;避开拥挤的人群&#xff0c;这个时候景区的监管力度和感知能力就更要跟上去&#xff0…

Cargo - 构建 rust项目、管理依赖包

文章目录 关于 Cargo构建项目创建工程编译运行buildclean 管理依赖添加依赖updatecheck计时 manual rust 安装可参考&#xff1a;https://blog.csdn.net/lovechris00/article/details/124808034 关于 Cargo Cargo 官方文档 &#xff1a; https://doc.rust-lang.org/cargo/crat…