小熊派移植华为 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

智能推荐

SaaS到底是什么,如何做?这份笔记讲明白了_saas如何开发-程序员宅基地

文章浏览阅读1.3k次。阅读本篇文章,您将可以了解:1、什么是SaaS;2、SaaS的商业模式;3、SaaS的技术架构;4、国内比较好的SaaS平台。_saas如何开发

摄像头接入_大华sdk frealdatacallback码流输出链接-程序员宅基地

文章浏览阅读1.5k次。摄像头接入目前摄像头直播的方案主要有以下几种方式: rtsp方式接入,只能实现视频预览 国标协议接入,实现比较复杂,需要多实现SIP服务器 通过netsdk获取到视频码流,推流到流媒体服务器,通过wsflv,flv,hls等流媒体协议播放,H265不支持 一、采用方案对比后最终采用了第三种方式,java使用jna的方式接入大华netsdk,获取到dav视频码流后去除大华头尾,拿到H264裸码流,通过javacv(对ffmpeg、opencv等库的封装)推送到.._大华sdk frealdatacallback码流输出链接

git-commit-amend踩坑_git remote-tracking 本地commit amend不了-程序员宅基地

文章浏览阅读1.4k次。因为改动比较小,所以我不想重建一个commit,于是我是用了git commit --amend命令,由于之前已经将该commit推送到远程仓库,导致修改后推送失败。百度后发现如果你的commit已经push到了远程仓库,那么使用--amend修改commit后,git push时一定要使用 --force-with-lease 参数来强制推送,否则就会报错。这是我自己推送失败的例子解决方式一、第一种使用后git commit --amend -m "修改Git学习(三)指令"注意:-m “._git remote-tracking 本地commit amend不了

AI实验1——八数码问题_人工智能实验八数码难题-程序员宅基地

文章浏览阅读2.5k次,点赞6次,收藏15次。AI实验1——八数码问题一、实验目的与要求实验目的:1 . 熟悉状态空间表示法;2.掌握深度优先、广度优先和等代价无信息搜索算法;3.掌握启发式函数设计,实现面向实际问题的A*搜索算法;二、实验内容与方法实验内容:利用无信息搜索算法实现八数码难题求解;设计启发式信息函数,利用A*搜索实现八数码难题求解;三、实验步骤与过程1,问题分析在八数码难题中,我们使用状态空间表示法,将八数码矩阵(即矩阵的状态)设置为一个节点类(Node),各个节点之间通过操作集(Operater)[‘U_人工智能实验八数码难题

【Js canvas实现是否透明,抠图等功能原理】_js-demo抠图-程序员宅基地

文章浏览阅读2.8k次,点赞4次,收藏11次。透明背景转jpg格式后变黑我们先看demo,您可以狠狠地点击这里:png图片是否含有透明像素JS检测demo如果是不含透明色的PNG图片,则会提示不含透明;如果是,则提示含透明,如下截图:是否背景透明的检测检测原理是借助canvas的getImageData()方法,关于此方法具体API和使用,可以参见““像素点信息获取”这里的详细介绍。_js-demo抠图

[附源码]java毕业设计高校班主任班级管理系统_高校班级管理系统-程序员宅基地

文章浏览阅读1.1k次。的需求进行调查研究,在对系统进行认真分析之后,得出开发整个系统的各项需求。为降低整个系统的复杂度,而使其更加便于修改,提高代码的可读性,我们会将系统模块化,模块间保持相对独立,且每个模块只完成一个子功能,并且与其他模块通过简单的接口链接,即高内聚低耦合原则,而使整个系统能够拥有一个高性能的结构,这边是系统概要设计最重要的目的。所以该系统的开发实现了最大的意义和价值,在系统完成后,利益是否大过于成本,是否能够达到预期效果,这些方面都要进行可行性分析,再通过分析之后,就可以决定是否开发此系统。_高校班级管理系统

随便推点

html静态页面微信分享带缩略图,【荐】静态页面实现微信分享带缩略图、标题和描述...-程序员宅基地

文章浏览阅读1.2k次。这篇文章主要为大家详细介绍了【荐】静态页面实现微信分享带缩略图、标题和描述,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。静态页面实现微信分享带缩略图、标题和描述,想法很现实,要想实现这样的功能这里就要用到大ajax技术,在这里361源码分享给大家。服务端文件jssdk.php代码:..._html分享链接加图片和描述不需要调用jssdk

VASP学习1入门知识_vaspwiki-程序员宅基地

文章浏览阅读5.9k次,点赞10次,收藏63次。大师兄科研实例使用方法:1从最基本的计算开始,通过示例讲解,结合一些脚本的使用,引导大家思考解决自己的问题。因此,在这本书的学习过程里,每一章节会对应一个例子,大家务必手动搭建模型,输入文件(切忌复制粘贴),然后进行计算,得到和大师兄一致的结果。为了引导大家主动浏览官网解决问题,很多都会采用VASP官网的例子。2如何学习本书,大师兄在学习程序时,受learn_python_the_hard_w..._vaspwiki

想说好多话_好多好多话-程序员宅基地

文章浏览阅读222次。以前觉得深圳好热,可是现在觉得沈阳的风好冷…每天不需要说太多的话,只要敲着喜欢的键盘,默默的清理掉禅道上的bug就好,这样的工作似乎是充实的,却总是少点什么,我也喜欢上了活在自己的小世界里,喜欢上了听歌,喜欢去刷微博,喜欢上去看那些心灵鸡汤和搞笑的博主,喜欢看看最近的陈伟霆是不是有帅了,偶尔碰到一条好玩的微博似乎会笑上一会儿,可能作为一个程序猿,真的比较枯燥叭,有时觉得孤单的像一条_好多好多话

简述计算机维修 维护的基本原则是什么,计算机硬件维护的四大原则-程序员宅基地

文章浏览阅读2.4k次。计算机硬件维护的四大原则近年来,随着社会经济的快速发展和计算机网络技术的广泛应用,如今计算机已经成为生产生活中不可或缺的必需品,随之而来就出现一些问题。下面是YJBYS小编为大家搜索整理的关于计算机硬件维护的四大原则,欢迎参考阅读,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生培训网!对于计算机而言,主要包括硬件系统与软件系统两部分,其中硬件系统是软件系统功能得以实现的重要基础和前..._硬件维修的基本原则?

java有趣的技术分享ppt,java面试数据结构与算法高频考-程序员宅基地

文章浏览阅读736次。前言本文涵盖了阿里巴巴、腾讯、字节跳动、京东、华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样会研究大厂的面试题。与此同时,今年算法面试一定是会被问的,而算法不是光靠背面试题就有用的,它是需要数学逻辑思维的,因此,小编会在文末为大家准备一份非常优质的算法学习手册,重点在于学习思维方法,话不多说,直接开始上精选的大厂面试真题!在校生如果你是在校生,你应该趁着在学校的时间夯实基础(比如计算机系统、_java有趣的技术分享

MapReduce统计以某字母开头的单词的平均长度_mapreduce计算平均单词长度-程序员宅基地

文章浏览阅读1.7k次。MapReduce统计以某字母开头的单词的平均长度用MapReduce编写程序主要的就是编写Map和Reduce函数、main函数java代码如下package section1;import java.io.IOException;import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuratio..._mapreduce计算平均单词长度

推荐文章

热门文章

相关标签