你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32开发,体验腾讯RTOS-tencentos-tiny

[复制链接]
STMCU小助手 发布时间:2022-5-5 15:03
1 概述
1.1 资源概述

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



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

更加详细的资料,可以去码云网站,提供了非常多的文档支持。

2 程序开发
2.1 下载RTOS源码



VQUV0`_F))W}OC_(GHZK62C.png

点击源码下载,跳出的链接时GIthub,速度非常慢,基本下不成功

20200808155151156.png

推荐在腾讯码云上下载,速度快非常多。在git工具中使用git Clone命令即可,不能使用迅雷一类的进行下载。

OK~MMQN1%RX1X~P3WD}P$AG.png

2.2 代码详解
下载完成后打开文件夹Board文件夹,里边有一个NUCLEO_STM32F103RB文件夹,也就是腾讯给这个开发板进行了适配,同时还有其它很多开发板支持,包括正点原子/野火等,非常全,稍微修改下就可以在其它单板上跑起来。下述为部分支持的开发板。

91ATIW7IWROI~6}1V2}4B$O.png

这些例程都差不多,两个任务,分别打印i am task 1以及i am task 2。大部分例程是以Keil作为编译环境,部分工程以IAR作为编译环境,还有一些使用eclipse以及GCC编译器。
打开例子keil工程,main函数如下,增加中断处理函数,用按键控制LED灯的翻转。

  1. #include "mcu_init.h"
  2. #include "cmsis_os.h"

  3. #define APPLICATION_TASK_STK_SIZE       1024
  4. extern void application_entry(void *arg);
  5. osThreadDef(application_entry, osPriorityNormal, 1, APPLICATION_TASK_STK_SIZE);

  6. __weak void application_entry(void *arg)//弱函数定义
  7. {
  8.     while (1) {
  9.         printf("This is a demo task,please use your task entry!\r\n");
  10.         tos_task_delay(1000);
  11.     }
  12. }

  13. int main(void)
  14. {
  15.     board_init();//单板硬件初始化
  16.     printf("Welcome to TencentOS tiny\r\n");
  17.     osKernelInitialize();//RTOS内核初始化
  18.     osThreadCreate(osThread(application_entry), NULL);//创建任务入口,任务在hello_world.c
  19.     osKernelStart();//启动RTOS任务调度
  20. }
  21. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//增加中断处理函数,按键触发LED翻转
  22. {
  23.         if(GPIO_Pin==B1_Pin)
  24.                 HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
  25. }
复制代码

硬件的初始化在muc_init.c里边,硬件初始化代码如下

  1. void board_init(void)
  2. {
  3.   HAL_Init();//HAL初始化
  4.   SystemClock_Config();//系统时钟配置
  5.   MX_GPIO_Init();//GPIO初始化
  6.   MX_USART1_UART_Init();//串口1配置
  7. }
复制代码

MX_GPIO_Init()在gpio.c里边有定义,LED的定义在main.h里边,比较凌乱,模块化比较差,这是由于腾讯开发此RTOS时,是先用Cubemx生成裸机代码,然后再把代码中加入RTOS实现的。这里完全可以使用自己的裸机代码,然后加入腾讯的RTOS来实现,腾讯给了相关移植的文档。
工程还有另外一个专门来写Task的文件hello_world.c,也无需做太多改动,增加一个LED灯翻转的代码。

  1. #include "cmsis_os.h"
  2. #include "main.h"

  3. #define TASK1_STK_SIZE          512
  4. void task1(void *arg);
  5. osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);

  6. #define TASK2_STK_SIZE          512
  7. void task2(void *arg);
  8. osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);

  9. #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u//是否启动动态创建
  10. #define TASK3_STK_SIZE          512
  11. void task3(void *arg);
  12. #endif

  13. void task1(void *arg)
  14. {
  15. #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u//条件编译
  16.     osThreadId task_dyn_created;

  17.     osThreadDynamicDef(task3, osPriorityNormal, 1, TASK3_STK_SIZE);//创建动态任务3
  18.     task_dyn_created = osThreadCreate(osThread(task3), NULL);

  19.     int count = 0;
  20. #endif

  21.     while (1) {
  22.         printf("###I am task1\r\n");
  23.         osDelay(2000);

  24. #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
  25.         if (count++ == 3) {
  26.             printf("###I am task1, kill the dynamic created task\r\n");
  27.             osThreadTerminate(task_dyn_created);//删除动态任务
  28.         }
  29. #endif
  30.     }
  31. }

  32. void task2(void *arg)//task2 任务函数
  33. {
  34.     while (1) {
  35. #if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u
  36.         k_err_t rc;
  37.         int depth;

  38.         rc = tos_task_stack_draught_depth(K_NULL, &depth);
  39.         printf("%d  %d\n", rc, depth);
  40. #endif

  41.         printf("***I am task2\r\n");
  42.                 HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);//翻转LED灯
  43.         osDelay(1000);
  44.     }
  45. }

  46. #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
  47. void task3(void *arg)//task任务函数3
  48. {
  49.     while (1) {
  50.         printf("$I am task3(dynamic created)\r\n");
  51.         osDelay(2000);
  52.     }
  53. }
  54. #endif

  55. void application_entry(void *arg)//任务入口
  56. {
  57.     osThreadCreate(osThread(task1), NULL); // Create task1
  58.     osThreadCreate(osThread(task2), NULL); // Create task2
  59. }
复制代码

工程下有配置文件tos_config.h,这个和其它RTOS的配置文件类似

  1. #ifndef _TOS_CONFIG_H_
  2. #define  _TOS_CONFIG_H_

  3. #include "stm32f10x.h"

  4. #define TOS_CFG_TASK_PRIO_MAX           10u//最大优先级

  5. #define TOS_CFG_ROUND_ROBIN_EN          1u

  6. #define TOS_CFG_OBJECT_VERIFY_EN           0u

  7. #define TOS_CFG_TASK_DYNAMIC_CREATE_EN  1u//是否创建动态任务

  8. #define TOS_CFG_EVENT_EN                1u

  9. #define TOS_CFG_MMBLK_EN                1u

  10. #define TOS_CFG_MMHEAP_EN               1u

  11. #define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE        0x100//当RAM空间不够,可以适当修改此值来解决

  12. #define TOS_CFG_MUTEX_EN                1u//是否使用互斥量

  13. #define TOS_CFG_TIMER_EN                1u

  14. #define TOS_CFG_PWR_MGR_EN              0u

  15. #define TOS_CFG_TICKLESS_EN             0u

  16. #define TOS_CFG_SEM_EN                  1u

  17. #define TOS_CFG_FAULT_BACKTRACE_EN      0u

  18. #define TOS_CFG_IDLE_TASK_STK_SIZE      512u

  19. #define TOS_CFG_CPU_TICK_PER_SECOND     1000u

  20. #define TOS_CFG_CPU_CLOCK               (SystemCoreClock)

  21. #define TOS_CFG_TIMER_AS_PROC           1u

  22. #endif
复制代码

2.3 编译烧录
程序编译烧录,占用的ROM和RAM空间还是很小的。整个程序段包含硬件等初始化,编译后的内存均没有超过10K。

20200808160246315.png

烧录完成后可以正常运行,LED灯可以实现翻转,按键也可以触发中断控制LED灯的翻转。串口显示如下:

3(I[HX(R6PMS@R4]S~Y61$A.png

其它功能没有仔细研究,总体感觉包括文件结构命名方式和Free RTOS这类都差不多。目前由于中美两国关系比较差,开源的FreeRTOS目前被亚马逊收购,可能会有后顾之忧,国产的Tencent OS或者华为Lite OS都是比较好的选择。个人比较推荐腾讯的系统,资料相对多一些,例程也很多,对新手比较友好,适合爱折腾的玩家。

3 腾讯定制开发板介绍

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

]]D16[%5ZVB90CYUPIKDAN0.png


收藏 评论0 发布时间:2022-5-5 15:03

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版