[资料干货] 【每周分享】[CPKCOR-RA8D1]zephyr rtos移植全过程

[复制链接]
484|0
xhackerustc 发表于 2025-11-1 00:00 | 显示全部楼层 |阅读模式
本帖最后由 xhackerustc 于 2025-11-1 09:12 编辑

#申请原创#


@21小跑堂   


0. CPKCOR-RA8D1B开发板以及CPKEXP-EKRA8X1扩展板简介
CPKCOR-RA8D1B开发板是由RA生态工作室基于瑞萨电子RA8D1 MCU设计的一款核心开发板,板载32MB SDRAM、16MB Nor Flash、tf卡槽和usb typec接口,同时板载了Jlink调试器方便用于调试开发。而CPKEXP-EKRA8X1扩展板是可用于CPKCOR-RA8D1B核心板的扩展基板,板载RJ45、显示屏、can、usb typec和各
种扩展接口。

1 为何选择zephyr rtos

目前MCU系统功能越来越多,性能越来越强,这是好事但同时带来一个坏事--系统复杂度越来越高。把这种MCU系统当纯裸机开发的工作量简直是天量,即使使用FreeRTOS这种偏裸机调度的RTOS工作量也很大。要缩减工作量就要求以一定的通用的抽象和隔离来获得软件代码的重用性。对于带ACPU且内存足够大比如32MB以上的平台,运行linux是大家意料中的选择。但是在纯裸机和linux之间其实有广大的中间地带,目前各种RTOS都想在这个中间地带跑马圈地。笔者使用过FreeRTOS、ThreadX、Nuttx、RT-Thread以及zephyr,笔者个人更看好zephyr rtos一些,原因有三:

1.1 zephyr rtos功能全面
zephyr自带原生的各种网络协议栈、蓝牙协议栈、can协议栈、usb协议栈。除此以外,自带了常见的ip的原生驱动。另一方面,大量的芯片级和板级支持给开发者提供了海量移植参考。最后,zephyr还自带了很多例子代码和测试代码,分别在samples目录和tests目录,给开发者提供了海量的用法参考。

1.2 zephyr rtos模块化做得比较好
zephyr rtos利用linux kernel的kbuild机制,可以通过menuconfig去选择需要编译哪些模块

1.3 zephyr rtos对device tree的创新式使用
zephyr rtos利用了device tree,但不是像linux kernel那种由dtc编译成dtb文件然后在代码中解析并使用,而是为了flash/sram资源考虑做了创新:device tree会由编译系统自动生成对应头文件,也即device tree在编译期已经解析并融入代码,无运行时sram开销,无显著的flash开销。其实用久了device tree,会发现devcie其实不就是另一种意义上的各厂家都通用的类FSP或STM32CubeMX这样配置工具么?而且device tree更标准,非厂商绑定,文本化方便利用版本管理工具如git、svn管理。下面会展示下device tree是如何实现和瑞萨电子FSP相似功能的。

1.4 zephyr rtos人气旺当红炸子鸡
各大芯片原厂比如Renesas、ST、NXP、Infineon等主动下场亲自操刀重度参与开发,包括但不限于贡献通用代码、贡献自家芯片的支持代码、review与讨论github上的开源Pull Request。Linux Kernel为什么火能打败各种*BSD各种*nix啊,开发者众多、厂商热捧是非常非常非常重要的因素。笔者预感zephyr就是RTOS界的Linux。

2. zephyr代码和sdk下载
说了这么多,给zephyr吹了这么多牛,是驴子是马拉出来溜溜。要移植得先下载代码并搭建好开发环境。这方面zephyr官方文档做得不错,可参考zephyr官方文档,https://docs.zephyrproject.org/latest/develop/getting_started/index.html

简单来说步骤就是,生成python venv环境,pip安装west工具,用west初始化zephyr仓库,west update

