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

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

[复制链接]
STMCU小助手 发布时间:2022-5-5 15:03
1 概述- x/ R8 l. C% s7 T% I# ?
1.1 资源概述

' \" l8 u9 X; K- ^开发板:ST官方NUCLEO-F103RB开发板8 h  P- Z3 t6 z5 H1 D- N; d& G
主控芯片型号:STM32F103RBT6: X' L6 @7 H% E. K

/ P% ~1 i) x2 v6 ^ + I( s! P2 ]8 A: I! V. j
& M: j+ w. @1 \9 |) c  \7 e8 `
1.2 tencentos-tiny简介
; _5 P* W+ J, R9 G3 y腾讯物联网终端操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率。TencentOS tiny 提供精简的 RTOS 内核,内核组件可裁剪可配置,可快速移植到多种主流 MCU 及模组芯片上。而且,基于RTOS内核提供了丰富的物联网组件,内部集成主流物联网协议栈(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物联网终端设备及业务快速接入腾讯云物联网平台。 在程序中的相关关键值简称为TOS。下图为Tencent OS的系统架构示意图。
# R/ \5 ~3 a7 y3 @! ?7 N. q _@MJWR~VAMLX9S$%JK)LKXM.png
( k1 e5 L# _" J0 p$ D5 ?- X5 t- d  |0 B) C; d
更加详细的资料,可以去码云网站,提供了非常多的文档支持。
# s( \6 @  ~3 D1 ]; U
% o6 T- H4 k! X; |+ W6 p4 ^2 程序开发0 E7 L' x( v8 Z
2.1 下载RTOS源码

( {# Y0 Y1 p* H9 v# R- s
: u8 p5 T  q# S' K1 u# r4 C6 }$ z* h0 ]& j
VQUV0`_F))W}OC_(GHZK62C.png
! t3 V, X( X* }6 e9 S  p! h
- x- {7 M9 F9 b) x; p8 }$ Q8 G0 r" a点击源码下载,跳出的链接时GIthub,速度非常慢,基本下不成功- @+ h: Q$ J2 y- W
' y8 s! D% l6 \
20200808155151156.png + Z. }3 [! a7 ^0 a4 C

; N% G/ t6 y: s7 x, l3 q推荐在腾讯码云上下载,速度快非常多。在git工具中使用git Clone命令即可,不能使用迅雷一类的进行下载。5 A8 V  F' q6 {  J3 T  t& O

