给STM32装点中国风——华为LiteOS移植
我都二手程序员好几个礼拜了!想给我的STM32来点“中国风”,装个华为LiteOS操作系统。
在此之前,我也试过STM32CubeMX自带的FreeRTOS操作系统,不知是何缘故,用F103c8t6芯片时,FreeRTOS里的一个断言过不去。出师不利,决定换LiteOS试试,尽管移植LiteOS有些麻烦,不如STM32CubeMX生成的方便,但是,移植成功后,编译没有问题、运行也没有问题,这让我这个初学者增添了不少信心。
FreeRTOS与LiteOS孰优孰劣,我真的不知道,不过,我知道我喜欢CubeMX,Keil也算凑活,所以,想用大白话说说,如何给STM32CubeMX创建的MDK-ARM工程移植LiteOS。如果,你也想用华为LiteOS操作系统,可以继续往下看,若是内行高手,“要是你拿正眼多看我一眼,那你就输了”。
一、 准备一个STM32CubeMX工程
没什么特殊要求,注意以下两点:一、SYS 时钟源不要用SysTick。二、项目管理中Toolchain选择MDK-ARM。


二、 LiteOS源码去那里找
上面给的链接不是最新发行版,新版本增加了些芯片架构的支持,暂时还不会用。先来个打了标签LiteOSV200R001C50B038的版本。下图中红框标注的4个目录是我们需要的。

三、 把LiteOS源码拷贝到咱的Keil工程目录下
LiteOS源码下载好了吧?我们开始给Keil工程添加LiteOS源码。
先在Keil工程根目录下,建一个目录
LiteOS,用来放置LiteOS的源码,(其实目录名叫什么不重要,看你高兴)。在新建的LiteOS目录下,再整4个子目录,分别叫它们
Kernel、Arch、CMSIS、Config。看看它们的名字,想必您已经猜到了,我想在里面放些什么了,对喽,就是图1中那4个目录所对应的内容。怎么复制源码呢?是不是这个姿势...

不必这样,按照下面的图片复制就好。
首先,Kernel目录:
把LiteOS源码中
kernel目录下的内容全部复制到工程里的.\LiteOS\Kernel目录下,然后再把.\LiteOS\Kernel\base\mem目录下的两个子目录bestfit、tlsf删除。
接下来是Arch目录:
从LiteOS源码arch\arm\arm-m中复制两个目录src、include到工程.\LiteOS\Arch目录下。
然后,根据你的STM32芯片的具体架构(cortex-m3或cortex-m4 ??),选择复制arch\arm\arm-m\contex-m?\keil\los_dispatch_keil.S到工程.\LiteOS\Arch目录下。下图,我的芯片是Cortex-m3的。

复制好以后,Arch目录长这样。

- 现在是,CMSIS目录:
这个目录下是与操作系统供应商无关的抽象层,复制LiteOS源码osdepends\liteos\cmsis目录中的文件到工程目录.\LiteOS\CMSIS目录下。

- 最后,复制Config目录:
这个目录下应放置和你芯片相匹配的配置文件,咱们先去LiteOS源码的targets目录下找一个合适的,然后把它里面OS_Config目录下的头文件(.h 文件),复制到工程的.\LiteOS\Config目录下。

复制好以后,我的Config目录是这个样子的。

四、 在Keil工程中添加分组(Groups)
在Keil的IDE环境中,分别添加以下4个分组:
- LiteOS/Kernel
- LiteOS/Arch
- LiteOS/CMSIS
- LiteOS/Config
在LiteOS/Kernel分组下,我们添加上面复制在..\LiteOS\Kernel目录下(包含子目录下)的所有.c的源文件。
在LiteOS/Arch分组下,添加..\LiteOS\Arch目录下(包含子目录下)所有.c的源文件,还不够,还有那个名为los_dispatch_keil.S的汇编源文件也得添加。
在LiteOS/CMSIS分组下,添加..\LiteOS\CMSIS目录下的cmsis_liteos.c。
在LiteOS/Config分组下,添加..LiteOS\Config目录下的所有.h的头文件,其实,这个分组不建,程序照样能跑,但是,为了以后修改参数方便,我们还是先安排上吧。
五、 给Keil工程添加头文件引用路径
添加内容如下:
../LiteOS/Arch/include
../LiteOS/Kernel/include
../LiteOS/Kernel/base/include
../LiteOS/Kernel/extended/include
../LiteOS/Config
../LiteOS/CMSIS

