小熊派移植华为 LiteOS-M(基于MDK)_小熊移植-程序员宅基地

技术标签: # STM32  # LiteOS  stm32  rtos  鸿蒙  liteos  单片机  

小熊派移植华为 LiteOS-M(基于MDK)

前言

之前使用小熊派实现了鸿蒙动画的开机界面,具体使用的技术栈为 STM32 + LiteOS + LVGL + FATFS +DMA 方式实现,刷新效率非常高,预览视频如下:

hom

关于这个的实现过程我会写一系列的教程分享出来,主要分为下面几个部分,本节为第一部分,移植 LiteOS 到小熊派上

  • 小熊派移植华为 LiteOS-M(基于MDK):链接
  • 小熊派基于 LiteOS 移植 LVGL 显示接口:链接
  • 小熊派基于 LiteOS 移植 LVGL 文件系统:链接
  • 小熊派实现鸿蒙开机界面(LiteOS+LVGL):链接

一、软硬件介绍

1.1 小熊派开发板

开发板外貌:

20220107173733

小熊派参数如下:

20220107183951

1.2 LiteOS介绍

LiteOS 是华为面向物联网领域开发的一个基于实时内核的轻量级操作系统。属于华为物联网操作系统 Huawei LiteOS 源码,鸿蒙体系的内核之一,本质上就是一个 RTOS,现有基础内核支持任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器等操作系统基础组件,更好地支持低功耗场景,支持tickless机制,支持定时器对齐

同时 LiteOS 提供端云协同能力,集成了 LwM2M、CoAP、mbedtls、LwIP 全套 IoT 互联协议栈,且在 LwM2M 的基础上,提供了 AgentTiny 模块,用户只需关注自身的应用,而不必关注 LwM2M 实现细节,直接使用 AgentTiny 封装的接口即可简单快速实现与云平台安全可靠的连接

1.3 移植前言

LiteOS 软件开发框架按照下面的框架来进行,其中 LiteOS调度内核我们移植官方提供的代码即可,而 BSP 外设软件库我们则通过 STM32CubeMX 来配置生成 HAL 库,当这两方面准备好之后,我们只需要在任务层进行开发即可,开发效率极高

20220107194942

LiteOS 的移植一般也分为两种移植方法,一种移植的时候将芯片的中断也关联到 LiteOS 方便调用,另外一种则不关联中断,使用单片机自己的中断管理,这里 STM32 的 NVIC 中断管理很棒,我们不需要接管中断

二、CubeMX 配置

我们通过 STM32CubeMX 来配置小熊派的一些基本接口,比如配置时钟树,开启 SystemTick定时器,方便移植 LiteOS

配置时钟树:

20220107200512

设置 HAL库定时器为TIM1,防止和 LiteOS 使用的 Systemtick 冲突

20220107200546

配置 LED 的 GPIO 口,方便我们点灯操作

20220107201044

配置工程名称,选择生成 MDK

20220107200737

配置代码生成选项

20220107200746

生成代码

20220107200856

代码生成后打开工程,下一步进入移植操作

20220107200943

三、获取源码

LiteOS 的老版本有对 MDK 的支持,新版本暂时还没有更新,所以这里我使用老版本的代码,仓库地址如下:

Github 仓库

我们把老版本的仓库 Down 到本地,Git 指令如下:

git clone -b develop https://github.com/LiteOS/LiteOS.git

20220109150153

代码拉取后如下:

20220109150253

没有 Git 工具的话可以上 GitHub 网页把 ZIP Downloade 下来再解压也可以

下面就是代码移植阶段

四、源码移植

在 MDK 工程目录下新建 LiteOS 移植目录,按如下新建文件夹

20220109131809

这几个文件夹的作用如下:

  • ARCH:编译器启动文件
  • CMSIS:存放 CMSIS-RTOS 接口文件
  • Config:存放内核配置文件,用于配置和裁剪内核
  • Kernel:存放 LiteOS 内核源码

下面我们从源码文件夹拷贝代码到移植目录下面

4.1 ARCH

移植 文件路径\LiteOS\arch\arm 架构文件夹到 ARCH 下,arm 下文件包含了各个 arm 架构的支持文件

20220109151215

M 架构下面的文件主要有三个 GCC、IAR、KEIL 三个,适配不同集成开发环境的编译器,因为小熊派是 M4 内核,所以我们主要关注的就是 cortex-m4 下面的 keil 文件夹下的启动文件,这里我把所有的都复制进去了

至于 include 和 src 文件夹,则是存放了 LiteOS 的一些内核接口代码,比如中断接口、Systemtick 定时器接口函数等等

4.2 CMSIS

移植 文件路径\LiteOS\LiteOS-M-Develop\LiteOS\osdepends\liteos\cmsis CMSIS 系统接口文件夹到 CMSIS 下,CMSIS 文件夹下存放的是 CMSIS-RTOS 接口文件夹,RTOS内核支持的操作就那么些,CMSIS-RTOS 对这些操作提供了统一的 RTOS 接口,连接系统底层与 RTOS层,方便我们移植不同的 RTOS:

