STM32开发,体验腾讯RTOS-tencentos-tiny

1 概述

1.1 资源概述

开发板:ST官方NUCLEO-F103RB开发板
主控芯片型号:STM32F103RBT6
NUCLEO开发板

1.2 tencentos-tiny简介

腾讯物联网终端操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率。TencentOS tiny 提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU 及模组芯片上。而且,基于RTOS内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入腾讯云物联网平台。 在程序中的相关关键值简称为TOS。下图为Tencent OS的系统架构示意图。
系统架构
更加详细的资料,可以去码云网站,提供了非常多的文档支持。

2 程序开发

2.1 下载RTOS源码

程序源码下载
点击源码下载,跳出的链接时GIthub,速度非常慢,基本下不成功
程序源码下载
推荐在腾讯码云上下载,速度快非常多。在git工具中使用git Clone命令即可,不能使用迅雷一类的进行下载。
码云下载源码

2.2 代码详解

下载完成后打开文件夹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

2.3 编译烧录

程序编译烧录,占用的ROM和RAM空间还是很小的。整个程序段包含硬件等初始化,编译后的内存均没有超过10K。
程序编译
烧录完成后可以正常运行,LED灯可以实现翻转,按键也可以触发中断控制LED灯的翻转。串口显示如下:
串口显示
其它功能没有仔细研究,总体感觉包括文件结构命名方式和Free RTOS这类都差不多。目前由于中美两国关系比较差,开源的FreeRTOS目前被亚马逊收购,可能会有后顾之忧,国产的Tencent OS或者华为Lite OS都是比较好的选择。个人比较推荐腾讯的系统,资料相对多一些,例程也很多,对新手比较友好,适合爱折腾的玩家。

3 腾讯定制开发板介绍

腾讯联合第三方开发了一款物联网开发板,主控芯片是STM32L431,有一个OLED,裸板价格是228,还算比较良心。

物联网

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值