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

【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系统要使用这三个中断。

: [# K# W% @1 k1 u, E
赞 收藏 1 评论7 发布时间:2016-1-19 15:00

举报

7个回答
baiyongbin2009 回答时间:2016-1-19 15:10:59
本帖最后由 baiyongbin2009 于 2016-1-19 15:36 编辑 2 S2 V4 u7 w% f8 C# h, [
: X6 v2 L3 W' Z1 e. b" F* h5 d; C
5.2   STM32F103移植RTX系统( V5 j/ k- o  `3 z) ^
2 [- O! Z* m2 E" _& n* r
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操作系统的移植就完成了。

  G. u8 N3 t$ Z
0 _7 s7 ~9 y+ y/ b5 j5 H
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_ 开头的函数时,会将请求类型存到此缓冲中。

% Y) T7 T/ v- }# g% Z/ V% h

0 B5 l1 }3 G" R* u
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"            /* 底层硬件驱动 */7 M2 [) n/ t/ t
  2. #include "RTL.h"+ c& c2 I3 [1 o/ G5 }6 w

  3. / K: q6 z5 R2 q6 _" I$ Q
  4. /*
    9 v9 M/ t& L6 Y3 |, }% _9 a* A
  5. **********************************************************************************************************3 ^4 v/ Y1 H6 e0 r
  6.                                                    函数声明' W3 V" f' u8 x
  7. **********************************************************************************************************/ V2 ~! @" a" V- i
  8. */
    3 F8 _, I$ l. Y
  9. static void AppTaskCreate (void);
    ) M4 a- H% Q9 ^( ]' G& E" z; v
  10. __task void AppTaskLED(void);3 d9 j; z/ C% i& P0 J5 P2 ~% q! ?
  11. __task void AppTaskStart(void);
    8 N: d) c% m& q2 P. b/ ^3 {# H0 x

  12. 2 s& X, I% q& Z" ~4 X
  13. /*
      I0 F2 ?& B2 }( H" q" `2 S
  14. **********************************************************************************************************
    ) }! `7 ?+ |; w" \5 q: l
  15.                                                     变量' Z; ?; t4 u; R3 Q3 y2 b7 ?5 M
  16. **********************************************************************************************************
    0 F/ l3 ^; j3 o; T# G
  17. */( W# w: N# ]: X- [, F6 t. |
  18. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */* a0 s# N6 c" j6 t; V. W
  19. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */
    4 q8 X' E2 t( S; G7 L, I
  20. , ?4 ^2 c: W+ |1 L/ n$ o, b6 U
  21. /* 任务句柄 */+ e: c" R7 p8 T% H( u" ^- N
  22. OS_TID HandleTaskLED = NULL;
    # H- ~& y1 E0 H* `0 b! q+ l3 E7 ~
  23.   _! N1 T; O0 S! V/ x4 h5 t6 X/ o
  24. /*& j' f& B2 A8 Q2 h1 }
  25. *********************************************************************************************************
    8 b0 O8 s& C- j* R% O' J8 R
  26. *    函 数 名: main5 j; W7 n5 A( w" n! ^
  27. *    功能说明: 标准c程序入口。
    " q: ^+ S" D0 [2 \$ x# `9 g, j/ @
  28. *    形    参: 无
    & {- q- |" Q" ~* V( y& ]
  29. *    返 回 值: 无  b* A6 g4 o$ P3 _# P% \9 N
  30. *********************************************************************************************************
    . ?) z- M" j( G" g6 i& k
  31. */0 f6 h# ?9 P& O* g
  32. int main (void)) d- C/ T& `1 X
  33. {   1 @7 u) N* L; U; ]( |1 G# v  f
  34.      /* 初始化外设 */
    ( O. r1 L  n, S1 h3 S- ?  r
  35.      bsp_Init();% R1 n& B/ ~; s5 _7 {
  36.       l: D! u# }! ]: L2 N; Z+ E  r( w
  37.      /* 创建启动任务 */) R) D+ L" f# f! k' S
  38.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
    - F, B+ b7 e; g3 n
  39.                        2,                        /* 任务优先级 */2 k" W1 z' a+ _
  40.                        &AppTaskStartStk,         /* 任务栈 */
    " m5 @+ v3 |6 N2 C( \6 x
  41.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */. ~; H2 R+ S9 K) L- H
  42.      while(1);
    ; e* y* ^4 C" @+ \4 q# {
  43. }
    8 h* \' V, J& \- I  g

  44. & r7 F$ E7 V  T* n  l2 R1 K
  45. /*$ n4 A  y$ j3 q) ]* W5 j! y+ M
  46. *********************************************************************************************************3 C* L: e% b6 X4 E# {$ F+ F
  47. *    函 数 名: AppTaskLED
    % D: h7 s2 x& t/ ^
  48. *    功能说明: LED闪烁
    6 E/ |; h* E- [+ f+ D$ A: K
  49. *    形    参: 无2 R" q: P/ f+ o, ~% {6 e
  50. *    返 回 值: 无
    9 T$ R$ q( E- q" x1 J# q
  51. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    7 Y7 a# B, K" |( i  y
  52. *********************************************************************************************************/ S) h2 @) {5 a5 Z$ \) Y
  53. */% {1 R: F( A! _0 T/ G$ r
  54. __task void AppTaskLED(void)
    3 L# q. h' B3 E. S* S/ Z4 s$ f# y
  55. {: [  b' H( h3 {% _1 N: \
  56.     while(1)4 c; [4 \5 \5 Y! o  W/ C8 u
  57.     {) B8 P, h* z* M5 D
  58.          bsp_LedToggle(2);+ x/ g9 `; y0 g: [  Q: D
  59.          bsp_LedToggle(3);
    1 W: ]; A$ B5 `
  60.          os_dly_wait(200);% K0 L! Z# x3 E% S% Z
  61.     }
    3 V: W' E) b+ y* B7 D
  62. }; Z  R1 y0 W! x
  63. 8 a7 D4 }) ^4 L4 }7 o& D
  64. /*
    ( t( w1 I) e% F7 W+ E7 p
  65. *********************************************************************************************************
    " x: j* e/ w! O& ~% |
  66. *    函 数 名: AppTaskStart6 P: Q) X7 o8 A5 K2 t
  67. *    功能说明: 启动任务,也就是最高优先级任务。5 p. r6 Q/ h. k8 f0 q) J
  68. *    形    参: 无
    5 \6 h0 J8 e# B) g& _9 ~6 B/ G
  69. *    返 回 值: 无
    4 O; Y) k2 L' `0 U4 ~: v$ `7 S2 y: p
  70. *    优 先 级: 2
    8 X$ I4 Z! Q' p: k
  71. *********************************************************************************************************
    2 X# p! E. O( r3 y& \( @2 f3 ?
  72. */
    3 w6 Q4 a, P& Q" l) n
  73. __task void AppTaskStart(void)2 H" c. o" P# g0 u1 f
  74. {
    9 s% T$ A# ~- Y7 |/ N5 l8 j
  75.      AppTaskCreate();7 t" e9 C& p1 m/ c: E  q# Y
  76.     9 }. j3 j9 Z( k! _4 K
  77.     while(1)
    8 \9 I1 M2 D0 k2 J  e' U' ~
  78.     {
    + v9 }% {, F2 k7 q7 j' M
  79.          bsp_LedToggle(1);9 Q+ \- H$ n3 Y
  80.          bsp_LedToggle(4);6 s0 C* m; n6 `9 C; @
  81.          os_dly_wait(500);0 f8 _: U/ P) z2 O% B5 z
  82.     }
    9 U* T/ o- [+ s, E
  83. }
    ) J5 {  e/ l& a" i! J- ]
  84. ' Y$ \4 C$ B9 M7 s' E6 w% b
  85. /*
    . B3 d* {. N. H* {
  86. *********************************************************************************************************
    / b* W$ r! [/ P, U, w7 P8 r
  87. *    函 数 名: AppTaskCreate
    ) Y, }8 i& ~2 t6 C8 l
  88. *    功能说明: 创建应用任务
    7 `7 c8 n! r3 i, u
  89. *    形    参: 无. Q  Q: y; L% a# m, v7 E" N! ]
  90. *    返 回 值: 无3 k* t6 y9 `- b/ n  Q5 x1 j
  91. *********************************************************************************************************, E$ q5 t  G2 v6 G3 Z1 q+ e1 @
  92. */* Z! Z1 g$ t5 Y2 v' C7 r2 P
  93. static void AppTaskCreate (void)
    4 g) N" ]: \* b* A
  94. {
    4 i& a- M  ]3 X) Y9 h
  95.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */% S9 R0 ^2 d  c+ A4 h
  96.                                         1,                       /* 任务优先级 */# }% U+ ~* C, J6 E$ g1 l; o9 x
  97.                                         &AppTaskLEDStk,          /* 任务栈 */
    6 I" M+ r; s- h$ ^# k
  98.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
    5 s, H* ~9 ]! i" h( R
  99. }
