打印
[移植指南]

移植 ZephyrRTOS 至 APM32F1 系列 MCU 之移植基础框架

[复制链接]
2569|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 wangqy_ic 于 2023-9-20 13:55 编辑

#申请原创#

移植 ZephyrRTOS 至 APM32F1 系列 MCU 之
移植基础框架

目录
  • 目录结构
  • 移植要点
  • 结语

目录结构
确定目录结构是为了更好的符合 Zephyr 的一些移植要求,也便于与 Zephyr 结合但又不会影响 Zephyr 源码。这样的开发方式,也是我非常喜欢这个 RTOS 的一个原因。
先列出本项目的目录结构,之后简要介绍这些目录的作用和目的。为了便于后续的说明,我们暂时把这个目录的路径约定为 E:\z4geehy 。

├─boards
│  └─arm
│      └─apm32f103vc_mini
├─dts
│  ├─arm
│  │  └─geehy
│  │      └─f1
│  └─bindings
│      ├─clock
│      ├─gpio
│      └─serial
├─include
│  └─zephyr
│      ├─drivers
│      │  └─clock_control
│      └─dt-bindings
│          ├─clock
│          └─pinctrl
├─modules
│  └─hal
│      ├─apm32f10x
│      │  └─Libraries
│      └─drivers
│          ├─clock_control
│          ├─flash
│          ├─gpio
│          ├─include
│          ├─pinctrl
│          └─serial
├─soc
│  └─arm
│      └─geehy_apm32
│          ├─apm32f1
│          └─common
└─zephyr

  • boards 开发板/评估板的定义。子目录的结构为:<arch>/<board>,arch 对应架构,例如:arm。 board 对应某个开发板,例如:└─apm32f103vc_mini。
  • dts Driver Tree 相关内容。子目录是两类,一是 <arch>,定义 soc 相关的 Driver Tree 内容;二是 bindings,对应 soc 外设相关内容。
  • include dts 相关的头文件。
  • modules 这个目录存放半导体厂商提供的驱动
  • soc soc 及相关驱动
  • zephyr 这个目录下就只有一个文件 module.yml,该文件描述了我们这个 module 的信息,已经配置和构建所必须的内容,详细说明参见这个链接

移植要点
依次介绍几个重要的文件,这些文件就构成了移植的基本框架。基本框架搭建好之后,这个移植就能走上正轨,起飞指日可待~

zephyr 目录
这个目录下只有 module.yml 这一个文件。文件内容为:
name: hal_geehy
build:
    cmake-ext: True
    kconfig-ext: True
    settings:
        board_root: .

  • name 本 module 的名称,会在配置界面 (TOP) -> Modules 下看到 hal_geehy 条目。(图1)
  • build 条目告诉构建工具(west)怎样集成本 module:
    • settings 分别指定几个目录,看名称应该都很容易理解。路径是相对目录,是相对于 module.yml 的上级目录,也就是 zephyr 目录所在的目录(有点拗口)。举个例子,board_root 的值是“.”,west 构建时 -b 参数指定了板子名称,配置时也要在本目录下搜索 board 相关的配置。
图1:

modules
modules 目录有 modules.cmake 文件 和 hal 文件夹

modules.cmake 文件
这个文件是 cmake 构建说明,有用的内容只有两行:
set(ZEPHYR_HAL_GEEHY_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}/hal)
set(ZEPHYR_HAL_GEEHY_KCONFIG ${CMAKE_CURRENT_LIST_DIR}/hal/Kconfig)

这里说明了两个变量:ZEPHYR_HAL_GEEHY_CMAKE_DIRZEPHYR_HAL_GEEHY_KCONFIG
这两个变量的名称是有要求的,分别是:
  • ZEPHYR_<module_name>_CMAKE_DIR:对应 cmake 目录,这里的值也就是 modules/hal 目录。
  • ZEPHYR_<module_name>_KCONFIG:对应 kconfig 文件,这里的值也就是 modules/hal/Kconfig 文件。
module_name 就是 zephyr/module.yml 里定义的 name 的值,需要把字母数字以外的字符都换成下划线。

hal 目录
这个目录存放半导体厂商提供的驱动库以及相关的适配文件,主要有:
  • Kconfig Kconfig 配置项文件
  • CMakeLists.txt CMake 相关文件
Kconfig 文件的主要内容是各个外设驱动的配置开关,最后引入各个外设驱动的详细配置:
config USE_GEEHY_HAL_ADC
    bool

config USE_GEEHY_HAL_CAN
    bool

config USE_GEEHY_HAL_CRC
    bool

config USE_GEEHY_HAL_DAC
    bool

# 省略更多内容...

rsource "drivers/*/Kconfig"

CMakeLists.txt 主要是增加几个编译 Flag,并且根据外设的配置决定那些文件需要加入构建:
zephyr_library()

if(CONFIG_CPU_CORTEX_M4)
  zephyr_compile_definitions( -DCORE_CM4 )
elseif(CONFIG_CPU_CORTEX_M7)
  zephyr_compile_definitions( -DCORE_CM7 )
endif()

zephyr_include_directories(common)
zephyr_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../include)

if(CONFIG_APM32F10X_LD)
  zephyr_compile_definitions(APM32F10X_LD)
elseif(CONFIG_APM32F10X_MD)
  zephyr_compile_definitions(APM32F10X_MD)
elseif(CONFIG_APM32F10X_HD)
  zephyr_compile_definitions(APM32F10X_HD)
elseif(CONFIG_APM32F10X_CL)
  zephyr_compile_definitions(APM32F10X_CL)
endif()