; u9 W$ X1 Y  ?, Q OK~MMQN1%RX1X~P3WD}P$AG.png 5 G: n7 u  J% L- ~' B3 U
& X( L" X% B, G2 c, h' ]
2.2 代码详解3 K! Y' u- o/ o) P
下载完成后打开文件夹Board文件夹,里边有一个NUCLEO_STM32F103RB文件夹,也就是腾讯给这个开发板进行了适配,同时还有其它很多开发板支持,包括正点原子/野火等,非常全,稍微修改下就可以在其它单板上跑起来。下述为部分支持的开发板。) D5 E3 d2 H* [9 K, F) y. `$ g- i  D
$ n9 r. _% f1 y! [. z
91ATIW7IWROI~6}1V2}4B$O.png
+ v- E. s, b- t9 b  A3 j# G
. F- q8 n/ e1 _" o8 x- r' `这些例程都差不多,两个任务,分别打印i am task 1以及i am task 2。大部分例程是以Keil作为编译环境,部分工程以IAR作为编译环境,还有一些使用eclipse以及GCC编译器。* L; P# |5 N: }8 z
打开例子keil工程,main函数如下,增加中断处理函数,用按键控制LED灯的翻转。) W$ M9 w+ j7 Q" k0 i1 l( a7 L  y+ W
+ l, D. e% r9 h5 H) l0 e1 ~4 w
  1. #include "mcu_init.h"
    7 N0 D/ b: x0 ?6 ?( n& F; F: e5 L
  2. #include "cmsis_os.h"
      D( ^1 @& h4 ~. y

  3. $ B) x9 K6 I+ W1 o  [
  4. #define APPLICATION_TASK_STK_SIZE       10241 K0 i5 i: K5 J" p; Y7 b* Z
  5. extern void application_entry(void *arg);
    " S5 ?! X0 }3 }. |6 f$ S5 E) w
  6. osThreadDef(application_entry, osPriorityNormal, 1, APPLICATION_TASK_STK_SIZE);8 D: K. C) H0 {
  7. . s; E! Y+ I  S, s7 A* w" Z# E* p
  8. __weak void application_entry(void *arg)//弱函数定义
    / l. W6 e: I& x* K% ~( P
  9. {
    6 V: e/ U" \; ]0 D
  10.     while (1) {
    ( E& @8 S; V3 f0 O/ G' d
  11.         printf("This is a demo task,please use your task entry!\r\n");$ Q& f  t5 T6 a% {8 e
  12.         tos_task_delay(1000);
    7 t) `5 p/ |9 k) x
  13.     }5 D, y6 G) k! J6 C' o8 F- z! B
  14. }
    8 R8 K7 J9 A; w' O, B
  15. : q0 Q2 d+ g9 J. v% n( Y' A
  16. int main(void)2 Y# x4 m2 d# U' r  n  p9 p
  17. {: C% W, S/ \0 f8 K0 H
  18.     board_init();//单板硬件初始化
    9 X2 u1 x2 S( `; n
  19.     printf("Welcome to TencentOS tiny\r\n");" k9 B& `: v; d+ A  |( W  b
  20.     osKernelInitialize();//RTOS内核初始化% _! P( y" ?  J- _5 F/ {. _3 j
  21.     osThreadCreate(osThread(application_entry), NULL);//创建任务入口,任务在hello_world.c
    & n& S1 A: c0 K. @. T
  22.     osKernelStart();//启动RTOS任务调度
    % K) R3 Q6 j9 _: V
  23. }
    % a) _' ?3 e4 h+ x
  24. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//增加中断处理函数,按键触发LED翻转/ M: s2 t7 \/ R* I/ \7 [
  25. {! K  `9 [( f7 R
  26.         if(GPIO_Pin==B1_Pin)
    ( r1 V8 S8 O, u" C
  27.                 HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);( k; `+ t- j4 V; ?: W# }
  28. }
    ; n# L5 E5 Z. z* s, O
复制代码

, Q! h$ l* ?  F- B! A; U- l硬件的初始化在muc_init.c里边,硬件初始化代码如下
) x& M3 C+ E) B; p; n
" Z6 L" b$ p5 i1 D& P4 c# h
  1. void board_init(void)
    / Z0 k+ M; @) l8 f& e9 T
  2. {8 G" z% I$ d. f7 e* X
  3.   HAL_Init();//HAL初始化
    ) Y* y' ^2 p4 X4 C; Q1 x3 S# r
  4.   SystemClock_Config();//系统时钟配置! u7 Z# N- L! x
  5.   MX_GPIO_Init();//GPIO初始化
    . @$ K# M/ P$ K
  6.   MX_USART1_UART_Init();//串口1配置
    ( r, A' {3 O  F( K
  7. }
复制代码
  b0 J2 y; z9 G1 J* I' ^
MX_GPIO_Init()在gpio.c里边有定义,LED的定义在main.h里边,比较凌乱,模块化比较差,这是由于腾讯开发此RTOS时,是先用Cubemx生成裸机代码,然后再把代码中加入RTOS实现的。这里完全可以使用自己的裸机代码,然后加入腾讯的RTOS来实现,腾讯给了相关移植的文档。# D) p& C- D# z4 [; D! x6 P+ ?
工程还有另外一个专门来写Task的文件hello_world.c,也无需做太多改动,增加一个LED灯翻转的代码。' h  S1 D2 p! G* ?) x$ d

