移植前的准备工作

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 tinyarch\arm\arm-v6m目录中存放了cortex m0内核的单片机的接口文件,在arch\arm\arm-v7m目录中存放了cortex m3、m4m7内核的单片机的接口文件,以及一些通用的接口文件,基于这些内核的mcu都可以使用里面的接口文件。

  • kernelkernelTencentOS 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文件。

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

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

  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工程分组下

  4. 最后再将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开发”公众号!

【TencentOS tiny】 超详细的TencentOS tiny移植到STM32F103全教程的更多相关文章

  1. 超详细Qt5.9.5移植攻略

    本文就来介绍下如何将Qt5.9.5移植到ARM开发板上. 以imx6开发板为例,使用Ubuntu14.04虚拟机作为移植环境. 准备工作 1.主机环境:Ubuntu14.04: 开发板:启扬IAC-I ...

  2. 超详细的celery异步任务和定时任务的教程

    转载自:https://segmentfault.com/a/1190000007780963

  3. Java多线程学习(吐血超详细总结)

    Java多线程学习(吐血超详细总结) 林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实 ...

  4. c语言面试宝典(经典,超详细)

    c语言面试宝典(经典,超详细) 2018年08月25日 09:32:19 chengxuyuan997 阅读数:7799   摘自:https://blog.csdn.net/chengxuyuan9 ...

  5. 【转】(超详细)jsp与servlet之间页面跳转及参数传递实例

    初步学习JavaEE,对其中jsp与Servlet之间的传值没弄清楚,查看网上资料,发现一篇超详细的文章,收获大大,特此记录下来.具体链接:http://blog.csdn.net/ssy_shand ...

  6. 超强、超详细Redis数据库入门教程

    这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...

  7. Github上传代码菜鸟超详细教程【转】

    最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...

  8. WebRTC VideoEngine超详细教程(三)——集成X264编码和ffmpeg解码

    转自:http://blog.csdn.net/nonmarking/article/details/47958395 本系列目前共三篇文章,后续还会更新 WebRTC VideoEngine超详细教 ...

  9. [转]超详细图解:自己架设NuGet服务器

    本文转自:http://diaosbook.com/Post/2012/12/15/setup-private-nuget-server 超详细图解:自己架设NuGet服务器 汪宇杰          ...

随机推荐

  1. Elasticsearch示例

    /** * @author: yqq * @date: 2019/2/28 * @description: */ public class TestMain { private static Rest ...

  2. gemfire基本使用以及spring-data-gemfire的使用

    1.安装程序的使用 locator 启动locator gfsh>start locator --name=locator1 指定端口启动 gfsh>start locator --nam ...

  3. wireshark抓包,分析出PNG后解析

    1. 抓包 2. 转成hex二进制流 3. 将二进制流转成base64位,通过在线工具: http://tomeko.net/online_tools/hex_to_base64.php?lang=e ...

  4. Python—字符串和常用数据结构

    目录 1. 字符串 2. 列表 2.1 列表的增删改查 2.2 列表的切片和排序 2.3 生成式语法 3. 元组 4.集合 5. 字典 5.1 字典的增删改查 5.2 字典的常见操作 序言:这一章我们 ...

  5. [C++] 重载new和delete——控制内存分配

      1.new和delete表达式的工作机理      1)new表达式实际执行了三步 string *sp=new string("aaaa"); ];//string采用默认初 ...

  6. elasticsearch倒排索引与TF-IDF算法

    elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.倒排索引(Inverted Index)简介 在关系 ...

  7. HNU_小中初数学学习软件(可视化编程)_结对项目总结与体会

    前言 经过将近一周的共同努力,HnuLyx和我终于完成了项目,期间心酸苦辣,受益良多,请允许我一一道来. 问题(需求要求的

  8. 【Django】ESRTful APi

    如何利用rest framework搭建Django API框架!   环境:win10 python3.6 思路步骤: 创建一个可以序列化的类 去数据库取数据交给序列化的类处理 把序列化的数据返回前 ...

  9. Asteroids POJ - 3041 二分图最小点覆盖

       Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...

  10. layui-table 对表格数据进行处理之后的排序问题

    使用layui table过程中,将某一列的数据格式进行转换,或者将0/1状态改为是/否,或者将数字改为星星评分显示的时候都会遇到一个问题,我的表格数据转换成其他形式,同时设置了sort:true,此 ...