【LiteOS】Liteos移植篇
前言
OpenHarmony来势汹汹,第一次开源,仅支持LiteOS-a,所以,在此有必要学习一下LiteOS。或许工作上用不上Harmony,但是,星星之火可以燎原,助力完善 lot 生态应该可以。那就从 MCU 开始吧,移植 LiteOS。
链接
-
- 包含 裸机源码
- LiteOS 工程模板
- 其它关于 LiteOS 的 demo 及 note
参考
- 野火
- 上面链接
笔录草稿
- los_init.c中的大部分内容已经移到了los_config.c里面了,可以看那里面的内容
- 使用软件定时器则必须要使用消息队列,否则不会使用软件定时器。
移植(2018)
在移植的时候暂时不建议获取最新(不要使用202003)后推送的版本)的版本默认只支持 GCC ,且 MDK 官方移植教程未出。所以只能在 github 获取源码来移植 LiteRTOS。(时间截止于 20200922*)
移植方案分为两种:
- 硬中断接管方案
- 不接管中断方案
由于硬中断接管方案移植难度比不接管中断方案大,所以,本次笔记记录不接管中断方案。
移植获取 (Cortex-M 内核)
* RAM 大于 8K
* ROM 大于 20K
- 裸机空工程
- 能正常运行 main 函数
- 本次移植基于 STM32F103VCT6
- LiteOS 源码
- 时间截止于 20200922 ,不推荐获取官方最新推送的源码,因为最新版本默认只支持 GCC ,且 MDK 官方移植教程未出。(可尝试获取最新版本+旧版本补全)
- 建议获取 2018 年左右推送的版本。
- 本教程源码源于2018年版本,也会对比新版本做说明。
主要文件夹分析
官方代码导读 *该链接为最新版本的文件分析,与下面的会有所不同,具体按照实际下载版本导读 *
- arch
- arm
- arm-m:M 核中断、调度、tick 相关代码
- common:arm 核公用的 cmsis core 接口
- arm
- components
- cmsis:LiteOS 提供的 cmsis os 接口实现
- kernel
- base
- core:LiteOS 基础内核代码文件,包括队列、task 调度、软 timer、时间片等功能
- OM:与错误处理相关的文件
- include:LiteOS 内核内部使用的头文件
- ipc:LiteOS 中 ipc 通讯相关的代码文件,包括事件、信号量、消息队列、互斥量等
- mem:LiteOS 中的内核内存管理的相关代码
- misc:内存对齐功能以及毫秒级休眠 sleep 功能
- include:LiteOS 开源内核头文件
- extenden
- ticless:低功耗框架代码
- base
移植过程
1. 拷贝文件
- 在工程路径上创建 LiteOS 文件夹
- 拷贝 LiteOS 源码中的 arch、cmsis(LiteOS 提供的 cmsis os 接口实现)
和 kernel 三个文件夹到 工程 LiteOS 文件夹中。 - 拷贝 LiteOS源码下对应 demos 中 OS_CONFIG 文件夹到上述路径。
- OS_CONFIG 该文件夹主要配置文件,用于内核配置和裁剪。
- 拷贝 keil 安装目录下的一个文件夹到工程 工程\Libraries\CMSIS。
- 安装路径目录下的一个文件夹,其参考路径为:D:\Keil_v5\ARM\Pack\ARM\CMSIS\4.2.0\CMSIS\Include
- 移植理由
- 避免其它电脑在移植过程中没有相关头文件而引起的编译错误。
2. 创建工程分组
新建 4 个工程分组:
- LiteOS/cmsis
- 添加 cmsis_LiteOS.c 文件
- LiteOS/kernel (所有需要用到的 .c 文件)
- \LiteOS\kernel\base\core 所有.c 文件
- \LiteOS\kernel\base\ipc 所有.c 文件
- \LiteOS\kernel\base\mem\bestfit_little 所有.c 文件
- \LiteOS\kernel\base\mem\common 所有.c 文件
- \LiteOS\kernel\base\mem\membox 所有.c 文件
- \LiteOS\kernel\base\misc 所有.c 文件
- \LiteOS\kernel\base\om 所有.c 文件
- \LiteOS\kernel\extended\tickless 所有.c 文件
- \LiteOS\kernel los_init.c
- LiteOS/arch
- \LiteOS\arch\arm\arm-m\src 所有.c 文件
- \LiteOS\arch\arm\arm-m\cortex-m?\keil los_dispatch_keil.S
- ?:代表当前需要移植到哪一种内核的chip上。如cortex-m3。
- LiteOS/config
- \LiteOS\OS_CONFIG
- los_builddef.h(可选)
- los_printf.h(可选)
- target_config.h
- \LiteOS\OS_CONFIG
3. 添加头文件路径
参考图片:
4. 兼容 C99 模式
- 在 target->C/C++->Language/Code Generation 中勾选 C99 Mode
- 在 target->C/C++->MiscControls 框中输入 --diag_suppress=1,47,177,186,223,1295
- 意思是忽略这些编号的警号
- 意思是忽略这些编号的警号
5. 内核配置与裁剪(非接管中断的stm32f103vct6)
- 主要在 target_config.h 文件上配置,具体内容直接看源码,这里列出几个主要的点:
- 修改头文件
#include "stm32f1xx.h"
为#include "stm32f10x.h"
- 宏OS_SYS_CLOCK
- 表示 CPU 主频
- 如STM32VCT6 配置为 72MHz,即是 72000000
- 宏LOSCFG_BASE_CORE_TICK_PER_SECOND
- RTOS 心跳
- 对于 STM32F10x,一般设置 1ms-10ms,如设置为 1ms,则配置为 1000UL
- RTOS 心跳
- 内存地址
宏BOARD_SRAM_START_ADDR
- 根据编译器中 RAM 配置的其实地址设置,这里为 0x20000000。
宏BOARD_SRAM_SIZE_KB
- 分配给系统使用的内存,即是RTOS管理的总堆栈。这里设置为 20。
- 修改头文件
6. 屏蔽裸机中的两个中断
在 stm32fxxx_it.c 文件中注释掉 PendSV 与 SysTick 中断即可。
- SysTick
- 主要提供心跳
- PendSV
- 该异常可以进入任务调度检测并进行调度。
7. 完善代码
本工程基于本人编写的裸机框架,需要的可以参考。
- 在 LssAppConfig.h 文件中添加以下头文件:
/*
*********************************************************************************************************
* OS
*********************************************************************************************************
*/
#include "target_config.h"
#include "los_sys.h"
#include "los_typedef.h"
#include "los_task.ph"
#include "los_sem.h"
- 不废话,直接上写好的 main.c 文件(看源码比文字教程方便多了)
- 主要参考源码中的
- 任务创建函数
- 启动流程
- 该源码的启动流程采用的是 任务创建任务 的方案。
- 主要参考源码中的
/**
******************************************************************************
* @file main.c
* @author lss
* @version V1.0
* @date 2020-xx-xx
* @brief 主函数文件
******************************************************************************
* @attention
*
* 实验平台:LZM
* Wechat:qabc132321
******************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE
*********************************************************************************************************
*/
/* APP Config File */
#include "LssAppConfig.h"
/* prv */
#include "userMemoryConfig.h"
/* task */
#include "LedTask.h"
/***********************************************************************************************************
* 板子信息 [注]实时修改
***********************************************************************************************************/
BoardInfo_t BoardInfo = { .name = "LSS TEST",
.boardType = 0,
.boardNum = 0,
};
/***********************************************************************************************************
* 固件版本
***********************************************************************************************************/
#if defined(__CC_ARM) // 编译器相关
const unsigned MCU_VERSION1_ENTRY __attribute__((at(ParameterSectionVEntry))) = SystemProgramAddressEntry;
const unsigned MCU_VERSION1_SIZE __attribute__((at(ParameterSectionVEntry+0X04))) = SystemProgramAddressSize;
const unsigned CRP_VERSION1_NUM __attribute__((at(ParameterSectionVEntry+0X08))) = (0x01000000);
#endif
/***********************************************************************************************************
* 函数声明
***********************************************************************************************************/
void vStartTask (void );
/*
**********************************************************************************************************
句柄变量声明
**********************************************************************************************************
*/
static UINT32 xStartTask_Handle = NULL;
UINT32 xLedTask_Handle = NULL; //LED任务
/**
* @brief 创建vStartTask任务
* @param
* @retval
* @author lzm
*/
static UINT32 Creat_vStartTask_Task()
{
//定义一个创建任务的返回类型,初始化为创建成功的返回值
UINT32 uwRet = LOS_OK;
//定义一个用于创建任务的参数结构体
TSK_INIT_PARAM_S task_init_param;
task_init_param.usTaskPrio = lssConfigvStartTaskPRIO; /* 任务优先级,数值越小,优先级越高 */
task_init_param.pcName = "Start_Task";/* 任务名 */
task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)vStartTask;/* 任务函数入口 */
task_init_param.uwStackSize = lssConfigvStartTaskSIZE; /* 堆栈大小 */
uwRet = LOS_TaskCreate(&xStartTask_Handle, &task_init_param);/* 创建任务 */
return uwRet;
}
/**
* @brief 创建vLedTask任务
* @param
* @retval
* @author lzm
*/
static UINT32 Creat_vLedTask_Task()
{{
//定义一个创建任务的返回类型,初始化为创建成功的返回值
UINT32 uwRet = LOS_OK;
TSK_INIT_PARAM_S task_init_param;
task_init_param.usTaskPrio = lssConfigvLedTaskPRIO;
task_init_param.pcName = "Led Task";
task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)vLedTask;
task_init_param.uwStackSize = lssConfigvLedTaskSIZE;
uwRet = LOS_TaskCreate(&xLedTask_Handle, &task_init_param);
return uwRet;
}
/**
* @brief 创建应用任务
* @param
* @retval
* @author lzm
*/
void vStartTask (void )
{
UINT32 uwRet = LOS_OK;
UINTPTR uvIntSave;
// 进入临界
taskENTER_CRITICAL(uvIntSave);
uwRet = Creat_vLedTask_Task();
if (uwRet != LOS_OK)
{
;
}
// 删除本任务
LOS_TaskDelete(xStartTask_Handle);
// 退出临界
taskEXIT_CRITICAL(uvIntSave);
}
/**
* @brief mian函数
* @param
* @retval
* @author lzm
*/
int main(void)
{
uint32_t uwRet = LOS_OK; //定义一个任务创建的返回值,默认为创建成功
//bsp初始化
bspInit();
/* LiteOS 内核初始化 */
uwRet = LOS_KernelInit();
if (uwRet != LOS_OK)
{
;
}
/* 创建创建任务 */
uwRet = Creat_vStartTask_Task();
if (uwRet != LOS_OK)
{
;
}
/* 开启LiteOS任务调度 */
LOS_Start();
while(1);
}
【LiteOS】Liteos移植篇的更多相关文章
- 【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】LiteOS移植常见问题
发现很多人在LiteOS的移植过程中总会遇到一些问题,现在简单做一些总结.后续有新的问题提再继续补充. 1.CMSIS版本导致的问题 问题现象一般如下图所示,编译后报错,Undefined symbo ...
- 华为Liteos移植到stm32F03ZE
华为Liteos和物联网设备侧sdk移植到stm32F03ZE霸道板子上 推荐官方教程:https://liteos.github.io/ 啥是LIteos "开源免费"的实时操作 ...
- 漫谈LiteOS之开发板-LiteOS移植(基于GD32450i-EVAL)
1 为什么移植? 嵌入式设备的芯片型号和外设的差异较大,资源有限.而RTOS无法适配集成所有的驱动,因此会先适配部分开发板,然后通过移植使得适配更多的开发板. 可移植性是嵌入式操作系统与普通操作系统的 ...
- OpenHarmony LiteOS C-SKY指令集移植指北
摘要:本文介绍在OpenHarmony社区LiteOS-M项目中新增C-SKY指令集的开发流程,以及适配相应qemu工程的方法和步骤,供LiteOS内核相关开发者学习交流. 本文分享自华为云社区< ...
- 科普干货|漫谈鸿蒙LiteOS-M与HUAWEI LiteOS内核的几大不同
摘要:鸿蒙和LiteOS的内核都是一样的名字,可它们究竟有什么不同呢?一起来对比一下文件吧! HarmonyOS系统 HarmonyOS是一款"面向未来".面向全场景(移动办公.运 ...
- 华为方舟编译器 下载 和 LiteOS Studio Setup 2019-04-16.exe SDK下载
华为方舟编译器是首个取代Android虚拟机模式的静态编译器,可供开发者在开发环境中一次性将高级语言编译为机器码.此外,方舟编译器未来将支持多语言统一编译,可大幅提高开发效率. 编译器下载 [Ark] ...
- 物联网打工人必备:LiteOS Studio图形化调测能力
摘要:本文会给大家介绍下LiteOS Studio的调测的几个知识点,包括: 调测配置,监视变量,反汇编代码同步展示,数值进制切换,跨平台编译调测,Qemu模拟器调测,多核调测,远程设备调测等. 掌握 ...
随机推荐
- event duplication bind bug & h5 dataset flag solution
event duplication bind bug & h5 dataset flag solution https://codepen.io/xgqfrms/full/PaRBEy/ OK ...
- 如何用 js 实现一个类似微信红包的随机算法
如何用 js 实现一个类似微信红包的随机算法 js, 微信红包, 随机算法 "use strict"; /** * * @author xgqfrms * @license MIT ...
- 图解 Webpack 4.x 热更新原理
图解 Webpack 4.x 热更新原理 Webpack HMR ️ module.hot & module.hot.accept if (module.hot) { module.hot.a ...
- Learning web development with MDN
Learning web development with MDN Server-side website programming Dynamic Websites – Server-side pro ...
- Typescript All In One
Typescript All In One TypeScript 3.5 is now available. https://www.typescriptlang.org/#download-link ...
- html fragment & svg remove xml namespace
html fragment & svg remove xml namespace https://developer.mozilla.org/en-US/docs/Web/API/Docume ...
- macOS & Nginx
macOS & Nginx ngnix # 使用 brew 安装(如果没有 brew 命令,需要自行安装 brew) $ brew install nginx $ nginx -h # 查看 ...
- BGV再度爆发,流通市值破500万美金!
BGV似乎以超乎寻常的姿态,开启了爆发的模式.这两天,BGV一路上涨,日内最高涨至548.78美金,24小时成交额达到了98.07万美金,24小时成交量达到1844.93枚BGV,流通市值更是突破了5 ...
- 11_MySQL如何让数据分页显示
-- 数据分页 SELECT empno,sal FROM t_emp LIMIT 5;
- Linux内核的TCP协议栈和内核旁路的选择?
[前言]最近在实习公司用到了solarflare的万兆网卡,用到了网卡的openonload技术还有TCPDirect模式代码的编写,其理论基础都是内核旁路.网上关于内核旁路技术的介绍基本就两篇,我结 ...