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

【安富莱】【RTX操作系统教程】第6章 RTX源码方式移植

[复制链接]
baiyongbin2009 发布时间:2016-1-20 14:57
第6章      RTX操作系统源码方式移植
    本章教程为大家将介绍RTX操作系统源码方式移植,移植工作比较简单,只需要用户添加需要的源码文件即可,不需要做任何的底层工作,也不需要用户做任何修改。
    本章教程含Cortex-M3内核的STM32F103的移植和Cortex-M4内核的STM32F407移植。
    6.1    移植前准备工作说明
    6.2    STM32F103源码方式移植RTX系统
    6.3    STM32F407源码方式移植RTX系统
    6.4         总结
6.1  移植前准备工作说明
1.  RTX系统软件开发平台仅支持MDK,建议使用MDK4.74,因为后面的例子都是以MDK4.74为平台。
1.     找一个简单的工程,最好是跑马灯之类的,越简单越好,我们就在这个简单的工程上面移植即可。
2.     大家使用的简单工程里面不能有SysTick,PendSV和SVC三个系统中断的使用,因为RTX系统要使用这三个中断。

) m9 k1 {* Q: Z- C! b- u
收藏 2 评论5 发布时间:2016-1-20 14:57

举报

5个回答
baiyongbin2009 回答时间:2016-1-20 15:11:14
本帖最后由 baiyongbin2009 于 2016-1-20 15:12 编辑
: ]+ o1 l) A+ r8 ~2 H
! o4 M2 K" F* m9 f7 N6.2   STM32F103源码方式移植RTX系统2 r4 M, S+ l4 e/ k2 |
, d; D( `! z& y: }
6.2.1      RTX操作系统移植
    首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图6.1所示(大家也可以制作其它任意的工程模板,不限制):
                              
6.1.png
图6.1 工程模板
    准备好工程模板后,就可以开始移植了。首先要做的就是将所有需要的源码文件放到工程模板里面。下面分五步跟大家进行说明,当然,不限制必须使用下面的方法添加源码到工程,只要将需要的文件添加到工程模板即可。
第1步:在工程模板创建RTX文件夹
6.2.png
     再在RTX文件夹中创建如下三个文件夹
6.3.png
     inc文件夹用于存放头文件。
     portable文件夹用于存放移植接口文件。
     src文件夹用于存放源码文件。
第2步:添加源码文件到相应文件夹
1.  文件夹inc中需要添加的文件如下:
6.4.png
    文件RTL.h和RTX_Config.h在MDK安装目录中的路径C:\Keil_v474\ARM\RV31\INC
    其余文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM
2.  文件夹portable中需要添加的文件如下:
6.5.png
    这5个文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM,其实HAL_CM1和HAL_CM4可以不必添加,因为这两个文件是分别用于CM1内核和CM4内核的芯片。
3.   文件夹src中需要添加的文件如下:
6.6.png
    这11个文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM
4.   文件夹User中还需要添加如下两个文件:
6.7.png
    文件RTX_Conf_CM.c在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\Config
    文件RTX_Lib.c在MDK安装目录中的路径C:\Keil_v474\ARM\RV31\INC
第3步:将源码文件添加到MDK的工程项目中
    添加后的效果如下:
6.8.png
第4步:新创建一个includes.h文件,将所有的头文件都集中到这个头文件下。
    这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h文件放在了User文件夹中。然后再将这个文件也添加到MDK工程项目中
6.9.png
    Includes.h文件中的内容如下:
  1. /*
      r! `3 }/ \: A; B5 S, D
  2. *********************************************************************************************************
    0 P. U  p- ?% n1 ?
  3. *
    7 V5 f' F0 y  y3 z% @
  4. *    模块名称 : 头文件汇总, K0 J5 g' ~$ w
  5. *    文件名称 : includes.h
    / L) e8 i; P( K$ j: J( o
  6. *    版    本 : V1.0
    4 S2 A4 s$ N( n
  7. *    说    明 : 当前使用头文件汇总% ]3 ^0 x9 w8 b, u8 L
  8. *
    + p! s+ a4 Y  k( t' h) s5 R3 V) Q
  9. *    修改记录 :
    , n" x3 O) r& m7 o3 G* n: N
  10. *        版本号    日期        作者     说明; V5 e, Y/ D# l; A# @$ c
  11. *        V1.0    2015-08-02  Eric2013   首次发布
    ( }. z# d' A! B2 u3 D
  12. *& R6 I' L4 l6 [, P6 j3 Q1 e
  13. *    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
    # w' e5 F4 k0 K
  14. *
    7 M1 J, s+ A; b( ]
  15. *********************************************************************************************************
    # M6 _0 f- r* c' F$ G6 M
  16. */
    8 r5 f! g+ l0 _
  17. ; s0 r2 r' O! `
  18. #ifndef  __INCLUDES_H__1 j* z' B# U3 b: m
  19. #define  __INCLUDES_H__
    - f! J8 ^) N. o/ @2 \8 l
  20.   K+ V: z# t; K) u
  21. /*6 ^' B2 E3 S3 k2 F
  22. *********************************************************************************************************7 f( @: V1 L8 M& U; O. z
  23. *                                         标准库- ~0 H* {# J$ i  i
  24. *********************************************************************************************************$ g: y8 w) h) `" }: x! d9 }  }
  25. */3 l  X+ x4 r5 H  q
  26. #include  <stdarg.h>
    # p* J$ H' q9 a
  27. #include  <stdio.h>- L  g2 ]! F, l: k! `1 N
  28. #include  <stdlib.h>
    ; O+ y) C& x- J0 K) H
  29. #include  <math.h>* |/ T& @' }: E" d% ]0 }- m5 H
  30. ' n( O/ Q5 O6 H4 C' |% ?
  31. 3 ~5 g! f2 u, J3 i
  32. /*6 l: G, L5 s; `. n
  33. *********************************************************************************************************& b/ o8 W+ F4 t1 a/ B5 F, i$ l
  34. *                                         其它库
    ( Y/ @/ W4 Q+ l: k! Q* a* d
  35. *********************************************************************************************************
    ' n# V$ H& F' P( k4 I! d! m
  36. */" H( G: `7 d, ]2 U- J# \9 H# X

  37. 9 d1 K1 W# v8 [
  38. - [. Q: I6 T2 }" \" E7 j
  39. /*3 v; h  _# e* D1 i8 {/ J4 f1 ~0 u
  40. *********************************************************************************************************. K8 `3 o) O; x" \% n0 W  F) L
  41. *                                           OS
    ( }. b4 P6 I1 s' a" t- u
  42. *********************************************************************************************************
    3 L1 M/ z( F& c" e
  43. */; o( G) S2 }# @/ q, V
  44. #include "RTL.h"% [6 G5 N# b% ?2 x
  45. ' i1 S4 [( J8 w# x/ N9 w0 v

  46. 3 h4 d9 [  \8 n& k) k
  47. /*
    & O- @0 k& ?1 g* m7 _. \% U
  48. *********************************************************************************************************& V2 c( ~) b" _" o' m% C
  49. *                                           宏定义
    $ V# k; R" J9 ?; M$ C
  50. *********************************************************************************************************
    0 Z+ `* W+ o4 U, c- c6 Q
  51. */; p& n. ^5 N2 V5 t4 t
  52. : i0 M5 ]2 N$ `' p- E

  53. 6 g' e6 c0 o  K+ W
  54. $ T; X7 n/ M, ]5 ]
  55. ( t/ j* U) ~0 B
  56. /*
    6 |/ P; z9 [7 O+ g
  57. *********************************************************************************************************
    & U& g" F8 M8 G# }0 A# M  x* A
  58. *                                        APP / BSP9 ^5 ?8 G( w" B' P' J/ `
  59. *********************************************************************************************************
    / t; y% [& ^8 h
  60. */
    + f, a: l" {& g5 ]2 B7 w" \2 e. f

  61.   u! a3 }  `# n; F, \
  62. #include  <bsp.h>
      ?. R( b6 Z3 e9 d  t& V: m7 V
  63. ; a( e: V8 T  `# S! o

  64. 6 f* i  }4 C8 A
  65. #endif
    ! L9 X# E% }3 u

  66. + h+ n* G% ^) P7 v" k; d
  67. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
