前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第532篇技术报告,由李江伟整理,题目为:
“Zephyr RTOS适配Cortex-R5”
作者简介
![](/__local/B/1B/0D/2C7B58C0FF2A777784A802237F5_B67F1620_35D49.png)
M Tamseel Shams拥有近4年的嵌入式系统软件和Linux驱动程序开发经验。他的主要工作集中在LPDDR、GDDR等内存技术。之前他曾研究过PMU、SPI、UART、PWM、ADC、Droop Detector、RTIC 等技术。为 Linux 社区做出了大量贡献。
文章简介
本文主要介绍将Zephyr RTOS成功移植到SoC(Cortex-R5)的关键步骤。首先,会对Zephyr RTOS进行一些简单的介绍。随后,会详细探讨移植过程中的主要步骤,包括添加新的系统级芯片、开发板、驱动和设备树。最后,还提供了调试技巧,关键工具和构建命令,并深入讨论了定时器和串口驱动的实现。整体而言,文章提供了一个全面而深入的指南,帮助开发者成功将Zephyr操作系统移植到Cortex-R5架构的SoC,并对未来的发展方向进行了展望。
Zephyr RTOS适配Cortex-R5
Zephyr RTOS介绍
特点概述:
![](/__local/4/78/E9/12485A1D128248A9AE5297DCB8E_2FF7D83B_2DD48.png)
移植步骤
本节将讨论主要的文件夹更改,包括:
添加新的系统级芯片
添加新的设备树
添加新的开发板
添加新的驱动
![](/__local/E/1F/86/97F7CECE1C16F5268DD2CD98192_A8EB0278_1616D.png)
添加新的系统级芯片
芯片信息
架构:arm
CPU内核:CORTEX_R5
SoC系列:CR5
驱动:串行,定时器,中断等
-
![](/__local/3/3D/2F/66409E7616822547EAEA00BC5C3_501419DA_5420.png)
build/<board>/zephyr/.config
build/<board>/zephyr/include/generated/autoconf.h
build/<board>/zephyr/include/generated/generated_dts_board.conf
build/<board>/zephyr/include/generated/generated_dts_board.h
soc/<architecture>/<soc_family>/<soc_series>/(soc/arm/samsung_xyz/cr5/)
boards/<architecture>/<board_name>/<board_name>_defconfig (boards/arm/samsung_xyz/samsung_cr5_defconfig)
dts/<architecture>/<vendor>/<vendor>_<soc_name>.dtsi(dts/arm/samsung_xyz/samsung_cr5.dtsi)
添加DTS文件
设备树包括包含主要SoC详情和IP节点(如IRQ控制器)的文件、CPU信息等。
这些dtsi文件将包含在实际的电路板dts文件中。
Dtsi文件是可重复使用的,并没有严格规定每个soc都要创建新的dtsi文件,位于:
dts/<architecture>/<vendor>/<vendor>_<soc_name>.dtsi(dts/arm/samsung_xyz/samsung_cr5.dtsi)
![](/__local/E/E9/E8/FB73E4E6177CAA6AC9219611C8C_E0C03CD2_27895.png)
添加开发板
boards/<architecture>/<board_name>/(boards/arm/samsung_xyz/)
这里将定义执行局特定的启动信息。
包含一个<board_name>_defconfig文件,用于选择所包含的SoC以及基本功能和接口。
在编译Zephyr映像时,我们总是参考电路板名称,其中间接包含了所有与soc、dtsi相关的信息。
包含一个board.h文件,供驱动程序和应用程序使用。
可提供board.cmake以指导如何闪存/调试。
包括一个<board_name>.yaml文件来列出电路板的属性:例如flash和ram的大小和所使用的工具链等。
![](/__local/6/C6/D6/CD6D7C5ACDB9F7CBAE6C1B3A6DA_2464470D_1A680.png)
添加驱动
drivers/<driver_type>/
• 除驱动程序文件外,还需要创建Kconfig文件或在主Kconfig文件中提供驱动程序条目
• 在该驱动程序文件夹的CMakeList中添加相应的驱动程序条目
/drivers/serial/
├── CMakeLists.txt
├── Kconfig
|── Kconfig.cr5
• #define DT_DRV_COMPAT cr5_uart(与设备树兼容名称相同)
• DEVICE_AND_API_INIT这个宏有不同的变体,参数也各不相同,但都是将驱动程序添加到启动序列中
• 将驱动程序 API 与 zephyr 框架挂钩
调试技巧
关键工具和构建命令
• Cmake -> 保存所有源代码构建步骤
• Yaml -> 这些文件提供有关帮助命令的信息,主要用于文档编制
• West -> 该工具提供的构建命令内部使用cmakelist,这些cmakelist定义在每个子目录中
定时器
定时器是一个内核对象,使用内核的系统时钟测量时间的流逝。
当达到计时器的指定时限时,它可以执行应用程序定义的操作,或者等待。
可以定义任意数量的计时器。每个计时器都由其内存地址引用。
计时器具有以下关键属性:持续时间、时间周期、过期功能、停止功能。
可用于使用计时器的实现:
• 定义计时器-使用k_timer类型的变量来定义计时器。然后,必须通过调用k_timer_init()来初始化它
• 使用计时器过期函数(Timer Expiry Function)
• 读取计时器状态
• 使用计时器状态同步
串口驱动
这个示例演示了如何用一个简单的回声机器人来使用UART串行驱动程序。
它从控制台读取数据,并在接收到行结束(返回键)后回溯字符。
轮询API用于发送数据,而中断驱动的API用于接收数据。
默认情况下,使用通常用于Zephyr外壳的UART外围设备,因此几乎应该支持每个板。
编译和运行
west build -b nrf52840dk_nrf52840 samples/drivers/uart/echo_bot
west flash
Hello! I\'m your echo bot.
Tell me something and press enter:
# Type e.g. "Hi there!" and hit enter!
Echo: Hi there!
未来展望
Zephyr已为大多数通用驱动程序提供了框架,但如何在其中添加单个驱动程序仍是个问题。有待探索。
设备树可以保存大多数IP硬件的详细信息,如时钟、IRQ 线路、地址、寄存器设置等,所有这些条目都可以通过定义的宏从设备驱动程序本身读取,需要对这些宏进行探索。
所有预先定义的链接器脚本、dtsi文件都可以在构建过程中修改和使用。如果遇到任何启动问题,需要对这一领域进行探索。