20220109154009

4.3 Config

Config 文件夹下存放系统的配置文件,这个配置文件我们从示例工程下面拷过来,示例工程目录位置 目录\LiteOS\targets\STM32F103VET6_NB_GCC\OS_CONFIG,目录下文件如下:

20220109155545

其中 los_builddef.h 用于设置构建的定义,los_printf.h 用于设置串口打印配置,target_config.h 可以用于裁剪系统内核,设置系统运行参数等等

4.4 Kernel

kernel 文件夹用于存放内核源码,源码位置在 目录\LiteOS\kernel 下面

20220109162121

base 是系统的基础内核源码

20220109162159

  • core 是核心源码,包括队列、task调度、软timer、时间片计算等功能,全部复制
  • OM 是与错误处理相关的文件,全部复制
  • include 是 LiteOS内 核内部使用的头文件,全部复制
  • ipc 是 LiteOS 中 task 间通讯的相关接口,包括事件、信号量、消息队列、互斥锁等,全部复制
  • mem 是LiteOS中的内核内存管理的相关代码,我们只需要复制其中一部分就行,内存分配方式选择适合小内存的分配方式(bestfit_little)

20220109162945

  • misc 是内存对齐功能以及毫秒级休眠sleep功能,全部复制

extended 是系统扩展内核的代码,目前里面有个支持低功耗的内核,我们顺便也复制进去

20220109163310

include 存放内核的调用头文件,我们全部复制进去

kernel 下面还有一个 los_init.c 文件,存放初始化代码,也复制进去

20220109163524

复制完成的文件夹如下:

20220109163604

五、MDK 配置

代码移植完成了,下面就是配置一下 MDK

5.1 文件导入

进入 MDK 进行文件管理,配置文件夹,导入文件:

20220109164736

  • config 导入 Config 下面 所有 .h 文件
  • kernel 导入 Kernel 下面 所有 .c 文件
  • cmsis 导入 CMSIS 下 cmsis_liteos.c 文件
  • arch 导入 ARCH\arm\arm-m\cortex-m4\keil 下 los_dispatch_keil.S文件,以及 ARCH\arm\arm-m\src 下 所有 .c 文件

5.2 路径导入

文件导入后下一步就是路径导入,在 C/C++ 配置中依次添加头文件路径

20220109165445

添加的路径如下,这里我的工程目录是 BearPi_LiteOS:

BearPi_LiteOS\Middlewares\LiteOS\Config
BearPi_LiteOS\Middlewares\LiteOS\Kernel\base\include
BearPi_LiteOS\Middlewares\LiteOS\Kernel\extended\include
BearPi_LiteOS\Middlewares\LiteOS\Kernel\include
BearPi_LiteOS\Middlewares\LiteOS\ARCH\arm\arm-m\include
BearPi_LiteOS\Middlewares\LiteOS\CMSIS\cmsis

到这基本差不多了,下面就是编译工程

5.3 编译工程

先编译一下工程,发现报错,缺少 #include “stm32f1xx.h” 文件,是因为我的小熊派开发板是 stm32l431 的芯片,修改这个工程头文件为 #include "stm32l4xx.h"

20220109170421

修改完再编译,当然还会有报错,因为 STM32CubeMX 生成的代码里面有

void PendSV_Handler(void)
void SysTick_Handler(void)

两个中断,这两个中断在 LiteOS 的内核源码里面有定义,一个用作系统时钟,一个用作上下文切换,所以我们要把 STM32CubeMX 生成的这部分中断处理代码注释掉

20220109170915

注释完后编译,编译通过:

20220109171244

到此系统移植基本完成了,下一步写个代码测试系统有没有移植成功

六、点灯实验

头文件包含 cmsis 接口

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "cmsis_os.h"
/* USER CODE END Includes */

创建一个任务句柄,以及任务实体和初始化函数

osThreadId_t led_taskHandle;
const osThreadAttr_t led_task_attributes = {
    
  .name = "led_task",
  .stack_size = 512 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};
void Led_Task(void *argument);

void Led_Task(void *argument)
{
    
	while(1)
	{
    
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
		osDelay(1000);
	}
}

在系统初始化的代码添加系统初始化代码,同时创建任务,创建完成后启动系统

  /* USER CODE BEGIN 2 */
	osKernelInitialize();
  /* creation of uart_task */
  led_taskHandle = osThreadNew(Led_Task, NULL, &led_task_attributes);
	osKernelStart();
  /* USER CODE END 2 */

编译下载程序,观察现象:

liteos

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45396672/article/details/122396806

智能推荐

下载并安装MS office 365_setup.def.zh-cn_o365proplusretail_-程序员宅基地

文章浏览阅读3k次。进入官网 https://login.microsoftonline.com/ 使用自己的帐号登录office 下载Setup.Def.zh-cn_O365ProPlusRetail_08caf41c-85cb-414f-8739-b5d396199eef_TX_SG_Platform_def_b_64_.exe 安装 ..._setup.def.zh-cn_o365proplusretail_