而zephyr-sdk其实就是各种工具,比如各体系结构arm、riscv、xtensa的toolchain,CMake,Ninja,dtc和openocd等等。可以用zephyr提供的sdk,经验极其丰富的老手也可以不用sdk而选择自己安装toolchain和各种工具,以便和其它开发项目共享。

BTW:笔者建议做zephyr开发用的PC机运行Linux操作系统。

3.zephyr的移植
一般来说任何一个os的移植从易到难包含三个层次:体系结构的移植、芯片的移植和板子的移植。体系结构的移植顾名思义就是cpu体系结构层面的移植,如果这款OS对于某cpu体系结构还不支持,那么给这款OS加上这个cpu体系结构的支持就是体系结构的移植,这个活计难度相当高,通常都是大牛捉刀,而且耗时不短,移植完毕后也需要长年累月的打磨、调优、增加新功能; 而芯片的移植说白了就是芯片中某个硬件模块的驱动在目标OS中还没有,那么就要按目标OS的方式实现原生驱动; 最后板子的移植相对要简单一点,这种情况多见于目标OS中已有原厂芯片的支持,而各下游厂家或爱好者基于原厂的芯片为特定用途设计了板子,让目标OS支持这种板子就是本层次的移植要做的事。一般来说此时目标OS中对于芯片的支持已经相当可观比较成熟,且大多数情形下目标OS中已经有原厂的各种EVK、PEK原型参考板的
支持。

笔者目前有zephyr和linux中第二层次芯片级和第三层次板级的丰富移植经验,而第一次层次体系结构>级的支持zephyr下也有一些贡献,相对来说linux下第一层次的贡献更丰富更多彩。

如上所述CPKCOR-RA8D1B开发板是基于瑞萨电子的RA8D1 MCU设计的,而zephyr rtos中已有RA8D1的支持(而且此支持是瑞萨电子自己的全职员工提交的代码哦),更方便的是zephyr rtos中已有原厂RA8D1的原型参考板EK-RA8D1的支持,故本篇文章属于第三层次的移植分享。

3.1 zephyr板级概论
如上所述,zephyr引入了device tree的概念,所以zephyr板级支持主要effort就是写板级dts。目前zephyr是一块板子一个目录,此目录下除板级dts以外,还有一些CMakeLists.txt, Kconfig,defconfig,yaml等文件,这些辅助边角文件可以参考原厂的原型板的写法一个一个地创建,在此一提后续不再赘述,文件完整内容可等笔者后续开源上传。

3.2 创建cpkcor_ra8d1b目录

在boards/renesas/目录下创建cpkcor_ra8d1b目录,目录中创建如下文件
  1. board.cmake     cpkcor_ra8d1b_defconfig     cpkcor_ra8d1b.yaml
  2. board.yml       cpkcor_ra8d1b.dts           Kconfig.cpkcor_ra8d1b
  3. CMakeLists.txt  cpkcor_ra8d1b-pinctrl.dtsi  sdram.ld


3.3 写板级dts文件
如上所述,这里最关键的就是书写板级dts文件。一开始的dts可以只包括cpu、pll/clk、pinmux、uart、flash和sram。

一些dts书写tips和思考:熟悉瑞萨家MCU开发流程的工程师想必对FSP并不陌生,比如CPKCOR-RA8D1B开发板板载24MHZ晶振,那么用fsp配置pll/clk时,其实我们做了div和mul值的选择,从而最终配得480MHZ cpu时钟,那么我们看下device tree如何做到的:

设置晶振24MHZ
  1. &xtal {
  2.         clock-frequency = <DT_FREQ_M(24)>;
  3.         mosel = <0>;
  4.         #clock-cells = <0>;
  5.         status = "okay";
  6. };


