移植前的准备工作
1. 获取 STM32 的裸机工程模板
STM32 的裸机工程模板直接使用野火 STM32 开发板配套的固件库例程即可。可以从我 github
上获取 https://github.com/jiejieTop/TencentOS-Demo
下载 TencentOS tiny 源码
TencentOS tiny 的源码可从 TencentOS tiny
GitHub 仓库地址 https://github.com/Tencent/TencentOS-tiny 下载,如果 GitHub 下载慢,也可以通过腾讯工蜂开源仓下载,地址:https://git.code.tencent.com/Tencent_Open_Source/TencentOS-tiny,大家在移植时并不需要把整个 TencentOS tiny
源码放进工程文件中,否则工程的代码量太大。杰杰将在下文讲解如何将TencentOS tiny
移植到工程中去,以及如何把 TencentOS tiny
源码中的核心部分单独提取出来,方便以后在不同的平台上移植。目前使用的是 TencentOS tiny
最新版本,由于 TencentOS tiny
在不断更新,如果以后 TencentOS tiny
更新到更高的版本,则以最新的版本为准。
TencentOS tiny 源码核心文件夹分析
打开 TencentOS tiny
源码文件,可以看见里面有 12
个文件夹,下面先来了解主要文件夹及其子文件夹的作用,然后将 TencentOS tiny
源码的核心文件提取出来,添加到工程根目录下的文件夹中,因为工程只需要有用的源码文件,而不是全部的 TencentOS tiny
源码,所以可以避免工程过于庞大。
一级目录 | 二 / 三级目录 | 说明(杰杰) | |
---|---|---|---|
arch |
arm |
TencentOS tiny 适配的 IP 核架构(含 M 核中断、调度、tick 相关代码),对我们的移植很重要 |
|
arch | risc-v | TencentOS tiny 适配的 risc- v 架构 | |
board | TencentOS_tiny_EVB_MX | TencentOS tiny 定制开发板 demo,包含 AT 适配框架、MQTT 协议、安全组件等 | |
component | connectivity / loraWAN | loRaWAN 协议栈实现源码及适配层 | |
connectivity / Eclipse-Paho-MQTT | MQTT 协议栈实现源码及适配层 | ||
connectivity / TencentCloud_SDK | 腾讯云 C -SDK 实现源码及适配层 | ||
fs | 文件系统实现源码 | ||
security | mbedtls 安全协议源码 | ||
utils | 包含 json 相关源码 | ||
devices | TencentOS tiny 适配的一些外设驱动(如串口 wifi gprs 驱动等) | ||
doc | TencentOS tiny 相关技术文档及开发指南(建议多看这部分 ) |
||
examples | TencentOS tiny 提供的功能示例 | ||
kernel |
core |
TencentOS tiny 内核源码(这部分是最重要的) |
|
hal |
TencentOS tiny 驱动抽象层 |
||
pm | TencentOS tiny 低功耗模块源码 | ||
net | at | TencentOS tiny 为串口类通信模组提供的 AT 框架实现层 | |
lora_module_wrapper | TencentOS tiny 为串口类 LoraWAN 模块提供的移植框架 | ||
lwip | Lwip 协议实现源码及适配层 | ||
sal_module_wrapper | TencentOS tiny 为串口类网络模块(wifi gprs)提供的 socket 移植框架 | ||
tencent_firmware_module_wrapper | TencentOS tiny 提供的腾讯定制模组移植框架 | ||
osal | cmsis_os | TencentOS tiny 提供的 cmsis os 适配 | |
platform | hal | TencentOS tiny 适配的部分芯片的驱动实现源码 | |
vendor_bsp | 芯片厂家提供的原厂 bsp 固件库,如 STM32 的 HAL 库 | ||
test | 存放 TencentOS tiny 提供的一些测试代码,含内核及上层模块示例及测试代码 | ||
tools | 存放 TencentOS tiny 提供的工具,小程序,配置工具等 |
简单提一下我们的重点文件夹:
-
arch:
TencentOS tiny
是软件,单片机是硬件,为了使TencentOS tiny
运行在单片机上面,TencentOS tiny
和单片机必须关联在一起,那么如何关联呢?还是要通过代码来关联,这部分关联的文件叫接口文件,通常由汇编语言和 C 语言联合编写。这些接口文件都是跟硬件密切相关的,不同的硬件接口文件是不一样的,但都大同小异。TencentOS tiny
在arch\arm\arm-v6m
目录中存放了cortex m0
内核的单片机的接口文件,在arch\arm\arm-v7m
目录中存放了cortex m3、m4
和m7
内核的单片机的接口文件,以及一些通用的接口文件,基于这些内核的 mcu 都可以使用里面的接口文件。 -
kernel:
kernel
是TencentOS tiny
内核核心源码,它的重要性我也不用多说,毕竟整个内核就是由这里面的文件组成,而其他文件夹都是基于内核的组件。
提取 TencentOS tiny 内核源码
将裸机工程源码重命名为 hello-world,然后在裸机工程中新建一个 TencentOS
文件夹,接着将 kernel
文件夹、arch
文件夹、添加到 TencentOS
文件夹下:
除了 TencentOS tiny
的核心文件外,还需要移植一下其他文件,如关于 TencentOS tiny
系统的配置文件。这是一些可以被用户修改的文件,所以会放在具体的工程文件中。board
就是 TencentOS tiny
为一些常用开发板开发的 demo
文件夹,其内有各个工程的配置文件,选一个与移植芯片最相机的开发板,找到它的配置文件 tos_config.h
,比如我们可以选择:TencentOS-tiny\board\STM32F103_SIM800A\TOS-CONFIG
路径下的配置文件,把它拷贝到我们工程中的 TencentOS
文件夹下,当然你也可以把整个 TOS-CONFIG
目录拷贝过去,把其他无关的配置删掉就好了。
这个配置文件 很重要 ,后续在移植工程时,我们需要对这个配置文件进行修改,这样子可以裁剪TencentOS tiny
的功能,得到最适合的工程配置。
开始移植
打开 TencentOS-Demo\hello-world\Project\RVMDK(uv5)
路径下的 TencentOS.uvprojx
文件。
- 根据下图的提示,新建
3
个工程分组,分别为tos/kernel、tos/arch、tos/config
,这样可以 见其名知其意 ,这些工程分组分别保存TencentOS tiny
的内核源码、接口文件、以及配置文件。
- 根据下图将
TencentOS-Demo\hello-world\TencentOS\kernel\core
路径下的所有.c 文件
添加到tos/kernel
工程分组中,也将\TencentOS-Demo\hello-world\TencentOS\kernel\pm
目录下的所有.c 文件
添加到tos/kernel
工程分组中:
- 同理将
TencentOS-Demo\hello-world\TencentOS\arch\arm\arm-v7m\common
路径下的tos_cpu.c、tos_fault.c
添加到tos/arch
工程分组下,也将TencentOS-Demo\hello-world\TencentOS\arch\arm\arm-v7m\cortex-m3\armcc
路径下的port_s.S、port_c.c
文件添加到tos/arch
工程分组下
- 最后再将
TencentOS-Demo\hello-world\TencentOS\TOS-CONFIG
路径下的tos_config.h
文件添加到tos/config
工程分组中。
需要注意的是 ,在tos/arch
分组中添加的 port_s.S
文件,需要在添加时选择文件类型为 “All files (*.*)”
,添加(*.h) 文件类型的时候也需要选择文件类型为“All files (*.*)”
添加完成后的文件:
指定头文件路径
编译时需要为这些源文件指定头文件的路径,否则编译会报错。TencentOS tiny
的源码中有很多头文件,必须将对应的路径添加到开发环境里。在添加 TencentOS tiny
源码时,一些其他的头文件夹也被复制到了工程目录中,所以这些文件夹的路径也要加到开发环境中。
这些头文件的路径分别是:
..\..\TencentOS\arch\arm\arm-v7m\common\include
..\..\TencentOS\arch\arm\arm-v7m\cortex-m3\armcc
..\..\TencentOS\kernel\core\include
..\..\TencentOS\kernel\pm\include
..\..\TencentOS\TOS-CONFIG
同时还要在配置中勾选支持 C99
模式:
尝试编译
如果你走到这一步,那么可以尝试编译一下,不过我测试时编译是没通过的,原因是缺少了部分头文件:
不过这不影响,我们在配置文件 tos_config.h
中修改一下就好,添加两句话
#include "stm32f10x.h"
#include <stdio.h> // 或者 #include <stddef.h>
如下图:
修改中断函数
注释 PendSV_Handler()函数
鉴于 TencentOS tiny
已经处理好 PendSV 与 SysTick
中断了,就不需要用户自己去处理,所以要在中断相关的源文件(stm32f10x_it.c 文件
)中 注释 (或者 删除 )PendSV_Handler()
函数。
编写 SysTick_Handler()函数
SysTick
中断服务函数是一个非常重要的函数,TencentOS tiny
所有跟时间相关的事情都在里面处理,SysTick
就是 TencentOS tiny
的一个心跳时钟,驱动着 TencentOS tiny
的运行,就像人的心跳一样,假如没有心跳,我们就相当于 “挂掉”
,同样的,TencentOS tiny
没有了心跳,那么它就会卡死在某个地方,不能进行任务调度,不能运行任何的东西,因此我们需要实现一个 TencentOS tiny
的心跳时钟。代码如下:
注意 :SysTick_Handler()
中调用的都是 TencentOS tiny
中的函数,所以需要在 stm32f10x_it.c
文件中包含 tos.h
头文件。
#include "tos.h"
// SysTick_Handler()函数
void SysTick_Handler(void)
{if (tos_knl_is_running())
{tos_knl_irq_enter();
tos_tick_handler();
tos_knl_irq_leave();}
}
编写 main 函数
当你走到这一步,编译是不会出错了,此时我们已经完全移植好操作系统了,那么可以编写代码了,现在编写一个测试代码,在 main.c
文件中:
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "tos.h"
k_task_t task;
k_stack_t task_stack[1024];
void test_task(void *Parameter)
{while(1)
{printf("hello world!\r\n");
tos_task_delay(1000);
}
}
/**
* @brief 主函数
* @author 杰杰
* @retval 无
*/
int main(void)
{
k_err_t err;
/* 初始化 USART 配置模式为 115200 8-N-1,中断接收 */
USART_Config();
printf("Welcome to TencentOS tiny\r\n");
tos_knl_init(); // TOS Tiny kernel initialize
err = tos_task_create(&task,
"task1",
test_task,
NULL,
2,
task_stack,
1024,
20);
if(err != K_ERR_NONE)
printf("TencentOS Create task fail! code : %d \r\n",err);
tos_knl_start(); // Start TOS Tiny}
下载
然后编译,下载到开发板上,就通过串口可以看到程序已经跑起来了:
end
至此,TencentOS tiny
移植到 stm32f1
的过程全部完成!
喜欢就关注我吧!
相关代码可以在公众号后台获取。
欢迎关注“物联网 IoT 开发”公众号