[elementui]控制台报错 opper-append-to-body is about to be deprecated_popper-append-to-body is about to be deprecated in-程序员宅基地

文章浏览阅读2.5k次。环境:vue3 element-plus控制台报错 elementui。_popper-append-to-body is about to be deprecated in version 2.3.0, please use

力扣数据库基本练习题分享-程序员宅基地

文章浏览阅读355次,点赞12次,收藏7次。【代码】力扣数据库基本练习题分享。

优化GitHub网站访问慢的问题_解决github访问速度慢-程序员宅基地

文章浏览阅读1.9k次。大型网站服务器都不会是只有一台服务器,而是多台服务器组成的集群一起对外提供服务。使用测速,找一个速度比较快的服务器。图中可以看到140.82.121.4这个ip比较快,最后,刷新 DNS 缓存使增加的映射生效。Mac 刷新 DNS 缓存,在终端输入Windows 刷新 DNS 缓存,cmd 命令窗口执行修改完 hosts后再刷新github网页 应该快一点了。_解决github访问速度慢

【C语言】1~6这6个自然数组成一个三角形_用1-6这六个自然数组成一个三角形,并让这个三角形-程序员宅基地

《啊哈C!思考快你一步》第五章中,提出了一个逻辑挑战,要求用1~6这6个自然数组成一个三角形,并让三条边的值之和相等。共有24种可能性,非常有趣,值得一试。

HIVE的权限控制和超级管理员的实现-程序员宅基地

文章浏览阅读1.4k次。Hive用户权限管理从remote部署hive和mysql元数据表字典看,已经明确hive是通过存储在元数据中的信息来管理用户权限。现在重点是Hive怎么管理用户权限。首先要回答的是用户是怎么来的,发现hive有创建角色的命令,但没有创建用户的命令,显然Hive的用户不是在mysql中创建的。在回答这个问题之前,先初步了解下Hive的权限管理机制。Hive用户组和用户即Linux用户组和用户,..._如何给hive 设置super admin

随便推点

ubuntu编译安装pcl_ubuntu安装pcl-程序员宅基地

文章浏览阅读1.9k次。基于Ubuntu18.04安装PCL点云_ubuntu安装pcl

python: plt.cm.Set1, Set2,Set3返回颜色-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏9次。cm代表color map,即颜色映射地图,Set1, Set2, Set3是它的三个颜色集合,可返回颜色。该网站可在线测试本文代码,以便快速理解本文代码:http://kakazai.cn/index.php/Kaka/Python/query?name=cm.setimport matplotlib.pyplot as plt#颜色可用元组表示,元组由4个元素组成,每个元素范围在[0..._plt.cm.set1

Linux命令之 --- chmod命令_chmod -r啥意思-程序员宅基地

文章浏览阅读2.7k次。chmod是控制用户权限的命令。每个文件活目录的权限有三组,分别是拥有者、同组用户、其他用户。先用【ls -l】查看一下文件的权限在上图中,标黄色部分,共有10个位置。第一个字符是指定文件类型,如果第一个字符是横线,表示是一个非目录的文件。如果是d,则表示是一个目录。从第二个字符开始到第十个共9个字符,3个字符为一组,分别表示了3组用户对文件或者目录的权限。权限依次为rwx,当没有相应权限是,就使用-来代替。rwx:r代表可读,w代表可写,x代表可执行。通过上面命令知道文件或者目录的权限后,_chmod -r啥意思

Easyexcel 实现批量插入图片_easyexcel导入图片-程序员宅基地

文章浏览阅读6.1k次。目录1 Maven依赖2 PictureModel3CustomPictureHandler4 调试代码5 调试结果注:1 Maven依赖 <!--hutool工具包--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifact.._easyexcel导入图片

用PASS软件完成多组率的样本量计算_pass样本量计算官网-程序员宅基地

文章浏览阅读3k次。pass教程:链接:https://pan.baidu.com/s/1fn7AbMtrOJ0hWWghe7yFaA?pwd=shtd 提取码:shtd 临床上经常碰到3组或3组以上的比较,结局可能是比例或率,或定量变量,或事件。如果是率的话,如何计算样本量呢?多组率的样本量计算公式可以从两个角度来计算,整体差异比较的角度和两两比较的角度。不同的研究目的所应用的样本量计算方式不同,本篇首先从整体差异性比较的角度,以三组为例开展实例分析操作。研究设计为随机对照试验。本研究探讨的是不同强度的运动干预对产后抑郁_pass样本量计算官网

恒生电子股份有限公司--软件测试--《社招、校招jd、校招行程,招聘动态》整理-程序员宅基地

文章浏览阅读3.2k次。恒生电子股份有限公司第一目标目录社招jd校招jd附件(校招行程,招聘动态)互联网金融行业详细介绍:1995年2月,恒生电子创始团队八位年轻的工程师怀揣梦想,毅然决然投身于金融IT领域,2003年12月,恒生电子股份有限公司在上海证券交易所主板上市(代码600570),是中国领先的金融软件和网络服务供应商业务范围包括证券、基金、期货、银行、信托、保险、财资...