开发板:ST官方NUCLEO-F103RB开发板
主控芯片型号:STM32F103RBT6
腾讯物联网终端操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率。TencentOS tiny 提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU 及模组芯片上。而且,基于RTOS内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入腾讯云物联网平台。 在程序中的相关关键值简称为TOS。下图为Tencent OS的系统架构示意图。
更加详细的资料,可以去码云网站,提供了非常多的文档支持。
点击源码下载,跳出的链接时GIthub,速度非常慢,基本下不成功
推荐在腾讯码云上下载,速度快非常多。在git工具中使用git Clone命令即可,不能使用迅雷一类的进行下载。
下载完成后打开文件夹Board文件夹,里边有一个NUCLEO_STM32F103RB文件夹,也就是腾讯给这个开发板进行了适配,同时还有其它很多开发板支持,包括正点原子/野火等,非常全,稍微修改下就可以在其它单板上跑起来。下述为部分支持的开发板。
这些例程都差不多,两个任务,分别打印i am task 1以及i am task 2。大部分例程是以Keil作为编译环境,部分工程以IAR作为编译环境,还有一些使用eclipse以及GCC编译器。
打开例子keil工程,main函数如下,增加中断处理函数,用按键控制LED灯的翻转。
#include "mcu_init.h"
#include "cmsis_os.h"
#define APPLICATION_TASK_STK_SIZE 1024
extern void application_entry(void *arg);
osThreadDef(application_entry, osPriorityNormal, 1, APPLICATION_TASK_STK_SIZE);
__weak void application_entry(void *arg)//弱函数定义
{
while (1) {
printf("This is a demo task,please use your task entry!\r\n");
tos_task_delay(1000);
}
}
int main(void)
{
board_init();//单板硬件初始化
printf("Welcome to TencentOS tiny\r\n");
osKernelInitialize();//RTOS内核初始化
osThreadCreate(osThread(application_entry), NULL);//创建任务入口,任务在hello_world.c
osKernelStart();//启动RTOS任务调度
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//增加中断处理函数,按键触发LED翻转
{
if(GPIO_Pin==B1_Pin)
HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
}
硬件的初始化在muc_init.c里边,硬件初始化代码如下
void board_init(void)
{
HAL_Init();//HAL初始化
SystemClock_Config();//系统时钟配置
MX_GPIO_Init();//GPIO初始化
MX_USART1_UART_Init();//串口1配置
}
MX_GPIO_Init()在gpio.c里边有定义,LED的定义在main.h里边,比较凌乱,模块化比较差,这是由于腾讯开发此RTOS时,是先用Cubemx生成裸机代码,然后再把代码中加入RTOS实现的。这里完全可以使用自己的裸机代码,然后加入腾讯的RTOS来实现,腾讯给了相关移植的文档。
工程还有另外一个专门来写Task的文件hello_world.c,也无需做太多改动,增加一个LED灯翻转的代码。
#include "cmsis_os.h"
#include "main.h"
#define TASK1_STK_SIZE 512
void task1(void *arg);
osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
#define TASK2_STK_SIZE 512
void task2(void *arg);
osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u//是否启动动态创建
#define TASK3_STK_SIZE 512
void task3(void *arg);
#endif
void task1(void *arg)
{
#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u//条件编译
osThreadId task_dyn_created;
osThreadDynamicDef(task3, osPriorityNormal, 1, TASK3_STK_SIZE);//创建动态任务3
task_dyn_created = osThreadCreate(osThread(task3), NULL);
int count = 0;
#endif
while (1) {
printf("###I am task1\r\n");
osDelay(2000);
#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
if (count++ == 3) {
printf("###I am task1, kill the dynamic created task\r\n");
osThreadTerminate(task_dyn_created);//删除动态任务
}
#endif
}
}
void task2(void *arg)//task2 任务函数
{
while (1) {
#if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u
k_err_t rc;
int depth;
rc = tos_task_stack_draught_depth(K_NULL, &depth);
printf("%d %d\n", rc, depth);
#endif
printf("***I am task2\r\n");
HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);//翻转LED灯
osDelay(1000);
}
}
#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
void task3(void *arg)//task任务函数3
{
while (1) {
printf("$$$I am task3(dynamic created)\r\n");
osDelay(2000);
}
}
#endif
void application_entry(void *arg)//任务入口
{
osThreadCreate(osThread(task1), NULL); // Create task1
osThreadCreate(osThread(task2), NULL); // Create task2
}
工程下有配置文件tos_config.h,这个和其它RTOS的配置文件类似
#ifndef _TOS_CONFIG_H_
#define _TOS_CONFIG_H_
#include "stm32f10x.h"
#define TOS_CFG_TASK_PRIO_MAX 10u//最大优先级
#define TOS_CFG_ROUND_ROBIN_EN 1u
#define TOS_CFG_OBJECT_VERIFY_EN 0u
#define TOS_CFG_TASK_DYNAMIC_CREATE_EN 1u//是否创建动态任务
#define TOS_CFG_EVENT_EN 1u
#define TOS_CFG_MMBLK_EN 1u
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x100//当RAM空间不够,可以适当修改此值来解决
#define TOS_CFG_MUTEX_EN 1u//是否使用互斥量
#define TOS_CFG_TIMER_EN 1u
#define TOS_CFG_PWR_MGR_EN 0u
#define TOS_CFG_TICKLESS_EN 0u
#define TOS_CFG_SEM_EN 1u
#define TOS_CFG_FAULT_BACKTRACE_EN 0u
#define TOS_CFG_IDLE_TASK_STK_SIZE 512u
#define TOS_CFG_CPU_TICK_PER_SECOND 1000u
#define TOS_CFG_CPU_CLOCK (SystemCoreClock)
#define TOS_CFG_TIMER_AS_PROC 1u
#endif
程序编译烧录,占用的ROM和RAM空间还是很小的。整个程序段包含硬件等初始化,编译后的内存均没有超过10K。
烧录完成后可以正常运行,LED灯可以实现翻转,按键也可以触发中断控制LED灯的翻转。串口显示如下:
其它功能没有仔细研究,总体感觉包括文件结构命名方式和Free RTOS这类都差不多。目前由于中美两国关系比较差,开源的FreeRTOS目前被亚马逊收购,可能会有后顾之忧,国产的Tencent OS或者华为Lite OS都是比较好的选择。个人比较推荐腾讯的系统,资料相对多一些,例程也很多,对新手比较友好,适合爱折腾的玩家。
腾讯联合第三方开发了一款物联网开发板,主控芯片是STM32L431,有一个OLED,裸板价格是228,还算比较良心。