既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
| 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>
如下图:
修改中断函数
注释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);


**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**