六、 注释掉STM32生成的两个中断处理函数(PendSV_Handler、SysTick_Handler)
它们俩藏在一个叫stm32f?xx_it.c的文件中, 注释掉就好。
七、 修改配置
记得前面创建的Keil工程分组LiteOS/Config分组吗?配置参数就藏在这儿。
分组中有个叫target_config.c文件,你可以根据使用的芯片,在这修改一下#define BOARD_SRAM_SIZE_KB 40参数,据说,该值应该比芯片实际的SRAM略小。
其它的参数,在实际开发过程中,慢慢研究调整吧。我读书少,更多的内容也搞不清楚。
到这里,LiteOS的移植工作算是差不多了,接下来,点一盏灯,验证一下"来时的路"。
八、 一灯大师,发功了

在main.c 引入头文件
#include "cmsis_os.h"在main.c 申明俩个变量
/* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */
osThreadId_t default_taskHandle;
const osThreadAttr_t default_task_attributes = {
.name = "default_task",
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* USER CODE END PV */
在main.c 申明两个函数
/* USER CODE BEGIN PFP */
/* LITEOS BEGIN PFP */
void StartDefaultTask(void *argument);
void LiteOS_Init(void);
/* LITEOS END PFP */
/* USER CODE END PFP */在main.c中,实现上面的函数
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void LiteOS_Init(void)
{
osKernelInitialize();
default_taskHandle = osThreadNew(StartDefaultTask, NULL, &default_task_attributes);
} void StartDefaultTask(void *argument)
{
while(1)
{
/* 一灯大师,请试试在这里点一盏灯。 */
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
osDelay(200);
}
}
/* USER CODE END 0 */
在main.c中,
int main(void)函数体里调用/* USER CODE BEGIN 2 */
LiteOS_Init();
osKernelStart(); //注意,这东西要在main的while之前 /* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
灯亮了吗?祝您成功!
九、 手搓 LiteOS移植工具
写到这儿,不知道我讲清除了没有。还不行的话,我准备了一个手搓移植工具,要不您也试试。
我把它放这儿了,Python实现,有源码,改改给Makefile工程移植应该也行。它长下面这副德行:

LiteOS移植完成后,如果再次点击STM32CubeMX中的
GENERATE CODE按钮,会把工具注释掉的两个中断处理函数恢复出来,这时需要您手工注释掉它们。PendSV_Handler、SysTick_Handler他们在..\Core\Src\stm32f?xx_it.c文件中。或者,也可以再次点击工具中的开始移植按钮,也能注释掉它们。根据实际情况设置LiteOS的
BOARD_SRAM_SIZE_KB参数, 这个值应略小于芯片的SRAM,LiteOS配置文件位于LiteOS\Config分组下的target_config.h文件中,约在283行处#define BOARD_SRAM_SIZE_KB 40。 本工具定义了一些芯片的SRAM设置尺寸,由于个人能力问题,它们既不全面,也不准确。(工具中关于芯片配置定义,见stm32.py中的枚举类class STM32)
给STM32装点中国风——华为LiteOS移植的更多相关文章
- 华为Liteos移植到stm32F03ZE
华为Liteos和物联网设备侧sdk移植到stm32F03ZE霸道板子上 推荐官方教程:https://liteos.github.io/ 啥是LIteos "开源免费"的实时操作 ...
- 【LiteOS】Liteos移植篇
目录 前言 链接 参考 笔录草稿 移植(2018) 移植获取 (Cortex-M 内核) 主要文件夹分析 移植过程 1. 拷贝文件 2. 创建工程分组 3. 添加头文件路径 4. 兼容 C99 模式 ...
- 【LiteOS】LiteOS移植常见问题
发现很多人在LiteOS的移植过程中总会遇到一些问题,现在简单做一些总结.后续有新的问题提再继续补充. 1.CMSIS版本导致的问题 问题现象一般如下图所示,编译后报错,Undefined symbo ...
- 漫谈LiteOS之开发板-LiteOS移植(基于GD32450i-EVAL)
1 为什么移植? 嵌入式设备的芯片型号和外设的差异较大,资源有限.而RTOS无法适配集成所有的驱动,因此会先适配部分开发板,然后通过移植使得适配更多的开发板. 可移植性是嵌入式操作系统与普通操作系统的 ...
- 华为LiteOS系统使用-任务调度函数-第一篇
1.最近项目遇到华为的LiteOS小型操作系统,使用学习 2. 先打开一个工程LiteOS_Kernel-master\projects\LPC824_LITE_KEIL 3. main.c里面2个关 ...
- 华为liteos了解(一)
我来补充一下,从@華仔答案的提供的wiki中看,随便翻了一下,内核部分和协议栈的接口部分代码风格完全不一致.协议栈和相关的代码应该是直接使用或者修改了uIP (micro IP)的实现,所以整体感觉应 ...
- 基于STM32的无损压缩算法miniLZO移植,压缩率很高,20KB随机数压缩到638字节,耗时275us
说明: 1.miniLZO是采用C编写的无损压缩库. 2.提供了快速压缩和超快速解压缩能力. 3.比较耗内存,需要64KB内存用于压缩,对于H7这种大内存的,非常合适.或者有外置SRAM/SDRAM的 ...
- 【LiteOS】STM32F103-LiteOS移植教程(详细篇)【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 【LiteOS】STM32F103-LiteOS移植教程(详细篇)
总览 本文基于STM32F103C8T6,详细讲述华为LiteOS的移植过程.开发工具是MDK5.LiteOS官方已经适配过cortex M系列内核的单片机,因此移植过程非常简单. LiteOS有两种 ...
- 手把手教你丨小熊派移植华为 LiteOS-M
摘要:本文详细讲解如何移植 LiteOS 到小熊派. 本文分享自华为云社区<小熊派移植华为 LiteOS-M(基于MDK)>,作者: JeckXu666. 前言 之前使用小熊派实现了鸿蒙动 ...
随机推荐
- 微服务性能分析工具 Pyroscope 初体验
Go 自带接口性能分析工具 pprof,较为常用的有以下 4 种分析: CPU Profiling: CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主 ...
- 【技术积累】Linux中的命令行【理论篇】【一】
7z命令 命令介绍 7z命令是Linux系统中的一个压缩和解压缩工具,它可以用来创建.压缩和解压缩7z格式的文件.7z是一种高压缩率的文件格式,通常比其他常见的压缩格式(如zip和gzip)具有更高的 ...
- Angular: Error: NG0100: ExpressionChangedAfterItHasBeenChecked
错误原因 当变更检测完成后又更改了表达式的值时,Angular就会抛出ExpressionChangedAfterItHasBeenCheckedError 错误,Angular只会在开发模式下抛出此 ...
- 你可得知道物理地址与IP地址
来看看计算机网络中这些常见的概念你有没有理解~ 物理地址 表示方式 物理地址即mac地址,每个网卡都有6字节的唯一标识,前三个字节表示厂商,后三个字节由厂商随机分配. 如何查看 在 command 中 ...
- msvc++工程之vs版本升级及工程目录规范
为什么要升级msvc++工程版本 对msvc++工程进行vs版本升级,一方面是可以使用较新的C++标准及对64位更好的支持. 首先你需要对msvc++ project文件有一定的了解,主要是vcxpr ...
- docker安装phpmyadmin
下载docker镜像 docker pull phpmyadmin/phpmyadmin 创建容器 # 假设MySQL服务器的地址为:192.168.0.10,端口3306 # 通过3360端口访问p ...
- jmeter:json提取一个字段的多个值,用逗号分隔
目的:将接口响应结果中的一个字段的所有值同时提取,作为参数传给下个接口 1. 格式化接口响应结果 获取下图中所有object里面的EMP_UID 2. json提取 JSON Path express ...
- 一个可将执行文件打包成Windows服务的.Net开源工具
Windows服务一种在后台持续运行的程序,它可以在系统启动时自动启动,并在后台执行特定的任务,例如监视文件系统.管理硬件设备.执行定时任务等. 今天推荐一个可将执行文件打包成Windows 服务的工 ...
- 新一代Kerberos攻击 钻石票据与蓝宝石票据
新一代Kerberos攻击 | 钻石票据与蓝宝石票据 0x01 前言 在了解票据攻击的过程中,看见了一篇文章使用Rubeus进行钻石票据攻击.但是没有原理,于是抱着学习的心态在Google上寻找文章发 ...
- WPF --- 非Button自定义控件实现点击功能
引言 今天在做一个设置文件夹路径的功能,就是一个文本框,加个按钮,点击按钮,弹出 FolderBrowserDialog 再选择文件夹路径,简单做法,可以直接 StackPanel 横向放置一个 Te ...