您的位置:首页 > 其它

【HUAWEI LiteOS】(三)在正点原子探索者开发板(STM32F407)移植HUAWEI LiteOS(系统不接管中断)

2019-07-27 18:56 5986 查看

1.环境准备

硬件准备

  • 开发板+下载器

这里我使用的是正点原子探索者开发板,主控是STM32F407ZGT6,下载器是JLINK,如图:

软件准备

2. 使用STM32CubeMX构建一个裸机工程

选择芯片

配置时钟源

开启串口1

配置LED引脚

开发板板载两个LED,DS0和DS1,原理图上可查看其对应的引脚:


配置时钟树

工程配置


生成代码




注意:

在正点原子开发板上使用的是外部8Mhz晶振,所以需要在文件

stm32f4xx_hal_conf.h
进行一下小小的修改,不然时钟不正常:

3. LiteOS源码

源码获取

LiteOS 开源仓库链接:

Huawei LiteOS 最新特性都存放在 develop 分支中,建议取该分支代码进行学习:

git clone -b develop git@github.com:LiteOS/LiteOS.git

这里需要注意:

如果是直接从 LiteOS 仓库 Checkout 出来的源码,是无法推送修改代码的。这时您需要维护一套自己的源代码,建议将 LiteOS 源码 Fork 到自己的本地仓库,然后进行维护。如果需要合入到 LiteOS 仓库,可以提交 Pull Request。LiteOS 仓库管理员审核后即会合入到主仓库。

源码移植目录和文件

这里只展现当前基于正点原子的探索者F4对应的目录树:

─ arch                /* 与 cpu 相关 */
│  └─ arm
│     ├─ arm-m         /* M 核中断、调度、Tick 相关代码。 */
│     │  ├─ cortex-m4
│     │  │  ├─ gcc
│     │  │  ├─ iar
│     │  │  └─ keil
│     │  ├─ include
│     │  └─ src
│     └─ common        /* ARM 核共用的的 CMSIS 接口 */
├─ components
│  └─ cmsis            /* LiteOS 提供的 CMSIS OS 接口实现 */
│     ├─ 1.0
│     └─ 2.0
│  └─ connectivity
│  │  ├─ agent_tiny /* agent_tiny端云互通组件,包括公共头文件、示例代码、客户端实现代码、操作系统适配层代码 */
│  │  ├─ lwm2m		/* lwm2m协议实现 */
│  │  ├─ nb_iot	   /* LiteOS NB-IoT API  */
│  └─ fs 					/* 文件系统,含VFS、spiffs、ramfs、kifs、devfs */
│  └─ lib					/*  */
│  └─ net					/*  */
│  └─ ota					/*  */
│  └─ mqtt				/*  */
├─ demos				 /* 供开发者测试 LiteOS 内核的 demo 示例。 */
├─ kernel
│  ├─ base
│  │  ├─ core          /* LiteOS 基础内核代码,包括队列、任务调度、软件定时器、时间片计算等功能 */
│  │  ├─ include       /* LiteOS 内核内部使用的头文件 */
│  │  ├─ ipc           /* LiteOS 中任务间通讯的相关接口,包括事件、信号量、消息队列、互斥锁等 */
│  │  ├─ mem           /* LiteOS 中的内核内存管理的相关代码 */
│  │  ├─ misc          /* 内存对齐功能以及毫秒级休眠 sleep 功能 */
│  │  └─ om            /* 与错误处理相关的文件 */
│  ├─ extended
│  │  ├─ include       /* 低功耗框架代码头文件 */
│  │  └─ tickless      /* 低功耗框架代码 */
│  └─ include          /* LiteOS 内核头文件 */
└─ targets

4. OS移植

拷贝 LiteOS 内核源码及测试相关代码

拷贝如下文件:

拷贝后如下:

创建 LiteOS 分组并添加 .c 源文件

  • Arch分组:

  • Kernel分组: los_init.c
  • base/core 下面全部 .c 文件
  • base/ipc 下面全部 .c 文件
  • base/mem/bestfit_little 下面全部 .c 文件
  • base/mem/common 下面全部 .c 文件
  • base/mem/membox 下面全部 .c 文件
  • base/misc 下面全部 .c 文件
  • base/om 下面全部 .c 文件
  • extended/tickless 下面全部 .c 文件(如果没有使用 tickless,可以不必添加)

需要注意的是:

  • LiteOS 提供了 3 套动态内存分配算法,位于 LiteOS\kernel\base\mem 目录下,分别是 bestfit、bestfit_little、tlsf 这三套动态内存算法只需要添加其中一套就行了,对于资源有限的芯片,建议选择 bestfit_little,上面的示例也是添加了这一套动态分配算法;
  • 另外 LiteOS\kernel\base\mem\membox 目录下是 LiteOS 提供的静态内存算法,与动态内存算法不冲突,需要添加;
  • LiteOS\kernel\base\mem\common 目录的内容需要全部添加。

配置 C/C++ 源码 .h 头文件路径

修正缺少文件编译错误

编译会发现如下错误,提示缺少

los_builddef.h
文件:

这个文件没有包含在源码中,需要从其他示例工程中COPY过来:

加入到头文件路径中:

OS_CONFIG/target_config.h 文件有两处需要适配您的开发环境进行调整:

  1. 正确修改导入 ST 官方驱动文件,如果是 M4 系列芯片是 stm32f4xx.h 文件:
  2. 将内存设置为匹配当前芯片 SRAM 大小,查找数据手册可以了解芯片内存大小

修正重复定义编译错误


编译后发现上图中的两个错误,显示有两个函数重复定义。您可以直接注释掉这两个函数:

但为了保证 STM32Cube 生成工程不会再次覆盖修改后代码,建议按下图所示操作,在 STM32Cube 中屏蔽这两个函数生成:

特别注意:
PendSV_Handler 和 SysTick_Handler 这两个函数只有在 LiteOS Kernel 有对应实现才能够屏蔽,如果不进行 OS,不可屏蔽该函数,否则会导致芯片跑不起来。

移植成功

5. 验证实验设计

目前 Huawei LiteOS 内置了 内核测试代码,在

demos/kernel
下,我们可以直接拿这套代码进行验证。

添加 demo 测试代码

添加头文件路径

修改 main.c 文件(启动内核)

/* USER CODE BEGIN Includes */
#include "los_base.h"
#include "los_inspect_entry.h"
/* USER CODE END Includes */

/* USER CODE BEGIN 2 */
if (LOS_OK != LOS_KernelInit())
{
return LOS_NOK;
}

LOS_Inspect_Entry();
LOS_Start();
/* USER CODE END 2 */

特别注意:

请务按照上面示例的方式添加测试代码。因为只有在 USER CODE 注释包裹内添加,下一次再使用 STM32Cube 导出的代码才不会被覆盖。

添加日志输出宏定义

实验结果

编译下载之后打开串口助手,结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: