全教程:TencentOS tiny 移植到 STM32F103(基于标准库) | CSDN 博文精选

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 杰杰

责编 | 黄浩然

出品 | CSDN 博客


640?wx_fmt=jpeg

移植前的准备工作


获取 STM32 的裸机工程模板

STM32 的裸机工程模板直接使用野火 STM32 开发板配套的固件库例程即可。可以从我 github 上获取:https://github.com/jiejieTop/TencentOS-Demo

640?wx_fmt=png


下载 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 更新到更高的版本,则以最新的版本为准。

640?wx_fmt=png

TencentOS tiny 源码


TencentOS tiny 源码核心文件夹分析

打开 TencentOS tiny 源码文件,可以看见里面有 12 个文件夹,下面先来了解主要文件夹及其子文件夹的作用,然后将 TencentOS tiny 源码的核心文件提取出来,添加到工程根目录下的文件夹中,因为工程只需要有用的源码文件,而不是全部的 TencentOS tiny 源码,所以可以避免工程过于庞大。

640?wx_fmt=png

640?wx_fmt=png

简单提一下我们的重点文件夹:

· 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 文件夹下:

640?wx_fmt=png

除了 TencentOS tiny 的核心文件外,还需要移植一下其他文件,如关于TencentOS tiny 系统的配置文件。这是一些可以被用户修改的文件,所以会放在具体的工程文件中。board 就是 TencentOS tiny 为一些常用开发板开发的 demo 文件夹,其内有各个工程的配置文件,选一个与移植芯片最相机的开发板,找到它的配置文件 tos_config.h,比如我们可以选择:TencentOS-tiny\board\STM32F103_SIM800A\TOS-CONFIG 路径下的配置文件,把它拷贝到我们工程中的 TencentOS 文件夹下,当然你也可以把整个 TOS-CONFIG 目录拷贝过去,把其他无关的配置删掉就好了。

640?wx_fmt=png

这个配置文件很重要,后续在移植工程时,我们需要对这个配置文件进行修改,这样子可以裁剪 TencentOS tiny 的功能,得到最适合的工程配置。

 

640?wx_fmt=jpeg

开始移植


打开 TencentOS-Demo\hello-world\Project\RVMDK(uv5)路径下的 TencentOS.uvprojx 文件。

640?wx_fmt=png

1. 根据下图的提示,新建 3 个工程分组,分别为 tos/kernel、tos/arch、tos/config,这样可以见其名知其意,这些工程分组分别保存 TencentOS tiny 的内核源码、接口文件、以及配置文件。

640?wx_fmt=png

2. 根据下图将 TencentOS-Demo\hello-world\TencentOS\kernel\core路径下的所有 .c 文件添加到 tos/kernel 工程分组中,也将 \TencentOS-Demo\hello-world\TencentOS\kernel\pm 目录下的所有 .c 文件添加到 tos/kernel 工程分组中:

640?wx_fmt=png

3. 同理将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工程分组下:

640?wx_fmt=png

4. 最后再将 TencentOS-Demo\hello-world\TencentOS\TOS-CONFIG 路径下的 tos_config.h 文件添加到 tos/config 工程分组中。

需要注意的是,在 tos/arch 分组中添加的 port_s.S 文件,需要在添加时选择文件类型为“All files (*.*)”,添加(*.h)文件类型的时候也需要选择文件类型为“All files (*.*)”

添加完成后的文件:

640?wx_fmt=png


640?wx_fmt=jpeg

指定头文件路径


编译时需要为这些源文件指定头文件的路径,否则编译会报错。TencentOS tiny 的源码中有很多头文件,必须将对应的路径添加到开发环境里。在添加TencentOS tiny 源码时,一些其他的头文件夹也被复制到了工程目录中,所以这些文件夹的路径也要加到开发环境中。

640?wx_fmt=png

这些头文件的路径分别是:

 
 
..\..\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 模式:

640?wx_fmt=png


640?wx_fmt=jpeg

尝试编译


如果你走到这一步,那么可以尝试编译一下,不过我测试时编译是没通过的,原因是缺少了部分头文件:

640?wx_fmt=png

不过这不影响,我们在配置文件 tos_config.h 中修改一下就好,添加两句话

 
 
#include "stm32f10x.h"
#include <stdio.h>

如下图:

640?wx_fmt=png


640?wx_fmt=jpeg

修改中断函数


注释 PendSV_Handler() 函数

鉴于 TencentOS tiny 已经处理好 PendSV 与 SysTick 中断了,就不需要用户自己去处理,所以要在中断相关的源文件(stm32f10x_it.c文件)中注释(或者删除)PendSV_Handler() 函数。

640?wx_fmt=png

编写 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();
  }
}


640?wx_fmt=jpeg

编写 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

}


640?wx_fmt=jpeg

下载


然后编译,下载到开发板上,就通过串口可以看到程序已经跑起来了:

640?wx_fmt=png

至此,TencentOS tiny 移植到 stm32f1 的过程全部完成!

声明:本文为 CSDN 博主杰杰(ID: _杰杰_)的原创文章,版权归作者所有。
扫描下方二维码,下载 CSDN App,查看博主精彩分享

640?wx_fmt=png

【END】

640?wx_fmt=png

 华为鸿蒙为什么非要碰物联网?

 阿里云智能 AIoT 首席科学家丁险峰:阿里全面进军 IoT 这一年 | 问底中国 IT 技术演进

 iPhone 11 引领芯片新革命?

大数据、物联网、AI 等技术正当时!

鸿蒙 OS 的到来,能为我们改变什么?

640?wx_fmt=png
640?wx_fmt=gif点击阅读原文,即刻阅读博主原文。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值