( _8 r* l' s% e+ h
  1. #include "cmsis_os.h"6 _( f4 M) o* }5 d5 |7 Y( d3 o
  2. #include "main.h"
    & T6 x* N: ^, i0 ?

  3. 4 B% J2 I9 i3 m
  4. #define TASK1_STK_SIZE          512/ p/ ?% H# U9 ^, C: M
  5. void task1(void *arg);& l/ N) ~. l, [. q. ?1 A! q  K9 i6 {
  6. osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);
    . G( [& X) Y2 P! `/ i1 p3 f
  7. ' a3 M9 d7 R  a6 A: A* m! j
  8. #define TASK2_STK_SIZE          512
    0 v1 @/ P# E) r  ?, K
  9. void task2(void *arg);
    $ ~. d8 [0 @, G7 l. F
  10. osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);
    & q, @# ~& ~( d0 u( T; ^
  11. ' s+ M0 c: x& U  s% K
  12. #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u//是否启动动态创建; \, o) z, _; N% r7 D
  13. #define TASK3_STK_SIZE          512" y* k; `8 U: Z5 _- H
  14. void task3(void *arg);
    % Q: R* Y0 W8 Z+ }5 b( ]5 u
  15. #endif! ^& k+ t" k7 r. _: A
  16. 0 A* o9 s5 f- P
  17. void task1(void *arg)/ V% d7 q( Q! h# G. P1 ]: x/ z7 ?( p
  18. {
    ! `) }! z% s& Z& ?: R
  19. #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u//条件编译
    6 Y% H* t% Y# W( a
  20.     osThreadId task_dyn_created;
    + U7 f8 O1 g  F8 v) |# _& ?1 J

  21. * t! h3 i2 U& b0 z: d3 z
  22.     osThreadDynamicDef(task3, osPriorityNormal, 1, TASK3_STK_SIZE);//创建动态任务3
    1 ?' S6 I# e2 B
  23.     task_dyn_created = osThreadCreate(osThread(task3), NULL);
    2 U1 U! \3 `2 s' _4 u$ a
  24. " E. `3 W/ {, J/ U& T- u
  25.     int count = 0;, r( E! _( b3 N* p" J6 V8 ~
  26. #endif
    $ C6 A2 K/ m, y- T+ B

  27. * Q6 d. w, K8 K1 k" D
  28.     while (1) {! k  ?/ Z, t* n" v' t' w4 w
  29.         printf("###I am task1\r\n");: z4 m; D) o4 @+ M
  30.         osDelay(2000);5 Z* p  P/ z% N5 [  U; L
  31. . H1 J% u  U1 p, I
  32. #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u, _6 D/ U$ @& n
  33.         if (count++ == 3) {
    7 z+ Q' g  g2 i& ?% J; ^( P# S
  34.             printf("###I am task1, kill the dynamic created task\r\n");  l+ ]: x7 ]4 E6 [
  35.             osThreadTerminate(task_dyn_created);//删除动态任务$ H( i) f) e6 A5 H# k
  36.         }
    ! F% b9 J) m1 d- p+ y
  37. #endif
    " H% f5 Y; m+ {# H
  38.     }! z* ?% l& g+ w" j% U+ {6 @
  39. }
    ; {% ?( @$ i; x; P* I
  40. " v1 B$ A. D1 u2 q: L* F4 Z% F
  41. void task2(void *arg)//task2 任务函数
    ' S% ]/ K) A% _! c7 e' e
  42. {
    ( P, Q" @& f1 L
  43.     while (1) {, n. f( I) }' U  S+ ^1 ^' Z4 d' z
  44. #if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0u/ i5 R4 e  D4 U9 ^; E" ?( _
  45.         k_err_t rc;% k( ?* N# q. s2 h6 e0 l
  46.         int depth;
    ) }; Z; D/ T' `' `
  47. . N2 |: g* i! L9 W
  48.         rc = tos_task_stack_draught_depth(K_NULL, &depth);$ F9 R2 T! O9 G) d6 M
  49.         printf("%d  %d\n", rc, depth);" f( y7 e5 n' \7 ~; E+ \
  50. #endif
    ( m8 N; g! }. E7 L7 i+ r4 w

  51.   Y  a5 T2 E# x8 t, i
  52.         printf("***I am task2\r\n");
    8 Q5 R+ }3 c8 F; ^0 w8 U
  53.                 HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);//翻转LED灯; X6 z' `3 H! Z; W" }' c
  54.         osDelay(1000);
    9 D! b" D& N0 j& J$ [& V, R% j( I
  55.     }6 B- s$ Q; h5 W" D
  56. }  \3 R, r6 K. F: O
  57. % p. r: u" k" {$ j+ f) l* {0 Y
  58. #if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u
    " y( e5 I) C, |8 R1 O
  59. void task3(void *arg)//task任务函数3
    & h) A) d7 i' Q& u  z6 Z( O
  60. {" R9 c4 x4 W0 J4 l# I
  61.     while (1) {2 M% C0 \: z, u. z# d6 |: }
  62.         printf("$I am task3(dynamic created)\r\n");8 p8 C4 H8 k, W
  63.         osDelay(2000);
    + v; h' @, T& W& O% C
  64.     }# Q8 \7 J/ A4 l7 k. ]
  65. }! M, P- }9 n; c8 d) T( P" O
  66. #endif
    # z: z- a! X, [  S2 F% u6 d

  67. " }( N* U/ F/ Q
  68. void application_entry(void *arg)//任务入口5 z& `6 u" m4 v% W7 `
  69. {
    3 G$ c/ P0 v% v( t: K0 X4 q7 V
  70.     osThreadCreate(osThread(task1), NULL); // Create task1
    ' F( ^7 O! ?* y8 [3 g
  71.     osThreadCreate(osThread(task2), NULL); // Create task22 x8 g( P$ L% Q
  72. }
    $ {5 F1 I) H; K7 n. R+ H
复制代码

, u8 z0 Y$ H0 m! ^% K工程下有配置文件tos_config.h,这个和其它RTOS的配置文件类似# c- u$ j0 N! l% T: F

& U9 i( R8 ], p2 N# _
  1. #ifndef _TOS_CONFIG_H_
    ' S9 Q/ Y. k  r9 W
  2. #define  _TOS_CONFIG_H_
    # L2 N+ J1 g4 m3 _/ M
  3. ' Y8 g1 j+ [* a
  4. #include "stm32f10x.h"
    0 p! A6 F9 k1 k9 t0 G

  5. # h% }; h' M/ R& }  @7 a
  6. #define TOS_CFG_TASK_PRIO_MAX           10u//最大优先级
    9 ]! j7 l( G4 f" o

  7. # s+ \: I2 J1 ^/ {
  8. #define TOS_CFG_ROUND_ROBIN_EN          1u
    0 c( `& v7 l" n" p) n+ W2 h6 Q
  9. 6 @* [, l- k6 T: L
  10. #define TOS_CFG_OBJECT_VERIFY_EN           0u
    # N0 ~$ i% q" D; }/ ~
  11. 4 @' r2 J: s6 u8 X, w  b" q" z
  12. #define TOS_CFG_TASK_DYNAMIC_CREATE_EN  1u//是否创建动态任务
    # [  S/ A  }$ E( r8 y
  13. ! e6 z* Y/ G" C: D
  14. #define TOS_CFG_EVENT_EN                1u
    - ^% l9 U# P3 @7 g) v; g/ C
  15. " v7 D5 ^& t  W1 f
  16. #define TOS_CFG_MMBLK_EN                1u
    - ?; t+ y2 g# `- ^( @* |

  17. 5 ~' J2 K, I6 N0 c
  18. #define TOS_CFG_MMHEAP_EN               1u
    5 J: u% j, z5 @/ ^& w% B& S' K
  19. 3 S! o) [& t" K$ z7 h7 O
  20. #define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE        0x100//当RAM空间不够,可以适当修改此值来解决
    ) [8 |1 W5 g' F
  21. 0 w2 J" Q4 o: s. ?4 e9 k7 u$ [
  22. #define TOS_CFG_MUTEX_EN                1u//是否使用互斥量
    1 X. M7 x! Z# U7 w
  23. * c5 Z: N7 k* |+ @, ?1 H4 b  y
  24. #define TOS_CFG_TIMER_EN                1u+ ]  @) V$ U- t; S4 O$ m# }
  25. + L9 [+ e6 N8 l
  26. #define TOS_CFG_PWR_MGR_EN              0u
    + g; h# b; ?# T) F: {' X, U

  27. 7 i0 |5 J8 r" g  U/ o& Y9 t
  28. #define TOS_CFG_TICKLESS_EN             0u
    # g, b$ L: Q" ~
  29. : Z* i) D+ d* _9 e5 K) h
  30. #define TOS_CFG_SEM_EN                  1u. }4 ]' f- O& s3 v9 f
  31. 5 A  d& r% n; K- @* {
  32. #define TOS_CFG_FAULT_BACKTRACE_EN      0u
    ) u+ ?; r* i5 U

  33. 5 I2 p, R. O4 d) C+ C
  34. #define TOS_CFG_IDLE_TASK_STK_SIZE      512u3 ^  I: I; L( t! {: @: S/ e1 G
  35. 7 g; Q- m' ~+ N0 K& @4 a, w
  36. #define TOS_CFG_CPU_TICK_PER_SECOND     1000u
    3 M/ ]$ y5 j; }" d& \4 [7 J

  37. % d7 _, }' F; ]/ M
  38. #define TOS_CFG_CPU_CLOCK               (SystemCoreClock)' \6 \# G1 q9 E) x8 C8 i

  39. - G: V$ u# @& C
  40. #define TOS_CFG_TIMER_AS_PROC           1u
    1 V! X; R. z8 g' Z" c* o, M% ?
  41. 7 h7 e; l% M5 [: F; |3 K
  42. #endif
    7 j% N) z0 E( L6 ~+ R+ N2 ~- }: c
