STM32的裸机工程模板直接使用野火STM32开发板配套的固件库例程便可。能够从我github
上获取https://github.com/jiejieTop/TencentOS-Demogit
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
更新到更高的版本,则以最新的版本为准。
github
打开TencentOS tiny
源码文件,能够看见里面有12
个文件夹,下面先来了解主要文件夹及其子文件夹的做用,而后将TencentOS tiny
源码的核心文件提取出来,添加到工程根目录下的文件夹中,由于工程只须要有用的源码文件,而不是所有的TencentOS tiny
源码,因此能够避免工程过于庞大。json
一级目录 | 二 / 三级目录 | 说明(杰杰) |
---|---|---|
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 m三、m4
和m7
内核的单片机的接口文件,以及一些通用的接口文件,基于这些内核的mcu均可以使用里面的接口文件。centos
kernel:kernel
是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
的功能,获得最适合的工程配置。app
打开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>
以下图:
鉴于TencentOS tiny
已经处理好PendSV与SysTick
中断了,就不须要用户本身去处理,因此要在中断相关的源文件(stm32f10x_it.c文件
)中注释(或者删除)PendSV_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.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 }
而后编译,下载到开发板上,就经过串口能够看到程序已经跑起来了:
至此,TencentOS tiny
移植到stm32f1
的过程所有完成!
相关代码能够在公众号后台获取。 更多资料欢迎关注“物联网IoT开发”公众号!