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

【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级...

[复制链接]
baiyongbin2009 发布时间:2016-1-19 15:00
第5章      RTX操作系统库方式移植(超级简单)
     本章教程为大家将介绍RTX操作系统库方式移植,库方式的移植超级简单,应该是所有RTOS里面最简单的了,仅需简单的两步就可以完成。
     本章教程含Cortex-M3内核的STM32F103的移植和Cortex-M4内核的STM32F407移植。
     5.1 移植前准备工作说明
     5.2 STM32F103移植RTX系统
     5.3 STM32F407移植RTX系统
     5.4         总结
5.1  移植前准备工作说明
1.     RTX系统软件开发平台仅支持MDK,建议使用MDK4.74,因为后面的例子都是以MDK4.74为平台。
2.     找一个简单的工程,最好是跑马灯之类的,越简单越好,我们就在这个简单的工程上面移植即可。
3.     大家使用的简单工程里面不能有SysTick,PendSV和SVC三个系统中断的使用,因为RTX系统要使用这三个中断。
6 c: x, K& ]  T' u, g  r
收藏 1 评论7 发布时间:2016-1-19 15:00

举报

7个回答
baiyongbin2009 回答时间:2016-1-19 15:10:59
本帖最后由 baiyongbin2009 于 2016-1-19 15:36 编辑
3 Q# ^1 O6 l, ~( G2 B" \, ?  _# Q& y% t
5.2   STM32F103移植RTX系统( J+ r  [( h. X  S' X5 B

- j, l* W/ k' z' Y1 i
5.2.1      RTX操作系统移植
    首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图5.1所示(大家也可以制作其它任意的工程模板,不限制):
                              
5.1.png
图5.1 工程模板
    准备好工程模板后,就可以开始移植了,移植过程比较简单,需要两步就可以完成了:
第1步:使能RTX
5.2.jpg
第2步:添加RTX系统的配置文件,配置文件在MDK的安装目录C:\Keil_v474\ARM\RL\RTX\Config
     下面,文件名RTX_Conf_CM.c,下面将这个文件复制到MDK工程的User文件夹下面,并添加到MDK工程上
5.3.png
通过这两步,RTX操作系统的移植就完成了。

3 A2 D! i! m) r! g3 @+ _8 ?* W9 y6 o

4 I8 G7 l0 h3 p, o5 e6 \+ Y" A
5.2.2     RTX操作系统配置说明
     RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图5.2所示的工程配置向导:
5.4.png
图5.2 RTX的配置向导
1.  Task Configuration
(1)  Number of concurrent running tasks
          参数范围0 – 250
          表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。
(2)  Number of tasks with user-provided stack
          参数范围0 – 250
         表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task statck size大小。比如:
             Numberof concurrent running tasks = 6
             Numberof tasks with user-provided stack = 0
           表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task statck size大小的任务堆栈空间。
             Numberof concurrent running tasks = 6
             Numberof tasks with user-provided stack = 3
           表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task statck size大小的任务堆栈空间。
(3)  Task statck size
            表示系统分配的任务堆栈大小,单位字节。
(4)  Check for the stack overflow
            选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
(5)  Run in privileged mode
            选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
2.  Tick Timer Configuration
(1)  Hardware timer
            CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
            PeripheralTimer 表示使用外设定时器。
(2)  Timer clock value
            表示定时器主频,单位Hz。
(3)  Timer tick value
            表示系统时钟节拍周期,单位us。
3.  System Configuration
(1)  Round-Robin Task switching
             选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
(2)  Round-Robin Timeout [ticks]
          范围1 – 1000。
          表示时间片的大小,单位是系统时钟节拍个数。
(3)  Number of user timers
           范围1 – 250。
          表示用户定时器个数,即软定时器个数。
(4)  ISR FIFO Queue size
            表示ISR FIFO队列大小。中断服务程序中调用以isr_ 开头的函数时,会将请求类型存到此缓冲中。

/ W' @2 r! t# X/ Y* f
; d& Y- B% i/ `8 X
5.2.3     RTX操作系统应用实例
    通过上面对RTX操作系统的配置讲解,这里将其修改为如下图5.3所示的配置:
5.5.png
图5.3 RTX的配置向导
相对默认配置,修改了上图红色箭头所示的三个地方:
1.     任务运行在特权级模式。
2.     滴答定时器主频72MHz,这个也是STM32F103的主频。
3.     系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
       AppTaskLED任务 :LED闪烁。
       AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
  1. #include "bsp.h"            /* 底层硬件驱动 */
    1 b( `/ a3 h9 E& K
  2. #include "RTL.h"
    $ f1 I7 C! \) U- F1 T
  3. 2 G( u& Q) c  r/ @* b/ D
  4. /*: X9 h' O0 F( G# h& f# r0 I
  5. **********************************************************************************************************
    # {& J. @& V2 ]. e; |
  6.                                                    函数声明
    # ?$ S5 f& {+ o1 x. _
  7. **********************************************************************************************************0 q8 R# w1 Z/ s/ L6 `. G( P
  8. */6 {6 E5 o) e/ u' Q$ L% a
  9. static void AppTaskCreate (void);$ F0 y- R5 |# R) y
  10. __task void AppTaskLED(void);5 E4 O# l! t4 D1 O% A8 h
  11. __task void AppTaskStart(void);; X# I7 j0 M/ L5 w7 a4 h

  12. - M% o% p8 ~4 c. `; G
  13. /*
    $ d2 ]4 ^1 W/ [! D
  14. **********************************************************************************************************
    ! E# r! q) b3 u' Y
  15.                                                     变量4 u0 s1 G* O. @4 b4 H
  16. **********************************************************************************************************6 J+ t5 D3 ]! V; z* c: w- a; b' [
  17. */
    + [% O( K" x+ `2 S/ a( v7 y
  18. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */
    % F4 q+ K( G; y: `9 W: S
  19. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */
    - S3 N/ Z# G0 f. w; k

  20. 1 o  S; a- I+ A( A
  21. /* 任务句柄 */- \& g4 f) H0 s2 a4 k% G$ A/ w5 l
  22. OS_TID HandleTaskLED = NULL;7 @1 e% s/ F, Q6 y  F3 W

  23. ' Q! f9 I& R- U& \; J. u9 k
  24. /*$ Y8 U( l8 j1 n- l7 @% z' i7 V& p
  25. *********************************************************************************************************, f) J4 `: L4 R+ m( d
  26. *    函 数 名: main
      E+ ~- |& O' t; i# U9 F
  27. *    功能说明: 标准c程序入口。
    , S- ~3 r" F* l" \
  28. *    形    参: 无
    8 e6 x% @/ x. y' u5 u+ C1 ~$ {! y
  29. *    返 回 值: 无
    , E9 a# \# b5 ^5 V: C- C' h4 x0 R
  30. *********************************************************************************************************
    5 b. x5 F0 r6 ?$ g/ {; I% S
  31. */" o$ q4 G, k2 ?$ k. V' p4 b7 q. o
  32. int main (void)
    1 X0 \3 S9 k2 |- N; V4 O) D
  33. {   " ^5 s  f7 V, U2 F4 ?8 h
  34.      /* 初始化外设 */
    7 o. K1 d: ]* u7 Z; G) E
  35.      bsp_Init();. k6 q! [1 d) w6 f
  36.     . V0 {& H) Y; J9 Y5 I$ v! H
  37.      /* 创建启动任务 */6 l7 L3 v' e, B. N) }& o! t! o
  38.      os_sys_init_user (AppTaskStart,             /* 任务函数 */3 P4 F3 Y+ y" N2 U. A
  39.                        2,                        /* 任务优先级 */
    1 H: Z. W% o  \7 \1 \) }$ {  Q
  40.                        &AppTaskStartStk,         /* 任务栈 */
    : {& }: a- Q7 ^
  41.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */2 j' p$ s* g6 N$ j# l- `/ R
  42.      while(1);! u, S1 ]6 }4 P& P+ l  ~
  43. }/ O0 f4 ~9 m9 }5 Q+ ^
  44. ! y" E1 u  g, R4 _5 G/ O( g: ^
  45. /*2 K! P1 q3 ~& D/ o" M8 Z% o
  46. *********************************************************************************************************1 z6 H- w8 w" T3 V$ _- E
  47. *    函 数 名: AppTaskLED7 Z1 [3 L+ o# U
  48. *    功能说明: LED闪烁
    / M9 t' S! I4 _
  49. *    形    参: 无% J$ ~  `6 E1 n$ Q7 ?8 o" Q
  50. *    返 回 值: 无
    - K, }' z8 D2 W" Q, }: n+ M) A1 @. z
  51. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)+ v$ q* T( c, @( x% A
  52. *********************************************************************************************************( {. q' i, V5 F$ U5 D) o3 j
  53. */' H3 |1 v  s3 y# n' _, p$ I- z
  54. __task void AppTaskLED(void)
    2 \7 ]( E! P* a. ~& Y2 p
  55. {
    ) h2 C. G7 s  a  g
  56.     while(1)# L% p0 e) f) I* @% t, v1 T
  57.     {
    / A1 J9 z" z' f; B! E7 \; }* y, I$ P* K
  58.          bsp_LedToggle(2);
    % v  N  \1 K0 R( q* K' J3 m- y
  59.          bsp_LedToggle(3);6 M* e8 B% r6 Z1 e' ^. H
  60.          os_dly_wait(200);
    * }- h) V9 ]% F( A
  61.     }
    . h( P3 a: l( e4 X8 E6 X& K; v/ W. Q; J
  62. }
    ' |6 T9 H7 i- n, R
  63. : h/ K  U* C+ o# ]; S5 r9 n9 O+ |5 d
  64. /*
    . {* P( Y' {# D  D- |
  65. *********************************************************************************************************
    * P  \% N/ Q/ U/ t1 J/ g
  66. *    函 数 名: AppTaskStart
    ! e1 t$ S. p2 U
  67. *    功能说明: 启动任务,也就是最高优先级任务。- j2 y) f1 v5 J9 Q) P# H
  68. *    形    参: 无0 e. D6 g. L% H( N+ l$ V: s
  69. *    返 回 值: 无
    4 g8 E; D7 x& t! b- r; K) Q
  70. *    优 先 级: 2 ! b  }4 i1 V( w8 B$ }
  71. *********************************************************************************************************. r7 n. z+ s- ~5 K1 n7 g7 L
  72. */% g3 L' I0 f# q/ s8 E& d& y/ y
  73. __task void AppTaskStart(void)
    2 {/ `  j. J+ D+ m
  74. {
    % b& n' k' J: U7 p2 W
  75.      AppTaskCreate();" G$ Y6 h3 q, q) L0 F
  76.    
    ( z: e9 c3 [: u' N0 \. g2 h, z$ Y
  77.     while(1)0 _' h3 q6 x, G0 t. A9 k
  78.     {2 i- y3 b' H5 a# U, L9 X  C2 M
  79.          bsp_LedToggle(1);
    : h0 E! H3 L5 ^: z) b* y3 y
  80.          bsp_LedToggle(4);
    , ?# A3 a, W! F: M0 {/ C8 ]
  81.          os_dly_wait(500);8 A; U/ U! ^7 Z0 L0 g
  82.     }( q; c: @3 e1 B! O+ Q% Q
  83. }8 `' W* u: P/ q: D- B
  84. ! a' r( v8 e  g0 G( u) u3 j
  85. /*" k, U! R- N) h! F3 @* I1 H
  86. *********************************************************************************************************
    9 _, B8 u/ G# V5 M
  87. *    函 数 名: AppTaskCreate; Y8 V  Z7 E% Z$ Y
  88. *    功能说明: 创建应用任务
    ! K+ _8 r1 K. Z- ^9 W
  89. *    形    参: 无* u$ C& W! ]5 A6 m4 w/ a
  90. *    返 回 值: 无
    ' [6 r/ w. U* E, d# g+ k( w
  91. *********************************************************************************************************) @0 o1 C  y, M$ M
  92. *// o0 _/ \( O% G2 Z
  93. static void AppTaskCreate (void)
    + J! p9 r2 F( O# Q5 C0 f( Q
  94. {
    ; s  H9 R  m4 V/ M# s
  95.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */9 r5 S3 w$ E* y! E
  96.                                         1,                       /* 任务优先级 */
    3 M9 H3 @2 e* `, t8 V2 B' T
  97.                                         &AppTaskLEDStk,          /* 任务栈 */( u  E% H  l9 M+ q7 ?4 L
  98.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 *// f: X# b* ~3 Q- p7 `
  99. }
复制代码
按照第三章的3.4小节中介绍的调试方法,可以看到如下图5.4所示的任务执行状态:
5.6.png
图5.4 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。
( J. A0 v2 ]5 D: y% [+ B. Z2 d) `
baiyongbin2009 回答时间:2016-1-19 15:27:09
本帖最后由 baiyongbin2009 于 2016-1-19 15:35 编辑 0 v: C+ L: T: c5 y5 q. a

0 j$ L/ K6 @/ ]' U7 j1 [1 G5.3  STM32F407移植RTX系统
3 O, @) H. q. ?0 Y% k# B

' `' o* D- I" b1 P1 n' J1 |
5.3.1     RTX操作系统移植
     首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图5.5所示(大家也可以制作其它任意的工程模板,不限制):
                              
5.7.png
图5.5 工程模板
     准备好工程模板后,就可以开始移植了,移植过程比较简单,需要两步就可以完成了:
第1步:使能RTX
5.8.png
第2步:添加RTX系统的配置文件,配置文件在MDK的安装目录C:\Keil_v474\ARM\RL\RTX\Config
    下面,文件名RTX_Conf_CM.c,下面将这个文件复制到MDK工程的User文件夹下面,并添加到MDK工程上
5.9.png
通过这两步,RTX操作系统的移植就完成了。
. ~7 Z. Z4 L- X7 s! T8 z1 r
1 n# o5 O& G( f9 u) A
5.3.2     RTX操作系统配置说明
     RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图5.6所示的工程配置向导:
5.10.png
图5.6 RTX的配置向导
1.  Task Configuration
(1)  Number of concurrent running tasks
       参数范围0 – 250
       表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。
(2)  Number of tasks with user-provided stack
       参数范围0 – 250
       表示自定义任务堆栈的任务数,如果这个参数定义为0的话,表示所有的任务都是使用的配置向导里面第三个参数Task statck size大小。比如:
          Numberof concurrent running tasks = 6
          Numberof tasks with user-provided stack = 0
          表示允许用户创建6个任务,所有的6个任务都是分配第三个参数Task statck size大小的任务堆栈空间。
          Numberof concurrent running tasks = 6
          Numberof tasks with user-provided stack = 3
          表示允许用户创建6个任务,其中3个任务是用户自定义任务堆栈大小,另外3个任务是用的第三个参数Task statck size大小的任务堆栈空间。
(3)    Task statck size
        表示系统分配的任务堆栈大小,单位字节。
(4)   Check for the stack overflow
         选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
(5)   Run in privileged mode
         选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
2.  Tick Timer Configuration
(1)  Hardware timer
         CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
          PeripheralTimer 表示使用外设定时器。
(2)   Timer clock value
         表示定时器主频,单位Hz。
(3)   Timer tick value
         表示系统时钟节拍周期,单位us。
3.  System Configuration
(1)  Round-Robin Task switching
         选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
(2)   Round-Robin Timeout [ticks]
          范围1 – 1000。
          表示时间片的大小,单位是系统时钟节拍个数。
(3)  Number of user timers
          范围1 – 250。
          表示用户定时器个数,即软定时器个数。
(4)   ISR FIFO Queue size
         表示ISR FIFO队列大小。中断服务程序中调用以isr_ 开头的函数时,会将请求类型存到此缓冲中。
' Y: Q& }5 g% P4 `  ?' A: J' k

1 X  {, o0 ^8 d- N- _2 w: I5 c
5.3.3     RTX操作系统应用实例
通过上面对RTX操作系统的配置讲解,这里将其修改为如下图5.7所示配置:
5.11.png
图5.7 RTX的配置向导
相对默认配置,修改了上图红色箭头所示的三个地方:
1.     任务运行在特权级模式。
2.     滴答定时器主频168MHz,这个也是STM32F407的主频。
3.     系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
AppTaskLED任务 :LED闪烁。
AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
  1. #include "bsp.h"            /* 底层硬件驱动 */
    : L5 h. T- j( l+ r: j; w/ I
  2. #include "RTL.h"
    1 g" z- e! U% c- V& K+ w

  3. - t/ l# w! w# R: R  P5 O$ Q5 Y
  4. /*
    0 E  g* R9 l3 c, |
  5. **********************************************************************************************************
    / y: \8 E0 ^; `6 ]$ r& T. z
  6.                                                    函数声明* \* O: v: k' {. x
  7. **********************************************************************************************************
    / |9 x* u" J! [% U! D
  8. */$ R" U3 R* i6 h
  9. static void AppTaskCreate (void);! j" u& _" M) L+ `/ v- d5 R- |. w
  10. __task void AppTaskLED(void);' _" J* T: ^: j7 M
  11. __task void AppTaskStart(void);( ]/ r7 ~6 C  A- F
  12. : P0 h7 O$ D3 H# q& F
  13. /*+ M6 O* N/ M8 y; Y2 _. ?+ P$ q7 ^/ n
  14. **********************************************************************************************************
    % Z% {* l" J, \3 n7 ^9 V3 V5 Y
  15.                                                     变量3 W1 X8 H+ t0 \; X
  16. **********************************************************************************************************- H0 L/ d! k7 B" C/ \$ C
  17. */
    ' F- l* d9 q  U( j
  18. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */& G4 U- L/ a% A; L0 }4 Q% h. A( x0 |
  19. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */
    3 I9 }/ {- c2 g7 h3 J

  20. $ Q+ Q2 {9 b/ i8 z5 n. P( R
  21. /* 任务句柄 */# S& |% f) I7 t( K9 n6 R$ C" k
  22. OS_TID HandleTaskLED = NULL;
    5 {0 ~0 P  S& y9 {7 y
  23. 7 b3 W' v. U5 M. Y& T
  24. /*
    ) s) i5 m/ Q. M( ]/ {8 y' o0 e& P
  25. *********************************************************************************************************  T' F+ e( L% q( M
  26. *    函 数 名: main
    7 w+ q! X3 N6 H5 v8 i9 W) Q, i9 k
  27. *    功能说明: 标准c程序入口。
    ; q1 M$ L% _. l# ^. m
  28. *    形    参: 无5 N$ K* T8 y9 `  ^- x3 _+ x+ T
  29. *    返 回 值: 无; `; w! g: R8 O" ^3 Q# m3 _4 F
  30. *********************************************************************************************************7 Q9 C2 V9 e/ n  z/ ]3 @/ l
  31. */
    ' D+ W. s, @* R1 \
  32. int main (void)
    7 h- {5 n5 U2 Y' G, [) h% @
  33. {   
    # Y9 d7 p$ ~! q! }1 J; R8 A% M% Y
  34.      /* 初始化外设 */
    : y( B$ d5 J  b  ~3 y! c
  35.      bsp_Init();0 v  E: S- ?: P, m" r
  36.    
    4 r. b- A! w' ~) n
  37.      /* 创建启动任务 */1 ^) I8 d4 l8 g9 g8 n+ q% h
  38.      os_sys_init_user (AppTaskStart,             /* 任务函数 */3 r9 J4 N, B$ R$ ?
  39.                        2,                        /* 任务优先级 */3 r4 z1 L* G# B( u# g" [1 G
  40.                        &AppTaskStartStk,         /* 任务栈 */* F9 O' e; I  A  K
  41.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */6 `6 G) B9 p$ `$ z/ C. g- h" S8 P
  42.      while(1);
    % @5 g* D* O1 `5 w6 g
  43. }. _3 F7 U7 X! Q0 A: Q' A& n) ?

  44. / f$ d) g% @; ]  f0 ^" V
  45. /*
    " @- p( r5 d3 \; _/ [/ X
  46. *********************************************************************************************************
    " N- A8 J9 V( N. t
  47. *    函 数 名: AppTaskLED( a: v- A. j( S5 g; Y
  48. *    功能说明: LED闪烁/ P& |( T" M4 t
  49. *    形    参: 无) ?9 @' R1 T9 a" |' q" s
  50. *    返 回 值: 无' g6 Y$ u/ g! E  B0 `) G$ J7 E
  51. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    * O  C5 r$ x  W
  52. ********************************************************************************************************** t  N2 j9 K# A$ C5 x
  53. */& Y1 [9 p. J) Z# }& R' E
  54. __task void AppTaskLED(void)0 C+ C  n+ Y" }6 S
  55. {0 g6 I$ E3 E1 a
  56.     while(1)
    2 D% ?! a0 K& |% x. r) ~; n
  57.     {
    , I5 k5 L2 q4 N2 o
  58.          bsp_LedToggle(2);* I3 N1 g+ [7 k8 ?* r. |0 `6 u! U
  59.          bsp_LedToggle(3);! f1 y# x  t; J+ B) `
  60.          os_dly_wait(200);7 L3 ~9 V1 q# i4 R
  61.     }
    - ]1 q! E9 G% X0 w& O5 z" U
  62. }7 Z% V# |$ ?7 q! u

  63. 6 T+ }1 }1 V' _4 o; o) _
  64. /*8 a7 r$ y9 `6 R, }# H
  65. *********************************************************************************************************
    3 r& r0 X* P3 M+ S: Q0 K
  66. *    函 数 名: AppTaskStart
    ) w% w4 H- P7 O. y! ^( Z0 n
  67. *    功能说明: 启动任务,也就是最高优先级任务。" W& X9 ~/ _: j$ |  ~6 S* T0 o+ B
  68. *    形    参: 无
    ; G& Z; Y+ ^- f# M% k9 ^& O+ l2 q
  69. *    返 回 值: 无% G  ^9 G* U) Z
  70. *    优 先 级: 2 4 h1 E$ K; Y1 W5 i# o7 u! i
  71. *********************************************************************************************************
    , K- D; u+ j; V' d  s& c
  72. */& w2 h, m' w" U% o" Q. _& c
  73. __task void AppTaskStart(void)
    1 ?* U5 K+ P- f. p  ^- K- Q
  74. {
    ; H. }; c4 ~7 x5 E# U0 C
  75.      AppTaskCreate();4 y6 L! F2 D3 K5 ]) U
  76.     2 R& v, r( g' n6 g
  77.     while(1)8 O: |5 J" q4 w' W: {6 I  ^- }
  78.     {
    " K4 W( m; n/ U
  79.          bsp_LedToggle(1);* R( p& O! `7 A7 A; g
  80.          bsp_LedToggle(4);
    & g# F9 f) c6 K' X- _& @6 _  w
  81.          os_dly_wait(500);
    " Z" H4 ?& s. H8 f5 K; U
  82.     }5 O0 \% R3 H$ n* F6 @7 j! p1 |
  83. }# p/ x$ v4 E6 B* w* K
  84. * [. |# Y; i& c( R% m  a
  85. /*
    ; x9 X7 b* X2 z$ j  C% d
  86. *********************************************************************************************************
    5 c+ H. E" g4 j: N& Y8 y
  87. *    函 数 名: AppTaskCreate6 [) [# Y4 X9 {. f8 p+ j. V
  88. *    功能说明: 创建应用任务
    : K* H+ {" @1 A  }) F3 n  |9 d  b2 L
  89. *    形    参: 无
    " j  q' Q# W) \
  90. *    返 回 值: 无" K- b( O$ w( q! s
  91. *********************************************************************************************************; \% X5 }( q6 ]- U. s
  92. */7 G2 q  }* G% \
  93. static void AppTaskCreate (void): H0 r0 o- {' A7 p
  94. {0 J; M' k+ t* Z
  95.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */* \8 c2 i/ ^+ r. z+ U, B2 \/ W/ @
  96.                                         1,                       /* 任务优先级 */9 h' V0 R" j8 a( E+ L, `) j
  97.                                         &AppTaskLEDStk,          /* 任务栈 */& X: f* m- `6 X: y- G' Z0 A
  98.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
    3 H7 n! Q# _6 [. d: W7 x& _; [
  99. }
复制代码
按照第三章的3.4小节中介绍的调试方法,可以看到如下图5.8所示的任务执行状态:
5.12.png
图5.8 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。
. E1 o; M6 w  q1 m! N5 c; {
baiyongbin2009 回答时间:2016-1-19 15:34:48
5.4  总结
    本章节为大家讲解了库移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。
- S7 d0 ~) }8 v! `: H4 |7 f! g
湉湉 回答时间:2016-1-24 17:23:42
  好东西 应该是比较简单的
watershade 回答时间:2016-2-16 23:00:40
楼主这奉献的都是血汗。按照你的教程,在keil5上实验着呐。不过keil5需要用cmsis-rtos,否则要安装legacy的库。等学会了也反馈一下。
feixiang20 回答时间:2018-1-15 20:55:03
谢谢分享
hawk123345 回答时间:2018-3-1 16:15:38
好,我过来鼓掌。

所属标签

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