复制代码

4 M# `/ X" h0 E2.3 编译烧录
" w" e- d7 H6 y. i* @; ^9 D9 j1 L程序编译烧录,占用的ROM和RAM空间还是很小的。整个程序段包含硬件等初始化,编译后的内存均没有超过10K。2 H- X  j) u# t5 _& }% C1 ~3 V; B
7 R' z8 s3 g2 u9 @8 z1 T* \
20200808160246315.png ; Q. ?- U9 A+ y% C1 @" q3 [/ e7 A

3 s, R, Z) ~& z: I烧录完成后可以正常运行,LED灯可以实现翻转,按键也可以触发中断控制LED灯的翻转。串口显示如下:0 h9 q. u: r6 U( b2 h7 G0 g
' `/ w' J4 G7 m0 B
3(I[HX(R6PMS@R4]S~Y61$A.png 8 ~; [' x" N; j  X
( i9 t) u7 Y# F2 B  V5 k
其它功能没有仔细研究,总体感觉包括文件结构命名方式和Free RTOS这类都差不多。目前由于中美两国关系比较差,开源的FreeRTOS目前被亚马逊收购,可能会有后顾之忧,国产的Tencent OS或者华为Lite OS都是比较好的选择。个人比较推荐腾讯的系统,资料相对多一些,例程也很多,对新手比较友好,适合爱折腾的玩家。
7 z6 j8 g  p) W) ^3 A' |+ r
( v, ?' N/ c: j$ t0 V- Q# R# [: z3 腾讯定制开发板介绍

. B& g4 Q$ V1 k  c腾讯联合第三方开发了一款物联网开发板,主控芯片是STM32L431,有一个OLED,裸板价格是228,还算比较良心。
, r2 T+ M1 L2 j8 I/ j" U
* w+ z3 V/ J6 r ]]D16[%5ZVB90CYUPIKDAN0.png
9 {; L* }% r3 P) ?# o# Y7 w/ h5 W$ Z. @  W( X# X( V
/ K. G- S3 r8 s- ~
赞 收藏 评论0 发布时间:2022-5-5 15:03

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版