if(CONFIG_SOC_SERIES_APM32F1X)
zephyr_include_directories(
  apm32f10x/Libraries/APM32F10x_StdPeriphDriver/inc
  apm32f10x/Libraries/Device/Geehy/APM32F10x/Include
)

zephyr_library_sources(apm32f10x/Libraries/Device/Geehy/APM32F10x/Source/system_apm32f10x.c)
zephyr_library_sources(apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_rcm.c)
zephyr_library_sources(apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_misc.c)

zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_ADC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_adc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_BAKPR apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_bakpr.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_CAN apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_can.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_CRC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_crc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_DAC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_dac.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_DBGMCU apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_dbgmcu.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_DMA apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_dma.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_DMC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_dmc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_EINT apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_eint.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_FMC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_fmc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_GPIO apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_gpio.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_I2C apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_i2c.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_IWDT apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_iwdt.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_PMU apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_pmu.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_QSPI apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_qspi.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_RTC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_rtc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_SCI2C apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_sci2c.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_SDIO apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_sdio.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_SMC apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_smc.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_SPI apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_spi.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_TMR apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_tmr.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_USART apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_usart.c)
zephyr_library_sources_ifdef(CONFIG_USE_GEEHY_HAL_WWDT apm32f10x/Libraries/APM32F10x_StdPeriphDriver/src/apm32f10x_wwdt.c)

add_subdirectory(drivers)

endif()


soc 目录
这个目录是 MCU 移植的重要内容,目录结构是:
└─arm
    └─geehy_apm32
        ├─apm32f1
        ├─<other mcu series>
        └─common

arm 对应 ARCH;之下是 geehy_apm32 对应厂商及 SOC 序列;之下是各个型号的 SOC 的内容。
主要的移植内容是:
  • SOC 配置说明:一系列 Kconfig 文件
  • 链接脚本
  • 启动时需要执行的特殊操作,如果有的话。
文件内容不少,但是都很容易理解,请参考源码仓库的内容。
结合 ZephyrRTOS 的一些使用经验,在划分型号时请结合 MCU 的实际功能,按功能多寡来规划 MCU 的归属,而不是厂商的型号字面意思。这样的话编写 Kconfig 文件/CMake 文件都能逐渐拓展开去。


boards 目录
这个目录是开发板/评估板的配置及针对性的代码。结构是:
└─arm
    ├─apm32f103vc_mini
    └─<other board>

arm 对应 ARCH;之下是各个开发板,这里只有1个:apm32f103vc_mini。
开发板移植的必须文件:
apm32f103vc_mini.dtsapm32f103vc_mini.yamlapm32f103vc_mini_defconfigboard.cmakeKconfig.boardKconfig.defconfig
前三个文件,文件名称最好与文件夹名称相同,后三个文件的文件名称固定不变。
  • .dts 文件,是板子 Driver Tree 说明文件
  • .yaml 文件记录了板子信息
  • _deconfig 文件保存 kconfig 配置项
  • board.cmake 保存与调试器相关参数,如 jlink/pyocd 连接参数。
  • Kconfig.board 板子配置项,至少包含板子定义一项,如:BOARD_APM32F103VC_MINI 。
  • Kconfig.defconfig 板子名称配置项

结语
基础移植框架的要点就上述的这些文件。

这个移植涉及文件内容非常多,但好在代码内容都容易理解,可以借助上面的内容,结合源码理解,就非常容易在新的 MCU 上跑起来。

至于驱动的开发,还需多篇文章才能说清楚,就只能在新文章里继续了~

源码仓库:https://gitee.com/quincyzh/zephyr_modules_apm32 欢迎⭐
Modules 相关内容:https://docs.zephyrproject.org/latest/develop/modules.html

// END

使用特权

评论回复
评论
XIOAWEIYAOMB 2023-9-15 18:27 回复TA
博主,对于这个 板子的移植能讲述的在清除一点吗,有些疑问 
沙发
tpgf| | 2023-7-3 10:42 | 只看该作者
zephyr操作系统是一个用于资源受限和嵌入式系统的小型内核

使用特权

评论回复
板凳
nawu| | 2023-7-3 11:13 | 只看该作者
zephyr针对的应用场景,从简单的嵌入式环境传感器和可穿戴设备到复杂的嵌入式控制器、智能手表和物联网无线应用程序

使用特权

评论回复
地板
aoyi| | 2023-7-3 11:31 | 只看该作者
Zephyr内核支持多种体系结构,包括ARM Cortex-M, Intel x86, ARC, NIOS II, Tensilica Xtensa and RISC-V 32.。官网上列出支持的Boards非常多。

使用特权

评论回复
5
zljiu| | 2023-7-3 11:58 | 只看该作者
Zephyr生态就是一种针对IOT嵌入式软件开发的新的最佳实践中的一种实践

使用特权

评论回复
6
gwsan| | 2023-7-3 12:11 | 只看该作者
Zephyr生态目前还没有支持广泛使用的Keil, IAR等商用IDE

使用特权

评论回复
7
tfqi| | 2023-7-3 13:07 | 只看该作者
现在可以用CMake生成支持Eclipse MCU的工程

使用特权

评论回复
评论
wangqy_ic 2023-7-4 14:25 回复TA
ZephyrRTOS 的构建工具,是可以生成 eclipse 的工程~其实是 CMake 的功能 
8
wangqy_ic|  楼主 | 2023-9-20 13:56 | 只看该作者
更新了仓库地址,欢迎加入一起开发:https://gitee.com/quincyzh/zephyr_modules_apm32

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:感恩的心对人。

17

主题

98

帖子

4

粉丝