目前的位置: 首页 学术信息 正文

ZDS 2023技术报告分享第53篇:Zephyr RTOS适配Cortex-R5


前言

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



作者简介

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介绍

特点概述:

  • Zephyr是一个小型的实时操作系统(RTOS),适用于资源受限的嵌入式设备。

  • Zephyr操作系统基于小规模内核,提供与linux内核类似的功能。如内存管理、多线程、调度程序、中断处理等。

  • 支持多种CPU架构。

  • 提供构建系统的工具:

    • west,可以轻松编译多个内核模块以及用户应用程序

    • SDK,包含适用于不同架构的编译工具


移植步骤

本节将讨论主要的文件夹更改,包括:

  • 添加新的系统级芯片

  • 添加新的设备树

  • 添加新的开发板

  • 添加新的驱动


添加新的系统级芯片

  • 芯片信息

    • 架构:arm

    • CPU内核:CORTEX_R5

    • SoC系列:CR5

    • 驱动:串行,定时器,中断等

    • 开发板:三星开发板

  • 顶层硬件配置通过 Kconfigs 定义,最终处理结果位于文件中:

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_FAMILY、SOC_SERIES、SOC和SOC_PART_NUMBER配置,每个SoC文件夹都包含处理器、IRQ控制器、闪存详情、链接器、soc相关初始配置的所有基本信息,位于:

soc/<architecture>/<soc_family>/<soc_series>/(soc/arm/samsung_xyz/cr5/)
  • 默认架构,SOC_FAMILY和SOC_SERIES配置位于:

boards/<architecture>/<board_name>/<board_name>_defconfig (boards/arm/samsung_xyz/samsung_cr5_defconfig)
  • dtsi定义了SoC中的外设和功能属性,位于:

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)
  • 无需额外的运行时内存来存储DTB Blob,而是在编译时使用DTS信息。

  • 然后使用YAML绑定中指定的规则对编译后的DTS文件进行交叉检查。提取的信息被放入一个头文件中,在编译项目时供其余代码使用。


添加开发板

  • 该文件夹代表实际应用硬件,位于:

boards/<architecture>/<board_name>/(boards/arm/samsung_xyz/)

  • 这里将定义执行局特定的启动信息。

  • 包含一个<board_name>_defconfig文件,用于选择所包含的SoC以及基本功能和接口。

  • 在编译Zephyr映像时,我们总是参考电路板名称,其中间接包含了所有与soc、dtsi相关的信息。

  • 包含一个board.h文件,供驱动程序和应用程序使用。

  • 可提供board.cmake以指导如何闪存/调试。

  • 包括一个<board_name>.yaml文件来列出电路板的属性:例如flash和ram的大小和所使用的工具链等。


添加驱动

  • 位于:

drivers/<driver_type>/
  • 新驱动程序添加到驱动程序文件夹下,如果驱动程序与任何特定协议(如串行、DMA、USB 等)有关,则应添加到该子文件夹下。

  • 通过Kconfigs和设备进行选择和配置树。

  • 在内核启动过程中进行初始化。

  • 描述设备树节点和属性的Yaml文件。

  • 设备树文件来定义驱动程序属性和配置。

  • 将驱动程序添加到编译程序的步骤:

• 除驱动程序文件外,还需要创建Kconfig文件或在主Kconfig文件中提供驱动程序条目

• 在该驱动程序文件夹的CMakeList中添加相应的驱动程序条目

/drivers/serial/

├── CMakeLists.txt

├── Kconfig

|── Kconfig.cr5

  • 将驱动程序添加到启动序列的步骤:

• #define DT_DRV_COMPAT cr5_uart(与设备树兼容名称相同)

• DEVICE_AND_API_INIT这个宏有不同的变体,参数也各不相同,但都是将驱动程序添加到启动序列中

• 将驱动程序 API 与 zephyr 框架挂钩


调试技巧

  • 参考其他源代码,了解初始化SoC所需的步骤。

  • 尝试在SoC初始化时打印到UART(直接访问寄存器),以确保内核启动并运行。

  • 首先执行UART驱动程序,printk就是生命。

  • 打开系统日志或日志记录器。

  • 开启CONFIG_ASSERT以尝试捕捉错误。

  • 使用片上调试器(UltraSoC、J-Link、ULINK等)。


关键工具和构建命令

  • Zephyr构建系统使用这些重要工具

• Cmake -> 保存所有源代码构建步骤

• Yaml -> 这些文件提供有关帮助命令的信息,主要用于文档编制

• West -> 该工具提供的构建命令内部使用cmakelist,这些cmakelist定义在每个子目录中
  • Zephyr使用west命令来构建    

    • west 初始化(启动zephyr构建)  

    • west开发板(列出可用的板)    

    • west build -b samsung_cr5 samples/hello_world/ -p


定时器

  • 定时器是一个内核对象,使用内核的系统时钟测量时间的流逝。

  • 当达到计时器的指定时限时,它可以执行应用程序定义的操作,或者等待。

  • 可以定义任意数量的计时器。每个计时器都由其内存地址引用。

  • 计时器具有以下关键属性:持续时间、时间周期、过期功能、停止功能。

  • 可用于使用计时器的实现:

• 定义计时器-使用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文件都可以在构建过程中修改和使用。如果遇到任何启动问题,需要对这一领域进行探索。



上一条:ZDS 2023技术报告分享第54篇:Zephyr的输入子系统 下一条:ZDS 2023技术报告分享第52篇:Zephyr中POSIX支持

关闭

嵌入式与网络计算湖南省重点实验室
版权所有 © 2023 湖南大学