来自云龙湖轮廓分明的月亮 发表于 2022-6-26 09:50:05

【OpenHarmony】VSCode下移植 LiteOS-M 到STM32

文章目录



[*]【OpenHarmony】VSCode下移植 LiteOS-M 到STM32
[*]

[*]一、源码获取
[*]二、准备工程
[*]三、添加源码到编译
[*]四、添加点灯任务


【OpenHarmony】VSCode下移植 LiteOS-M 到STM32

之前我在 VSCode 下配置了 STM32 的开发环境,这一节我们基于 VSCode 再整一些好玩的,移植 OpenHarmony 的 LiteOS-M 内核到 STM32 工程下面,支持一下鸿蒙,我移植的还是很早很早之前的 LiteOS 版本,不是归并入 OpenHarmony 的版本,原因 download 了代码,编译过程中发现缺失了几个文件,kal 层的文件引用奇怪,个人对 OpenHarmony 未来的走向挺悲观的,至少 LiteOS-M 的核感觉整理的不好,为了归并而归并,做了一半就跑路了的感觉,但是LiteOS-A的核发展的挺快,基本一直在更新,活跃度挺高,最终效果也不得而知,慢慢等着。。。
步入正题
一、源码获取

上 Gitee 下载源码,注意选择仓库的 Develop 分支,拉取到本地:
https://img-blog.csdnimg.cn/img_convert/51ffa4beb77e63ffe0549b1b5b75f7e9.png
拉取代码到本地
https://img-blog.csdnimg.cn/img_convert/683648becb1951542c4ac026e3a437e0.png
二、准备工程

准备一个 VSCode 开发 STM32 的工程环境,这个我之前有写过这篇文章,按照那篇文章配置好 STM32 的开发环境
VSCode 搭建 STM32 开发环境
我们基于 CubeMX 生成一个 STM32 的开发环境,修改系统时钟为 TIM1 防止和 System 冲突,然后配置两个 LED 灯 IO 口,最后生成 Makefile 工程
https://img-blog.csdnimg.cn/img_convert/d4cd525543ee3534274b7b823a068511.png
然后打开工程入下:
https://img-blog.csdnimg.cn/img_convert/3b85b01c49325e01268fa964004bf9cf.png
在工程的目录下,创建一个 OpenHarmony 文件夹用于存放 LiteOS 源码,然后将仓库下载下来的源码部分拷贝进去,拷贝部分入下:
https://img-blog.csdnimg.cn/img_convert/db7fb153f70bcfea948b0631002e4ae3.png
然后在对拷贝的内容做些修改:


[*]arch 只留下 arm 下面 m4 核文件夹下的文件和 gcc 文件夹,以及 所有的 include 、src、commom文件夹,这些通用文件别误删了
https://img-blog.csdnimg.cn/img_convert/dcfcba29d6b4defa0c609400082d0ed8.png


[*]target 将目录下 f1 内的 OS_CONFIG 留下,作为后面进一步配置系统的参考文件,其他统统删除
https://img-blog.csdnimg.cn/img_convert/21043d39aa1f42126d756c06362e8484.png


[*]将 kernel -> base -> mem 下内存分配方式只留下如下几个:
https://img-blog.csdnimg.cn/img_convert/226ea0846a0ffb2527a8c44fcf5646e4.png
其他的保持不变
三、添加源码到编译

