前言

OpenHarmony来势汹汹,第一次开源,仅支持LiteOS-a,所以,在此有必要学习一下LiteOS。或许工作上用不上Harmony,但是,星星之火可以燎原,助力完善 lot 生态应该可以。那就从 MCU 开始吧,移植 LiteOS。

链接

参考

  • 野火
  • 上面链接

笔录草稿

  • 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 接口
  • 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:低功耗框架代码

移植过程

1. 拷贝文件

  • 在工程路径上创建 LiteOS 文件夹
  • 拷贝 LiteOS 源码中的 arch、cmsisLiteOS 提供的 cmsis os 接口实现

    kernel 三个文件夹到 工程 LiteOS 文件夹中。
  • 拷贝 LiteOS源码下对应 demosOS_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

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
    • 内存地址
      • BOARD_SRAM_START_ADDR

        • 根据编译器中 RAM 配置的其实地址设置,这里为 0x20000000。
      • BOARD_SRAM_SIZE_KB

        • 分配给系统使用的内存,即是RTOS管理的总堆栈。这里设置为 20。

6. 屏蔽裸机中的两个中断

在 stm32fxxx_it.c 文件中注释掉 PendSVSysTick 中断即可。

  • 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移植篇的更多相关文章

  1. 【LiteOS】STM32F103-LiteOS移植教程(详细篇)【华为云技术分享】

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

  2. 【LiteOS】STM32F103-LiteOS移植教程(详细篇)

    总览 本文基于STM32F103C8T6,详细讲述华为LiteOS的移植过程.开发工具是MDK5.LiteOS官方已经适配过cortex M系列内核的单片机,因此移植过程非常简单. LiteOS有两种 ...

  3. 【LiteOS】LiteOS移植常见问题

    发现很多人在LiteOS的移植过程中总会遇到一些问题,现在简单做一些总结.后续有新的问题提再继续补充. 1.CMSIS版本导致的问题 问题现象一般如下图所示,编译后报错,Undefined symbo ...

  4. 华为Liteos移植到stm32F03ZE

    华为Liteos和物联网设备侧sdk移植到stm32F03ZE霸道板子上 推荐官方教程:https://liteos.github.io/ 啥是LIteos "开源免费"的实时操作 ...

  5. 漫谈LiteOS之开发板-LiteOS移植(基于GD32450i-EVAL)

    1 为什么移植? 嵌入式设备的芯片型号和外设的差异较大,资源有限.而RTOS无法适配集成所有的驱动,因此会先适配部分开发板,然后通过移植使得适配更多的开发板. 可移植性是嵌入式操作系统与普通操作系统的 ...

  6. OpenHarmony LiteOS C-SKY指令集移植指北

    摘要:本文介绍在OpenHarmony社区LiteOS-M项目中新增C-SKY指令集的开发流程,以及适配相应qemu工程的方法和步骤,供LiteOS内核相关开发者学习交流. 本文分享自华为云社区< ...

  7. 科普干货|漫谈鸿蒙LiteOS-M与HUAWEI LiteOS内核的几大不同

    摘要:鸿蒙和LiteOS的内核都是一样的名字,可它们究竟有什么不同呢?一起来对比一下文件吧! HarmonyOS系统 HarmonyOS是一款"面向未来".面向全场景(移动办公.运 ...

  8. 华为方舟编译器 下载 和 LiteOS Studio Setup 2019-04-16.exe SDK下载

    华为方舟编译器是首个取代Android虚拟机模式的静态编译器,可供开发者在开发环境中一次性将高级语言编译为机器码.此外,方舟编译器未来将支持多语言统一编译,可大幅提高开发效率. 编译器下载 [Ark] ...

  9. 物联网打工人必备:LiteOS Studio图形化调测能力

    摘要:本文会给大家介绍下LiteOS Studio的调测的几个知识点,包括: 调测配置,监视变量,反汇编代码同步展示,数值进制切换,跨平台编译调测,Qemu模拟器调测,多核调测,远程设备调测等. 掌握 ...

随机推荐

  1. 加密算法大全图解 :密码体系,对称加密算法,非对称加密算法,消息摘要, Base64,数字签名,RSA,DES,MD5,AES,SHA,ElGamal,

    1. 加密算法大全: ***************************************************************************************** ...

  2. CSS 水平滚动条 bug & width auto increase bug

    CSS 水平滚动条 bug css overflow & width auto increase bug 问题排查方式 删除可疑的模块,一步步找到问题的原因,定位问题所在 寻找可能会导致 wi ...

  3. Angular 2020

    Angular 2020 https://angular.io/start https://angular.io/guide/browser-support "@angular/core&q ...

  4. 小程序 webview 自动打开新页面

    小程序 webview 自动打开新页面 iframe 效果 https://nervjs.github.io/taro/docs/components/open/web-view.html 怎么阻止小 ...

  5. Node.js & module.exports & exports

    Node.js & module.exports & exports https://www.cnblogs.com/xgqfrms/p/9493550.html exports &a ...

  6. WEB 面向开发者的结构化数据

    通常用于google搜索 See also: video 探索搜索库

  7. DENIEL SOIBIM:真正自律的人都在做这些事情!

    生活节奏的加快,使得很多人无法适从.很多人,浑浑噩噩,庸庸碌碌,觉得一天做了很多事,却总是一事无成.还有些人,觉得得过且过也很好,但是到头来,却让自己陷入慌乱之中.本想要自由自在的生活,但是却往往却被 ...

  8. 关于Python 编码的一点认识

    在计算机中,所有数据的存储.运算以及传输都必须是二进制数字,因为计算机只认识0和1. 当一个人把一份数据传给另一个人时,计算机传递的是其实是二进制数字,但这些数字需要被还原为原始信息. 这个工作当然是 ...

  9. 1047 Student List for Course ——PAT甲级真题

    1047 Student List for Course Zhejiang University has 40,000 students and provides 2,500 courses. Now ...

  10. javascript中的内置对象和数据结构

    目录 简介 基础类型 undefined Boolean和Boolean对象 Number和BigInt String Symbol null Object Function Date Array K ...