zephyr驱动开发-2.1 源码结构体以及项目编译
参考文章:源码树结构 — Zephyr 项目中文文档
https://zephyr-doc.readthedocs.io/zh-cn/latest/kernel/overview/source_tree.html
1.下面只挑一般会使用到的文件夹讲解


boards: 板卡文件:包含多个厂商多款芯片的设备树,这是厂商写好的,我们不需要修改,但是后面需要查看设备树,假设下面我们找到nordic的板卡文件



这个就是nrf54l15的设备树,设备树相关的文件后缀有三种
.dts: 可以理解为有很多宏定义的.c文件
.dtsi: 可以理解为有很多宏定义的.h文件,为什么是.h,因为.dts文件可以通过#include来引用.dtsi文件,.dtsi文件类似.dts的补丁文件,可以将.dtsi中的宏定义补充或者覆盖.dts中的宏定义。

.overlay: 可以理解为前面两个的补丁文件,但是该文件不在内核源码的boards文件夹下,而是在自己的项目中,就拿上一节的官方例程为例,路径为C:\ncs\v2.9.1\nrf\samples\bluetooth\peripheral_uart

打开后可以看到里面只有比较少的代码,因为这是我们自己需要用到芯片的什么外设时添加上去的,目前该例程只用到了uart20外设,所以该文件可以理解为我们项目中的要写的设备树,前面两个文件我们不需要做修改,因为是厂商写的,关于设备树,我们需要修改的只是.overlay文件。
.dts, dtsi, .overlay文件我都使用了宏定义来解释,换成zephyr的概念来说,这些宏定义应该称呼为”节点", 每一个节点可以用来描述一个外设,描述一个GPIO口的作用,等等
这里先有一个概念就可以了,后面将在实践中用到我们再解释,不然什么知识点都解释的话,太多了
drivers:设备驱动模块,后面假设写一个I2C控制的芯片时可以参考怎么写驱动
include: 公有 API 的头文件,这里面会有驱动和应用层连接的中间层api,后面我们需要用到,这里讲一下驱动和应用分离,应该叫做 设备-驱动-应用三者分离,这就分出了三部分需要编写的代码,设备即在设备树中描述设备的信息,驱动则是写一个.c文件,在该.c文件中通过专门的api获取设备树中设备的信息,然后实现底层的函数,比如读写外部模块寄存器的函数,应用程序也是一个.c文件,通过专门的api函数访问驱动中写的api,而include文件夹下就有驱动和应用程之间连接的api。
sample: 这里面会有一些例程,供参考。
2.项目编译
2.1 通过命令行进行编译和烧录
2.1.1 编译:west build -d build_nrf54l15dk -b nrf54l15dk/nrf54l15/cpuapp -p
west build : 命令行工具,类似esp32的idf
-d build_nrf54l15: 指定编译产物存放到该文件夹中

这里的buidl_nrf54l15dk文件夹就是这么来的,如果build -d build_nrf54l15换成build -d build_aabbcc,该文件夹就会是build_aabbcc。
-b nrf54l15dk/nrf54l15/cpuapp: 这里是指定用哪个设备树,因为在zephyr内核源码中有很多厂商的设备树,那编译器怎么知道你要用哪个设备树,怎么知道你使用的什么芯片,这里就是决定使用哪个设备树,nrf54l15dk/nrf54l15/cpuapp其实就是 nrf54l15dk_nrf54l15_cpuapp,也就是下面图中的设备树文件:

同时注意,项目中可以存在多个编译产物,如果你执行了多次编译的命令,并且编译产物文件夹的名称不一样的话,会有多个产物,这时候如果要进行烧录,怎么知道烧录哪个编译产物中的固件呢
2.1.2 烧录:west flash -d build_nrf54l15dk_nrf54l15_cpuapp
表示将build_nrf54l15dk的编译产物作为烧录固件
这么看来,使用命令行进行编译和烧录其实比较麻烦以及容易出问题的;
2.2 使用vscode中的插件编译烧录
打开图中的插件



添加成功后会出现下面界面

在这里右键后选择Add Build Configuration



上面两图分别选择芯片以及设置编译产物文件的名称,点击Generate and Build后就可以了。
后面编译烧录就用图形化的按键即可。
更多推荐
所有评论(0)