源码添加了,下一步就是修改 makefile 来实现源码编译,这里使用我写的一个路径生成小脚本,快速的获取源码编译路径
一个辅助 VSCode 下开发 STM32 的脚本
下面的文件是我生成的路径信息
**************************************************
* 头文件路径
**************************************************
-IOpenHarmony/arch/arm/arm-m/cortex-m4\
-IOpenHarmony/arch/arm/arm-m/include\
-IOpenHarmony/arch/arm/common/cmsis\
-IOpenHarmony/kernel/base/include\
-IOpenHarmony/kernel/extended/include\
-IOpenHarmony/kernel/include\
-IOpenHarmony/osdepends/liteos/cmsis/1.0\
-IOpenHarmony/osdepends/liteos/cmsis/2.0\
-IOpenHarmony/osdepends/liteos/cmsis\
-IOpenHarmony/targets/OS_CONFIG
**************************************************
* C文件路径
**************************************************
OpenHarmony/arch/arm/arm-m/cortex-m4/los_exc.c\
OpenHarmony/arch/arm/arm-m/src/los_hw.c\
OpenHarmony/arch/arm/arm-m/src/los_hwi.c\
OpenHarmony/arch/arm/arm-m/src/los_hw_tick.c\
OpenHarmony/kernel/base/core/los_priqueue.c\
OpenHarmony/kernel/base/core/los_swtmr.c\
OpenHarmony/kernel/base/core/los_sys.c\
OpenHarmony/kernel/base/core/los_task.c\
OpenHarmony/kernel/base/core/los_tick.c\
OpenHarmony/kernel/base/core/los_timeslice.c\
OpenHarmony/kernel/base/ipc/los_event.c\
OpenHarmony/kernel/base/ipc/los_mux.c\
OpenHarmony/kernel/base/ipc/los_queue.c\
OpenHarmony/kernel/base/ipc/los_sem.c\
OpenHarmony/kernel/base/mem/bestfit_little/los_heap.c\
OpenHarmony/kernel/base/mem/bestfit_little/los_memory.c\
OpenHarmony/kernel/base/mem/common/los_memcheck.c\
OpenHarmony/kernel/base/mem/common/los_memstat.c\
OpenHarmony/kernel/base/mem/common/los_slab.c\
OpenHarmony/kernel/base/mem/common/los_slabmem.c\
OpenHarmony/kernel/base/mem/membox/los_membox.c\
OpenHarmony/kernel/base/misc/los_misc.c\
OpenHarmony/kernel/base/om/los_err.c\
OpenHarmony/kernel/extended/tickless/los_tickless.c\
OpenHarmony/kernel/los_init.c\
OpenHarmony/osdepends/liteos/atiny_osdep.c\
OpenHarmony/osdepends/liteos/cmsis/1.0/cmsis_liteos1.c\
OpenHarmony/osdepends/liteos/cmsis/2.0/cmsis_liteos2.c\
OpenHarmony/osdepends/liteos/cmsis/cmsis_liteos.c
**************************************************
* 汇编文件路径
**************************************************
OpenHarmony/arch/arm/arm-m/cortex-m4/gcc/los_dispatch_gcc.S\
OpenHarmony/arch/arm/arm-m/cortex-m4/gcc/los_hw_exc_gcc.S\
./startup_stm32f407xx.s
************************************************** 其中我们要删除一些内容
头文件删除
-IOpenHarmony/osdepends/liteos/cmsis/1.0\
-IOpenHarmony/osdepends/liteos/cmsis/2.0\ C文件删除
OpenHarmony/osdepends/liteos/atiny_osdep.c\
OpenHarmony/osdepends/liteos/cmsis/1.0/cmsis_liteos1.c\
OpenHarmony/osdepends/liteos/cmsis/2.0/cmsis_liteos2.c\ 汇编删除
OpenHarmony/arch/arm/arm-m/cortex-m4/gcc/los_hw_exc_gcc.S\
./startup_stm32f407xx.s 将
OpenHarmony/arch/arm/arm-m/cortex-m4/gcc/los_dispatch_gcc.S\ 修改为
OpenHarmony/arch/arm/arm-m/cortex-m4/gcc/los_dispatch_gcc.s\ 并且将文件名称的后缀也改成小写,因为 生成的 Makefile 是按照小写来构建文件的
然后将剩下的分别复制到 makefile 下
C 文件跟在 C_SOURCES 后面,头文件路径跟在 C_INCLUDES 后面,汇编文件跟在 ASM_SOURCES 后面
复制完成后,将 STM32CubeMX 生成的代码中的 stm32f4xx_it.c 下的内核定时器中断和 pendsv 异常中断删除,因为 LiteOS 要接管这两个中断
https://img-blog.csdnimg.cn/img_convert/75bbf1da1985c51898a210ab9ea61428.png
然后编译代码,可能会有一些警告,如下:
https://img-blog.csdnimg.cn/img_convert/a2f2c49d7cca39ce31cda98101281e07.png
该报错是函数 los_printf 缺少头文件 stdio.h,添加该头文件后就不会报错,编译完成结果如下:
https://img-blog.csdnimg.cn/img_convert/b9007953e1c0b18c85e9dccf22f3ef32.png
四、添加点灯任务

修改 target_config.h 文件里面内存部分代码,修改 SRAM 为112 K,虽然 STM32F407 的 RAM 有 192K,但分三段内存,不是连续内存空间,这里我们用 RAM 段,从 0x20000000 开始的 112K 空间
https://img-blog.csdnimg.cn/img_convert/efcd30bc0cb033227abdae2b56834411.png
进入 man.c 函数,调用 cmsis 接口
#include "cmsis_os.h" 然后定义任务句柄
osThreadId_t led_taskHandle;
const osThreadAttr_t led_task_attributes = {
    .name = "led_task",
    .stack_size = 512 * 1,
    .priority = (osPriority_t)osPriorityNormal,
}; 编写任务实体
void Led_Task(void *argument)
{
    while (1)
    {
      HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
      HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
      osDelay(1000);
    }
} 在 main 函数里面初始化系统、任务句柄然后启动系统内核
    osKernelInitialize();
    led_taskHandle = osThreadNew(Led_Task, NULL, &led_task_attributes);
    osKernelStart(); 下载后现象
https://img-blog.csdnimg.cn/bae44503397b476a96455b47ff314ecc.gif

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【OpenHarmony】VSCode下移植 LiteOS-M 到STM32