前言
随着 OpenHarmony3.1 的正式发布,其功能也在不断完善。OpenHarmony LiteOS-M 内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点,其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等,分为硬件相关层以及硬件无关层,硬件相关层提供统一的HAL(Hardware Abstraction Layer)接口,提升硬件易适配性,不同编译工具链和芯片架构的组合分类,满足AIoT类型丰富的硬件和编译工具链的拓展。本文主要介绍如何在STM32上移植 OpenHarmony LiteOS-M 内核,及其注意事项。
一、开发环境
硬件:
- STM32F429I-DISC1 开发板
软件:
- VSCode:用于编辑代码
- STM32CubeMX:用于生成工程
- make、arm-none-eabi-gcc:用于编译工程
- STM32Cubeprogrammer:用于下载工程
- Git:用于获取 OpenHarmony LiteOS-M 内核源码
二、移植内核
1. 操作流程
- 拉取仓库代码。
- 使用STM32CubeMX在
/target
目录下生成工程。 - 修改Makefile文件,工程加入 OpenHarmony LiteOS-M 内核所需的文件。
- 添加用户代码以支持
printf
。添加用户自定义任务。 - 编译下载程序
2. 获取源码
- 进入
https://gitee.com/openharmony/kernel_liteos_m
,获取Git仓库地址。
https://gitee.com/openharmony/kernel_liteos_m.git
- 使用Git Bush,拉取内核源码到本地。
- 创建
/third_party
目录,用于存放第三方依赖文件(STM32 所需的 CMSIS 等),拉取第三方依赖文件。
cd kernel_liteos_m
mkdir ./third_party
cd third_party
git clone https://gitee.com/openharmony/third_party_bounds_checking_function.git ./bounds_checking_function
git clone https://gitee.com/openharmony/third_party_cmsis.git ./cmsis
git clone https://gitee.com/openharmony/third_party_musl.git ./musl
到这里 OpenHarmony LiteOS-M 内核源码就获取完毕了。
3. 生成工程
-
进入
/targets
目录,使用 STM32CubeMX 生成工程STM32F429ZI_Harmony_LiteOS_M
-
与FreeRTOS类似,由于LiteOS会占用SysTick定时器,因此需要修改HAL库延时的基础时钟,改为其他非SysTick的定时器,避免HAL库延时的定时器和系统运行的定时器冲突。
-
配置:下载调试端口SW、串口USART、LED_GPIO、时钟树。
-
开发环境选择 Makefile
-
Code Generator
中一定要选择Copy only necessary library files
! 如果选择所有库文件都添加的话,那么就会生成很多模板文件。由于我们需要在 Makefile 中添加文件,如果目录中有模板文件的话,我们就无法直接使用筛选功能将所有源文件快速添加到工程中了。
至此工程配置已结束,点击 Generate 即可生成工程。
4. 修改工程文件
- 使用 VS Code 打开
targets
下的工程目录,新建liteos_file_path.mk
用于将内核源码文件添加到工程Makefile中,该文件相当于C语言中的头文件,主 Makefile 文件可以直接包含该文件。
- 添加内核源文件目录到
liteos_file_path.mk
中。
# Topdir 顶层目录
LITEOSTOPDIR := ../../
LITEOSTOPDIR := $(realpath $(LITEOSTOPDIR))
# Common 内核源文件及头文件目录
C_SOURCES += \
$(wildcard $(LITEOSTOPDIR)/kernel/src/*.c) \
$(wildcard $(LITEOSTOPDIR)/kernel/src/mm/*.c) \
$(wildcard $(LITEOSTOPDIR)/components/cpup/*.c) \
$(wildcard $(LITEOSTOPDIR)/components/power/*.c) \
$(wildcard $(LITEOSTOPDIR)/components/backtrace/*.c) \
$(wildcard $(LITEOSTOPDIR)/components/exchook/*.c) \
$(wildcard $(LITEOSTOPDIR)/components/signal/*.c) \
$(wildcard $(LITEOSTOPDIR)/utils/*.c)
C_INCLUDES += \
-I$(LITEOSTOPDIR)/utils \
-I$(LITEOSTOPDIR)/kernel/include \
-I$(LITEOSTOPDIR)/components/cpup \
-I$(LITEOSTOPDIR)/components/power \
-I$