目录
OpenHarmony来势汹汹,第一次开源,仅支持LiteOS-a,所以,在此有必要学习一下LiteOS。或许工作上用不上Harmony,但是,星星之火可以燎原,助力完善 lot 生态应该可以。那就从 MCU 开始吧,移植 LiteOS。
野火
上面链接
los_init.c中的大部分内容已经移到了los_config.c里面了,可以看那里面的内容
使用软件定时器则必须要使用消息队列,否则不会使用软件定时器。
在移植的时候暂时不建议获取最新(不要使用202003)后推送的版本)的版本默认只支持 GCC ,且 MDK 官方移植教程未出。所以只能在 github 获取源码来移植 LiteRTOS。(时间截止于 20200922*)
移植方案分为两种:
由于硬中断接管方案移植难度比不接管中断方案大,所以,本次笔记记录不接管中断方案。
* RAM 大于 8K
* ROM 大于 20K
裸机空工程
LiteOS 源码
本教程源码源于2018年版本,也会对比新版本做说明。
官方代码导读 *该链接为最新版本的文件分析,与下面的会有所不同,具体按照实际下载版本导读 *
arch
arm
components
kernel
base
include:LiteOS 开源内核头文件
extenden
在工程路径上创建 LiteOS 文件夹
拷贝 LiteOS 源码中的 arch、cmsis(LiteOS 提供的 cmsis os 接口实现)
和 kernel 三个文件夹到 工程 LiteOS 文件夹中。
拷贝 LiteOS源码下对应 demos 中 OS_CONFIG 文件夹到上述路径。
拷贝 keil 安装目录下的一个文件夹到工程 工程\Libraries\CMSIS。
新建 4 个工程分组:
LiteOS/cmsis
LiteOS/kernel (所有需要用到的 .c 文件)
LiteOS/arch
LiteOS/config
\LiteOS\OS_CONFIG
参考图片:
在 target->C/C++->Language/Code Generation 中勾选 C99 Mode
在 target->C/C++->MiscControls 框中输入 --diag_suppress=1,47,177,186,223,1295
意思是忽略这些编号的警号
主要在 target_config.h 文件上配置,具体内容直接看源码,这里列出几个主要的点:
修改头文件 #include "stm32f1xx.h"
为#include "stm32f10x.h"
宏OS_SYS_CLOCK
宏LOSCFG_BASE_CORE_TICK_PER_SECOND
RTOS 心跳
内存地址
宏BOARD_SRAM_START_ADDR
宏BOARD_SRAM_SIZE_KB
在 stm32fxxx_it.c 文件中注释掉 PendSV 与 SysTick 中断即可。
SysTick
PendSV
本工程基于本人编写的裸机框架,需要的可以参考。
在 LssAppConfig.h 文件中添加以下头文件:
/*
*/
#include "target_config.h"
#include "los_sys.h"
#include "los_typedef.h"
#include "los_task.ph"
#include "los_sem.h"
不废话,直接上写好的 main.c 文件(看源码比文字教程方便多了)
主要参考源码中的
该源码的启动流程采用的是 任务创建任务 的方案。
/**
*/
/*
/
/ APP Config File /
#include "LssAppConfig.h"
/ prv */
#include "userMemoryConfig.h"
/* task / #include "LedTask.h" /**
/*
/*
/*
句柄变量声明
*/
static UINT32 xStartTask_Handle = NULL;
UINT32 xLedTask_Handle = NULL; //LED任务
/**
@brief 创建vStartTask任务
@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任务
@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 mian函数
@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);
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章