pll的div为4,mul为160,所以我们得到24/4*160 =960MHZ的pll
  1. &pll {
  2.         status = "okay";
  3.         div = <4>;
  4.         mul = <160 0>;


pllp设置div为2,获得960/2 = 480MHZ
  1. pllp: pllp {
  2.                                 compatible = "renesas,ra-cgc-pll-out";
  3.                                 div = <2>;
  4.                                 freq = <DT_FREQ_M(480)>;
  5.                                 status = "disabled";
  6.                                 #clock-cells = <0>;
  7.                         };


pclkblock时钟源为pllp,cpuclk设置div为1,从而最终cpu时钟是480/1 = 480MHZ
  1. clocks = <&pllp>;
  2.                         status = "okay";

  3.                         cpuclk: cpuclk {
  4.                                 compatible = "renesas,ra-cgc-pclk";
  5.                                 clock-frequency = <480000000>;
  6.                                 div = <1>;
  7.                                 #clock-cells = <2>;
  8.                                 status = "okay";
  9.                         };


怎么样发现devicetree其实和fsp功能基本一致了吗?但是device tree各大厂商都通用,不绑定在厂商的配置工具上,所以虽然device tree学习曲线比较陡峭,但是学会后通吃所有厂商!

3.4 测试

做完初步板级dts后,可编译hello world例子代码
  1. west build -b cpkcor_ra8d1b samples/hello_world/



Nice,hello world运行成功!****第一步迈出去了


再来试试zephyr线程切换
  1. west build -b cpkcor_ra8d1b samples/synchronization




再来试试shell
  1. west build -b cpkcor_ra8d1b samples/subsys/shell/shell_module/

这个测试程序的运行就和linux命令行似的,可以打命令执行命令,笔者未截图而是录了个视频放文章末尾供欣赏。

3.5 给板级dts增加设备dt node再测试
这里笔者就不一一赘述了,只列下编译命令和运行截图


crc支持
  1. west build -b cpkcor_ra8d1b samples/drivers/crc


watchdog支持
  1. west build -b cpkcor_ra8d1b samples/drivers/wathdo



gpio点灯
  1. west build -b cpkcor_ra8d1b samples/basic/blinky




gpio按键
  1. west build -b cpkcor_ra8d1b samples/basic/button




sdram
  1. west build -b cpkcor_ra8d1b samples/drivers/memc




usbhs device
  1. west build -b cpkcor_ra8d1b samples/subsys/usb/cdc_acm



PC机linux系统也识别到cdc acm设备



nor flash
  1. west build -b cpkcor_ra8d1b samples/drivers/spi_flash


看起来zephyr对dual|quad mode的flash还没支持。CPKCOR-RA8D1B开发板上板载的是一颗最高QSPI nor flash,原厂Ek-RA8D1和RA生态工作室的CPKHMI-RA8D1B开发板都是板载的最高OSPI nor flash,所以>那两款开发板这个测试例子应该能跑成功,要不RA生态工作室赞助一块CPKHMI-RA8D1B开发板


internal flash
  1. west build -b cpkcor_ra8d1b samples/drivers/flash_shell/


sdcard
  1. west build -b cpkcor_ra8d1b tests/drivers/sdhc/






3.6 对cpkexp-ekra8x1执行同样移植步骤

这里特别的一点是zephyr rtos目前一块板子一个目录,即使板子与板子之间是所谓的核心板与基板/扩
展板关系,所以对于CPKEXP-EKRA8X1+CPKCOR-RA8D1B组合我们就以cpkexp_ekra8d1命名。而在板级dts>中,可以用如下语法include核心板dts
  1. #include "../cpkcor_ra8d1b/cpkcor_ra8d1b.dts"

usbfs device
  1. west build -b cpkcor_ra8d1b samples/subsys/usb/cdc_acm

PC机Linux下也可以看出usb reset识别有问题

看来zephyr对ra8d1的full speed usb控制器支持还没做好

ethernet
  1. west build -b cpkcor_ra8d1b samples/net/sockets/packet/

可以看出已经识别以太网phy,测试通信也正常不过笔者未截图。




运行zephyr shell_module视频
https://www.bilibili.com/video/BV19z1gBvED2/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

170

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部