复制代码
按照第三章的3.4小节中介绍的调试方法,可以看到如下图5.4所示的任务执行状态:
5.6.png
图5.4 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

& Y- g  M, \* o0 J7 e
baiyongbin2009 回答时间:2016-1-19 15:27:09
本帖最后由 baiyongbin2009 于 2016-1-19 15:35 编辑 2 }1 l  P1 y0 S' O. K/ m2 O

8 X$ M8 q& t7 D1 h7 P3 |5.3  STM32F407移植RTX系统' a& L* \: A- b: G. C8 I

+ l6 \$ _) S( I- Z
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操作系统的移植就完成了。

2 ]5 c1 _  r5 a6 c

' W: s5 P" {6 z6 S6 n
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_ 开头的函数时,会将请求类型存到此缓冲中。
5 @3 s4 S0 o2 @/ \" @7 n& `

5 ^# i+ O! Z+ }: Y2 o* O/ U
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"            /* 底层硬件驱动 */0 R& r: |& T. `9 J" v% T
  2. #include "RTL.h"
    2 Z7 U: R  R# w7 [* b

  3. - h* C7 {! @+ W6 ]
  4. /*& j& _6 K% ^  |  |5 o
  5. **********************************************************************************************************
    / u' F$ ]2 d" s) C- _
  6.                                                    函数声明0 T# J) u& u2 z0 z' @' I0 H, [) S
  7. **********************************************************************************************************
    + r8 r1 A8 s) n: B6 H, b
  8. */+ K8 ?$ m  q, @8 L0 e
  9. static void AppTaskCreate (void);( u9 v0 |  J0 D# n; z' |
  10. __task void AppTaskLED(void);, {3 I1 l3 }* l7 d' E. @
  11. __task void AppTaskStart(void);
    9 G, r' D5 ^. m5 z2 U- H

  12. 8 Y  V9 d: m9 h# X& d% e
  13. /*
    / @  w  C: O+ m. N3 l5 F2 [
  14. **********************************************************************************************************2 m2 s. r6 J! r7 [% s, l6 ^
  15.                                                     变量" c# e8 C: H- w$ V$ W8 F
  16. **********************************************************************************************************) Y. @8 L8 C( P* F$ K! p3 `
  17. */
    ) j0 G" [8 d1 a6 C
  18. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */* j& S  u& p9 H& a% l9 G7 X
  19. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */! A% l# H( l. P6 `& x, ]) ?
  20. % f& Y3 _. U3 ]% n5 l
  21. /* 任务句柄 */  U/ t8 s7 g" y, H) k
  22. OS_TID HandleTaskLED = NULL;
    * L" C9 F% I& U

  23. ( p% A/ e" O* y  A
  24. /*% x& T/ K. c8 V  o
  25. *********************************************************************************************************
    8 l( ]$ c: _  y' n
  26. *    函 数 名: main
    1 d& J. q! y4 M' E$ C, ^
  27. *    功能说明: 标准c程序入口。; b" J# X$ _; A5 M
  28. *    形    参: 无1 B. ~# h- I7 d, \6 `
  29. *    返 回 值: 无
    9 C0 e, L4 Q1 U. ]& b: J' k+ U4 i6 Q% M
  30. *********************************************************************************************************
    4 P/ {# B+ ?6 n7 t
  31. */; Z9 |7 |( d9 b5 {1 Q0 B9 o
  32. int main (void)
    4 l' L, x/ q& Y+ m5 [
  33. {   . ?! h( J3 G+ C  q3 ]
  34.      /* 初始化外设 */" N0 y# K! N& G6 v7 ~
  35.      bsp_Init();
    9 D6 p2 e- p7 @+ m& X% Q
  36.     1 `1 `) o' p) J; |0 y. E' e
  37.      /* 创建启动任务 */+ m- g! R* x; r( {7 R  [$ d
  38.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
    1 Z( M; A% f7 s, d* D$ P$ R, S# O4 A0 T
  39.                        2,                        /* 任务优先级 */
    / [0 G+ V6 \5 n" _$ U! `
  40.                        &AppTaskStartStk,         /* 任务栈 */" N6 v7 ]  t, R& F2 s
  41.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */5 T! @8 m, F& U
  42.      while(1);& t% c' N: _1 h( Y" D1 g
  43. }6 A: s7 S& p3 w  N

  44. # |1 q- S+ E! ]+ s
  45. /*; y& n4 \% v4 O- N2 H8 ~  j
  46. *********************************************************************************************************$ e2 Y6 q% |7 x
  47. *    函 数 名: AppTaskLED
    1 h+ y$ M8 g- l3 J( A
  48. *    功能说明: LED闪烁
    2 q: W+ M# g: H  l  @  H
  49. *    形    参: 无; \9 j( Q0 c' ~
  50. *    返 回 值: 无: H, l* @  h: A) q
  51. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    3 o+ X' N! ?' ~* ~$ s: g  p0 [5 f
  52. *********************************************************************************************************, Q0 a% P  W5 ^9 U2 Q( \
  53. */1 D+ S& U8 H% [4 [0 }  p$ Q; M, e
  54. __task void AppTaskLED(void)2 S8 b0 ~' {2 p' ~+ a
  55. {
    & F2 I: E4 a' j7 v& ?
  56.     while(1)( \3 {* P- M2 c. t# g  z
  57.     {
    ) K) h$ j0 |. o
  58.          bsp_LedToggle(2);
    1 G4 P- `- y0 \7 M6 H! z$ a* ]
  59.          bsp_LedToggle(3);
    9 q" w! t+ K5 R6 _
  60.          os_dly_wait(200);
    1 w3 l. k2 M+ }( L. o% U- l9 u
  61.     }5 o0 b# J1 R  p" _$ B
  62. }% g# r1 J1 j/ }( D
  63.   \: T5 }0 p" O
  64. /*
    9 t/ E4 x, N  n2 H, ^5 a
  65. *********************************************************************************************************+ d' B& G7 U. p
  66. *    函 数 名: AppTaskStart+ N2 T' a' K; J5 g1 |
  67. *    功能说明: 启动任务,也就是最高优先级任务。
    9 j* k: W7 s" B$ Y- H
  68. *    形    参: 无: M" [  z& A7 f2 D
  69. *    返 回 值: 无
    # @: \6 P  H0 B- M4 q! ^% X
  70. *    优 先 级: 2 , Y: ~* W' q9 X- E! W
  71. *********************************************************************************************************
    / l; D7 z! O4 O" ?
  72. */
    9 U) q4 I8 n6 T0 R- L% m
  73. __task void AppTaskStart(void)5 j5 O! \0 F, ?. L( d& J: _
  74. {9 t, H/ f- |0 {- K( W" j
  75.      AppTaskCreate();0 }5 E/ ~) H0 x5 f6 W9 [
  76.    
    9 ^5 k+ `; v6 A- R
  77.     while(1). w7 U& Y0 S. Q% D
  78.     {
    " e( \6 ~) `# g4 |1 m/ J
  79.          bsp_LedToggle(1);! f& }( _7 h8 d
  80.          bsp_LedToggle(4);# b) z7 q) O  r3 g
  81.          os_dly_wait(500);
    / T- o* n; M6 t# l+ C. T
  82.     }
    9 v8 c* C9 Y0 ?- s2 y* Z
  83. }
    & [: o* O: k4 U; P+ _' `% O
  84. 4 n* N& i6 q( ~# \
  85. /*
    9 o% V4 `- r4 T; Y, B* ]
  86. *********************************************************************************************************
    $ ?5 W1 `4 b, ?1 g+ N; U% Y5 ~
  87. *    函 数 名: AppTaskCreate; L$ N: \+ N& u$ ~/ N0 {! E
  88. *    功能说明: 创建应用任务! ?) @) o, {% ^7 w) g, u* `- y
  89. *    形    参: 无
    ' U3 ]% j4 q) [! E# R  _4 U
  90. *    返 回 值: 无( ^8 N* {- P8 L6 e, @
  91. *********************************************************************************************************
    $ a4 ~, s  T4 x/ [3 A' y
  92. */
    : g* C. }; P% W1 i0 ?
  93. static void AppTaskCreate (void)
    2 }1 z0 m# `: [1 l/ _
  94. {
    : b( I" ?" L( D! o/ t/ ^
  95.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
    & I0 _1 W" S+ b/ b
  96.                                         1,                       /* 任务优先级 */
    / E, q8 g, S' U& r4 d
  97.                                         &AppTaskLEDStk,          /* 任务栈 */5 b) ~  \7 }4 ~1 y; ?% ?( N
  98.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */) _, |% d& @* N+ s6 E
  99. }
复制代码
按照第三章的3.4小节中介绍的调试方法,可以看到如下图5.8所示的任务执行状态:
5.12.png
图5.8 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。
* _; q( b2 {; z( v; E* F8 d& E
baiyongbin2009 回答时间:2016-1-19 15:34:48
5.4  总结
    本章节为大家讲解了库移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。

8 T" d# I4 T' X0 N5 c: y7 {9 \7 T
湉湉 回答时间: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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版