第5步:也是最后一步,添加相应的头文件路径:
在原来工程模板的基础上面新添加的两个路径:
6.10.png
至此,RTX的移植工作就完成了,剩下就是系统配置和应用了
6 g, \, U' `% ^1 y

% h5 p+ S: f7 Z4 W
6.2.2     RTX操作系统配置说明
    RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图6.2所示的工程配置向导:
6.11.png
图6.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_ 开头的函数时,会将请求类型存到此缓冲中。
2 G: J- v3 R, N( U
. S2 i' m* D- K& j$ ]9 I& r
6.2.3     RTX操作系统应用实例
    通过上面对RTX操作系统的配置讲解,这里将其修改为如下图6.3所示配置:
6.12.png
图6.3 RTX配置向导
相对默认配置,修改了上图红色箭头所示的三个地方:
1.     任务运行在特权级模式。
2.     滴答定时器主频72MHz,这个也是STM32F103的主频。
3.     系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
AppTaskLED任务 :LED闪烁。
AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
  1. #include "includes.h"            /* 底层硬件驱动 */3 S% }0 a: R/ M- c

  2. ; H& Q% ^* |/ g$ a
  3. /*  w; L( u5 K" U, X" @
  4. **********************************************************************************************************
    + Z0 p8 |9 r. T! t& Y) A
  5.                                                    函数声明
    1 H, H2 `) l) W0 h; o! V% D
  6. **********************************************************************************************************7 h" L" `! y! r. \9 ]7 L0 T/ [
  7. */2 j3 \+ T6 G# K; T3 ?
  8. static void AppTaskCreate (void);
    ( Y# r6 f  c9 }* x; U8 {. o: U* a: Y/ ?
  9. __task void AppTaskLED(void);+ @/ S3 V1 n! s" X
  10. __task void AppTaskStart(void);, E: D- Q: n/ [7 e( G; P
  11. " A- t, @6 K4 f
  12. /*
    ' ]9 @* F7 z. c- K8 ?3 t" d: a
  13. **********************************************************************************************************& u, f" @1 J- A0 p8 K
  14.                                                     变量
    / B& V5 r, Z0 j- X$ F+ L
  15. **********************************************************************************************************5 N& u5 ]$ v& n" L$ L
  16. */
      g3 @. [0 Z! j  M: a
  17. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */
    4 R: A3 a8 q1 ^0 V# b
  18. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */5 f* g+ m1 h0 q0 F1 u% {7 r

  19. , @' {- w& e. e% p: o0 ]5 X- @, k
  20. /* 任务句柄 */' `& J9 U4 D+ E/ `7 z9 u
  21. OS_TID HandleTaskLED = NULL;
    ) S" f* d; z. Y; T0 G9 i
  22. + O& P* m# n4 ^( K. ]! m3 f- M' E3 w
  23. /*$ B9 M* f1 Y1 ]4 i9 h# i
  24. *********************************************************************************************************
    " @, K1 }3 k/ f! G3 _  z8 C5 m
  25. *    函 数 名: main1 h7 ]# U1 m. m1 ]. q1 E
  26. *    功能说明: 标准c程序入口。
    ; ?- a3 U3 B/ V( R1 i9 L/ p
  27. *    形    参: 无
    + X# t* t4 b9 h% H2 Y$ [0 ^' j
  28. *    返 回 值: 无* I7 C# C& O1 [/ l) ]
  29. *********************************************************************************************************
    - j& ~% S2 z( `1 A$ x1 C9 N
  30. */
    - n0 q7 o' L, K% o
  31. int main (void)
    " W+ y( C: n7 F$ k$ V" Q1 S0 T
  32. {   % r7 A' C' A5 r5 T$ U2 }  D& t
  33.      /* 初始化外设 */
    2 Z1 d) F& W8 m/ {& h( M+ C! V
  34.      bsp_Init();7 \( y8 ?& P# X( [  D, a
  35.    
    - S( D0 A$ v( s# Z# K
  36.      /* 创建启动任务 */
    5 [* p- @: F$ [. x8 ?% g
  37.      os_sys_init_user (AppTaskStart,             /* 任务函数 */7 n# }2 f' q, W5 x6 Y
  38.                        2,                        /* 任务优先级 */
    6 W: x0 X4 w/ e: A% F
  39.                        &AppTaskStartStk,         /* 任务栈 */4 }7 M+ A, R0 ?: k9 c# I. |
  40.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */* [/ p# t3 a4 H$ T3 T, x
  41.      while(1);
    5 v8 ]7 f5 @: \6 K7 g
  42. }
    4 ^% L4 m  Y/ J
  43. * J8 ~' G0 h$ k0 ?' K
  44. /*
    4 j8 }  ^7 P2 o9 G" T  `
  45. *********************************************************************************************************1 g4 w; Y8 F! s+ ~0 Z7 O1 B
  46. *    函 数 名: AppTaskLED
    / K/ Q$ J! ~8 |7 f& h5 C
  47. *    功能说明: LED闪烁
    . a% u% P6 ~: ]2 v6 w
  48. *    形    参: 无3 Y: r( J5 K8 q9 w, b0 W0 Y
  49. *    返 回 值: 无
    % \- F: F, Q- ?7 Y; f3 h3 F8 [* `
  50. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    * q8 w, Y# D1 e3 [% A' m. E
  51. *********************************************************************************************************
    & j4 _7 S5 k1 X: U1 T8 r6 I7 A
  52. */7 K+ }, e. \! k/ z! x
  53. __task void AppTaskLED(void)
    $ N, f0 L( B: j7 H: Q. ]- N
  54. {
    - p3 y+ \, Q- x: O% ]% w) w
  55.     while(1): e' x  D3 Z0 b  I" ~/ }0 D
  56.     {* z  O5 H1 B( A2 G9 n" ?$ X
  57.          bsp_LedToggle(2);' o; X; @8 K9 e+ i4 V1 s* e; x% z% J
  58.          bsp_LedToggle(3);
      b( J" M+ T7 X
  59.          os_dly_wait(200);
    $ M5 I& _5 B# k9 @- j, L6 P. {3 g
  60.     }  G% k4 R$ m; O) i7 p
  61. }
    . J# k3 o5 U4 D! y- R" C. j7 I/ L

  62. # l2 ~* u* o4 G
  63. /*
    ! l- Q5 X* A. E$ K; v* h. O
  64. *********************************************************************************************************+ W6 O0 d, D# O' q1 v3 x
  65. *    函 数 名: AppTaskStart
    # X1 b$ }; o0 F& ]6 q; Y
  66. *    功能说明: 启动任务,也就是最高优先级任务。3 T) S3 Y2 h7 x  O( S6 ], ^$ u
  67. *    形    参: 无
    # v- {' |$ B6 O, e; ^! U: Q& H
  68. *    返 回 值: 无9 ?7 e! X9 I7 _
  69. *    优 先 级: 2
    5 ]  p" ^2 Z3 o- c+ g! u
  70. *********************************************************************************************************
    : J5 \) M+ S8 Y9 Q; v
  71. */  I5 b5 n5 B+ I! B) @
  72. __task void AppTaskStart(void)( [. o, V: q4 V( _! k; @8 w
  73. {
      J, ^1 H; C+ t
  74.      AppTaskCreate();) k, J; \, s1 I/ G4 g6 v' E9 j
  75.     # i4 I( N* |3 i) {1 v2 U
  76.     while(1)7 G' s5 h3 E9 V2 A
  77.     {
    4 x7 @4 t! M& Y  [6 t: ?* X
  78.          bsp_LedToggle(1);
    4 y" B8 M% }6 N3 U) |
  79.          bsp_LedToggle(4);
    $ F! Z2 d; W" H2 I% x
  80.          os_dly_wait(500);! |% d9 Z( O9 S/ c6 H" U
  81.     }& }! W" t3 m" A7 P& N
  82. }0 r1 r3 J( P9 i

  83. 0 w4 O: z6 D' X/ j# o/ a1 I' `
  84. /*$ {! H5 ^6 _# z5 R; c1 b
  85. *********************************************************************************************************
    0 e3 k6 I: Y" h% d
  86. *    函 数 名: AppTaskCreate0 S4 j$ e4 ]& _: Q8 I
  87. *    功能说明: 创建应用任务
    - V* Z$ F0 s& K7 p& {
  88. *    形    参: 无# ?4 c$ P% V: A: b# M
  89. *    返 回 值: 无2 w* z' a3 K9 Z: q, a. `% y
  90. *********************************************************************************************************& p" [9 T1 L/ r( m8 r
  91. */4 u8 \1 H2 o2 J4 k, a. a
  92. static void AppTaskCreate (void)& L0 `5 n( e1 y/ a2 o* M
  93. {; Y. }( q5 I8 [6 t! ^
  94.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
    9 ?% k6 \4 j1 s5 j$ j
  95.                                         1,                       /* 任务优先级 */$ `4 X# a! J  r
  96.                                         &AppTaskLEDStk,          /* 任务栈 */8 n& j3 Q9 z( p" t4 b8 ?' I
  97.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */" U- K7 K7 D% n. v  t8 p4 T
  98. }
复制代码
按照第三章的3.4小节中介绍的调试方法,可以看到如下图6.4所示任务执行状态:
6.13.png
图6.4 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

4 N/ T9 ~" _- t  {" p
baiyongbin2009 回答时间:2016-1-20 15:34:06
本帖最后由 baiyongbin2009 于 2016-1-20 15:35 编辑 0 M) ^( D5 b- j1 u! d  A
, N5 F; Y2 e' `+ e) L; Q: z
6.3 STM32F407源码方式移植RTX系统
& A7 D4 H5 O" z, `3 S4 @" e9 b

. |% c! @* `0 X, C" @3 u6.3.1     RTX操作系统移植
    首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图6.5所示(大家也可以制作其它任意的工程模板,不限制):
                              
6.14.png
图6.5 工程模板
    准备好工程模板后,就可以开始移植了。首先要做的就是将所有需要的源码文件放到工程模板里面。下面分五步跟大家进行说明,当然,不限制必须使用下面的方法添加源码到工程,只要将需要的文件添加到工程模板即可。
第1步:在工程模板创建RTX文件夹
6.15.png
    再在RTX文件夹中创建如下三个文件夹
6.16.png
    inc文件夹用于存放头文件。
    portable文件夹用于存放移植接口文件。
    src文件夹用于存放源码文件。
第2步:添加源码文件到相应文件夹
1.  文件夹inc中需要添加的文件如下:
6.17.png
    文件RTL.h和RTX_Config.h在MDK安装目录中的路径C:\Keil_v474\ARM\RV31\INC
    其余文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM
  2.  文件夹portable中需要添加的文件如下:
6.18.png
    这5个文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM,其实HAL_CM1和HAL_CM3可以不必添加,因为这两个文件是分别用于CM1内核和CM3内核的芯片。
3.   文件夹src中需要添加的文件如下:
6.19.png
    这11个文件在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\SRC\CM
4.   文件夹User中还需要添加如下两个文件:
6.20.png
    文件RTX_Conf_CM.c在MDK安装目录中的路径C:\Keil_v474\ARM\RL\RTX\Config
    文件RTX_Lib.c在MDK 安装目录中的路径C:\Keil_v474\ARM\RV31\INC
第3步:将源码文件添加到MDK的工程项目中
    添加后的效果如下:
6.21.png
第4步:新创建一个includes.h文件,将所有的头文件都集中到这个头文件下。
    这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h文件放在了User文件夹中。然后再将这个文件也添加到MDK工程项目中
6.22.png
    Includes.h文件中的内容如下:
  1. /*& P* v* b* A2 T1 e1 o0 e1 }" D3 K6 ~, ?
  2. *********************************************************************************************************1 A4 H; Z; y$ y" E
  3. *
    8 n/ ?7 b4 }& Z; J
  4. *    模块名称 : 头文件汇总! K4 c1 H1 G* g: [9 ?3 h
  5. *    文件名称 : includes.h7 x8 G- V* q$ f% Q% T$ Q- ?
  6. *    版    本 : V1.0
    2 K1 C) t$ h6 a  \( L9 ~! \
  7. *    说    明 : 当前使用头文件汇总3 a6 G( t+ j5 O) Z7 O+ o( [
  8. *, V4 B' A4 _0 I# c9 t. Z! d. J
  9. *    修改记录 :- U- j+ k' F0 s/ o7 W4 B, J. A' o" x
  10. *        版本号    日期        作者     说明' L, C( ^. \" ]- n6 I, G% w
  11. *        V1.0    2015-08-02  Eric2013   首次发布
    : I0 p9 X4 ^& G  a0 z- F7 f
  12. *' Z/ ?. A$ z% m, [
  13. *    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
    , Z* Q' K; U8 ^8 N( Z  y
  14. *& d3 ?, T* }* p+ n
  15. *********************************************************************************************************
    7 b. f/ S2 n$ u$ ~1 [" }
  16. */
    3 ]' z* ]3 W$ Y: ?) g, |6 i0 Q8 `

  17. * E  B" Y! I7 D' K9 u( a  S
  18. #ifndef  __INCLUDES_H__
    ; d& e5 z  ~- P9 o2 w
  19. #define  __INCLUDES_H__! ?+ X% e0 T9 d0 \% _1 c( G

  20. , q2 F; O5 {: C. t. P& l% E
  21. /*
    / s! V. j: X+ F$ A( M. ]' n
  22. *********************************************************************************************************
      Z0 w7 l& v7 Q2 I; C% b) Z( T4 F
  23. *                                         标准库% [  b5 G2 C5 S# s1 b5 J. M1 q) N
  24. *********************************************************************************************************
    6 D6 c! M# F# M9 H# n/ Q9 g
  25. */
    * l. L- ~: w- v' e1 a) {
  26. #include  <stdarg.h>; v& V) U: g1 s9 A. e
  27. #include  <stdio.h>
    " h1 d( F% Q& j" w% }9 j
  28. #include  <stdlib.h>/ m# _" D5 Y+ r7 p/ a
  29. #include  <math.h>& z. R" V5 N) `5 p- y( r* @
  30. 2 K* @) ]0 w! \- e
  31. 5 U; v) L, i0 @# ~# p6 q' b% U9 U
  32. /*
    - r- K0 V' [, }/ ^0 s' O; b* {
  33. *********************************************************************************************************0 @( Q  S, O4 e* e4 }" X& a" u
  34. *                                         其它库
    . I7 N; Y! z* X% r/ L- ?
  35. *********************************************************************************************************
    / Q! y. u8 W4 t$ |9 p& X
  36. */
    # W( h' ^/ H' @' E3 j# n

  37. ' q$ e3 k8 a; J8 z: l8 j
  38. ; \; B5 ~& |! Q& i4 g, B8 ^
  39. /** m- W' j/ @; s0 E2 C  a; {7 M
  40. *********************************************************************************************************
    ' E* w: _& e$ Q/ c) b, V" w! [, E
  41. *                                           OS
    7 u9 k$ y/ p' v$ U# A% Y
  42. *********************************************************************************************************; [; R0 {. A+ N1 Y
  43. */  ]  _# a% W' d: B  i& j/ q% R
  44. #include "RTL.h"
    ( P" M; ]8 p" n0 u
  45. ' D' a' F! H+ g0 M) B( J7 ~% w
  46. 5 K. V8 O- \4 z% F+ I4 w$ ?/ y
  47. /*/ ]+ n" H* ]* l; l
  48. *********************************************************************************************************
    ' _: f( C+ P: t% D- x0 K
  49. *                                           宏定义
    # d% _, E# ^' _. Z) S/ u
  50. *********************************************************************************************************3 V6 m( Y; t& R; N
  51. */
    & k4 p3 F9 d2 S# u1 I- p+ D

  52. % j- F; a# T& M! B+ F
  53. & [. W' F; n3 L+ G

  54. ( z( a/ F/ o9 l) p+ z
  55. $ X! J! I, b8 ], o$ F" R) K
  56. /*
    " z# `4 l: v, m& ]' s
  57. *********************************************************************************************************3 k3 A& b% h- l" e9 V1 T/ p
  58. *                                        APP / BSP# \7 e& e0 [% T: `) N
  59. *********************************************************************************************************' X0 W3 a/ z1 A5 k% T
  60. */: h& Q! B- K# Y2 c6 n
  61. ) v7 w/ V9 ]+ M: T
  62. #include  <bsp.h>
    , M, K+ _" b/ a

  63. % {, v% \0 L2 y+ k
  64. % d6 u3 u8 y* W8 m( M  e/ b
  65. #endif
    6 ^0 B/ d2 m) ?6 G6 Z

  66. " b8 v7 ~( W; Y# a( Y
  67. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
第5步:也是最后一步,添加相应的头文件路径:
在原来工程模板的基础上面新添加的两个路径:
6.23.png
至此,RTX的移植工作就完成了,剩下就是系统配置和应用了
; b" g5 V8 b% L/ P
4 `# ~5 P2 z- G2 L! `1 B) o
6.3.2     RTX操作系统配置说明
RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现。在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图6.6所示的工程配置向导:
6.24.png
图6.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_ 开头的函数时,会将请求类型存到此缓冲中。
3 q: Z2 O+ H' C, L: I) @* r
0 N9 h; Z) Q) o
6.3.3     RTX操作系统应用实例
    通过上面对RTX操作系统的配置讲解,这里将其修改为如下图6.7所示配置:
6.25.png
图6.7 RTX配置向导
相对默认配置,修改了上图红色箭头所示的三个地方:
1.     任务运行在特权级模式。
2.     滴答定时器主频168MHz,这个也是STM32F407的主频。
3.     系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
     AppTaskLED任务 :LED闪烁。
     AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
  1. #include "includes.h"            /* 底层硬件驱动 */: ]; s6 r' _/ j# B2 y$ p" p# v1 _
  2. : X  K& ^) }) O
  3. /*8 I/ i/ ^- n6 `) \
  4. **********************************************************************************************************
    ; C* \  P2 O! \1 C- s3 G) F
  5.                                                    函数声明* H! X* F) Z. b& G4 [
  6. **********************************************************************************************************: l/ S' v( y! W4 t  i' z/ k$ [; d
  7. */
    : s7 @3 E, F4 m
  8. static void AppTaskCreate (void);2 J. ~% S8 n6 ]% ]' Q; P# T3 z
  9. __task void AppTaskLED(void);1 y/ V" C+ a2 M0 Z+ E0 Z* Q: M2 \7 l0 W* x
  10. __task void AppTaskStart(void);
    8 ?# \* S  \% ^; _* ~

  11. & j( z# Z% z& F% P. ^% q( X
  12. /*
    % L/ N* p6 a4 v9 Q
  13. **********************************************************************************************************
    / t" Q+ B9 n4 {; o
  14.                                                     变量8 e2 x! |( g' I! c; x( U
  15. **********************************************************************************************************7 y2 S) D0 k3 ]9 U- ^
  16. */" ?0 s( F5 z3 q- ]% ?# ?: k, |% V+ _
  17. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */
    8 a& T0 k+ u8 V( W4 y* K( p; {
  18. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */( m& ?* P3 p& M

  19. * S8 P; j5 J# Z+ B
  20. /* 任务句柄 */& ]/ O/ `- M6 o1 N. `7 k
  21. OS_TID HandleTaskLED = NULL;
    : A: r& F+ B5 d6 e

  22. 7 G/ b9 T% M' Q5 H
  23. /*
    2 M" z4 p0 M5 u3 y
  24. *********************************************************************************************************
    + [: b: G4 M' x( |
  25. *    函 数 名: main
    : f/ }# x6 U$ }% ?
  26. *    功能说明: 标准c程序入口。* j" O9 K5 B+ ~2 Z
  27. *    形    参: 无2 z0 C4 C, r6 f: }8 n0 o. k
  28. *    返 回 值: 无9 p! x9 A; ?5 e9 v: I8 E0 G
  29. *********************************************************************************************************
    2 ~7 l. k* d* @( L8 x
  30. */6 F2 \! h; q# S! ]7 D/ M- w
  31. int main (void)' Z1 h% z' x! }3 d" m7 ~
  32. {   
    8 P5 a' d" t0 w( U0 v
  33.      /* 初始化外设 */
    * s4 d$ i- `! n
  34.      bsp_Init();
    ) x7 H9 b9 r, u" h( Z% ?5 f
  35.     4 @  ^, C# z2 o) ^. m
  36.      /* 创建启动任务 */
    7 {" ~1 l# B8 {
  37.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
    ) S* S4 ?5 C* X, q: Y; M. w6 |
  38.                        2,                        /* 任务优先级 */* p( q% W& Y6 K  n
  39.                        &AppTaskStartStk,         /* 任务栈 */& I' A& k& V0 }; Z/ j, u
  40.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
      ?- J8 r$ b& P) T& n3 M
  41.      while(1);3 r& f- f0 _( ?# s5 M  T; s! `
  42. }  c1 w0 U/ L0 E9 H9 @8 N
  43. ( K/ k) m$ H/ ^% k3 @. a
  44. /*! A& ~; R- m4 v0 }# j0 S, s' n( x
  45. *********************************************************************************************************" D0 B+ b  c* F/ v8 h) @
  46. *    函 数 名: AppTaskLED* z! [8 W7 y7 @2 \; E5 F6 w$ b8 {
  47. *    功能说明: LED闪烁' n# ?, x% u' P; S+ ~% m, q( R0 p
  48. *    形    参: 无5 @" T! K7 w* V% [* E9 E. a4 L
  49. *    返 回 值: 无7 C" j- W6 v7 B3 j6 h6 Y/ t( z
  50. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    4 D  A) q" i! `
  51. *********************************************************************************************************
    ' T' f. A6 N2 H) R! F
  52. */% e; Z  ^- h9 l0 ?) N& k
  53. __task void AppTaskLED(void)' C% ^: @, g, }
  54. {
    - x9 Q  d/ J1 ~4 {7 M* [) n
  55.     while(1)
    2 q& ]: ^0 _% p* d% ^3 C
  56.     {* X! u& B) t0 P. I- B" Q
  57.          bsp_LedToggle(2);- M- m$ h( {0 ?3 O0 \
  58.          bsp_LedToggle(3);& O8 [0 t  Y0 _
  59.          os_dly_wait(200);. v& Z- Y3 d4 ^( u7 e
  60.     }/ |9 s; r: f( B+ p
  61. }" K4 y$ c% K- ?$ E: d) s

  62. % d: D& X4 v: Z& v  E4 X
  63. /*8 U5 u! q0 x+ F
  64. *********************************************************************************************************# }# d. w) y/ S$ _
  65. *    函 数 名: AppTaskStart9 L) y( Y4 W' q
  66. *    功能说明: 启动任务,也就是最高优先级任务。
    5 B8 d& T0 N2 E5 l4 Q/ H
  67. *    形    参: 无1 U7 o7 V- v% n5 D5 r0 H% f- a
  68. *    返 回 值: 无
    8 h/ E" }- A. c
  69. *    优 先 级: 2 4 \# L+ M5 p6 Y( j2 L. ^/ X
  70. *********************************************************************************************************! @% D% J: g: w, U, h( j' k
  71. */8 p  W8 ~( L" \
  72. __task void AppTaskStart(void)
    / P# q# i' _* J; A
  73. {/ N+ L! y/ M' P( z- _1 j/ Z
  74.      AppTaskCreate();- m$ _6 F; D5 Q9 A  ?, \/ @+ R! y
  75.    
    * w: Q' J7 F% q1 B# |
  76.     while(1)
    ( F2 A: R- Q+ b3 ?
  77.     {
    ' x1 y! q4 ]# c# Q0 p$ i
  78.          bsp_LedToggle(1);. A. l( P# l1 D+ a
  79.          bsp_LedToggle(4);
    ( q8 d# J; V8 e3 d
  80.          os_dly_wait(500);; X" a+ f) j$ q* _
  81.     }) t; A+ A; R  i$ C) I+ U
  82. }
    1 a7 C2 n6 f, ^- l6 P

  83. % S3 G: k9 k7 ?# ?# |4 t( V8 {( w
  84. /*- q" L  r9 S; ~: H; h
  85. *********************************************************************************************************# @  o  f5 D2 \' c& @# R
  86. *    函 数 名: AppTaskCreate- h6 o2 Y% z9 ~2 t' E1 V0 @
  87. *    功能说明: 创建应用任务. y' p8 ^7 z) f6 S: d1 F2 Q4 Q" a
  88. *    形    参: 无
    / E' G/ I1 t( P
  89. *    返 回 值: 无
    ! r. p  T, f' v( A4 [$ S
  90. *********************************************************************************************************' e% j+ X  {( F' s" V
  91. */2 E; A6 b7 }# s' L- M. j
  92. static void AppTaskCreate (void)
    + l6 f& r* x1 o1 _) `9 K" X0 D
  93. {
    5 t, S3 j, N8 C, ]
  94.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
    $ c+ p* Y% l* C& M4 D" G* a) q
  95.                                         1,                       /* 任务优先级 */
    + ~+ K) F" t/ X% Y6 l7 `
  96.                                         &AppTaskLEDStk,          /* 任务栈 */  w3 z/ g9 r) L' d/ U
  97.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */; B, |, w- E! o$ t
  98. }
复制代码
按照第三章的3.5小节中介绍的调试方法,可以看到如下图6.8所示任务执行状态:
6.26.png
图6.8 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。
- {7 F! i7 ?) g

4 z: d& n4 _  p! p3 N6 ]* e* O
baiyongbin2009 回答时间:2016-1-20 15:45:47
6.4  总结
     本章节为大家讲解了RTX的源码移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。

- f$ f7 ?$ U) `4 x! V* O
湉湉 回答时间:2016-1-24 17:32:52
   好东西 介绍了MDK的自带系统的移植 和 RTX代码的移植
watershade 回答时间:2016-2-17 14:35:32
本帖最后由 watershade 于 2016-2-17 14:49 编辑 0 t9 x0 h& {3 Q2 I* `" t0 M
8 C% s! H2 E! ^# l8 L8 R' @# b' Y& b
请问一下,两个任务优先级不同,那样优先级低的那个是不是压根就不运行?哦,搞明白了。我之前做实验的高优先级事件没有添加osDelay
6 M* k0 r7 B: s& p- J0 L! k

所属标签

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