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

【安富莱】【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系统要使用这三个中断。
$ {' L4 u* ^# H3 F
赞 收藏 2 评论5 发布时间:2016-1-20 14:57

举报

5个回答
baiyongbin2009 回答时间:2016-1-20 15:11:14
本帖最后由 baiyongbin2009 于 2016-1-20 15:12 编辑 + y1 l3 M+ b- C3 v' v
$ l' N5 _/ \! f- u) B4 s- K2 E
6.2   STM32F103源码方式移植RTX系统" g! s7 \9 r9 d: [4 S/ {" a8 T( r
. _9 q0 z, l3 a0 u
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. /*
      Q0 b/ \$ H% z8 |/ C6 ^
  2. *********************************************************************************************************( z; I- j2 _" W& L, o7 d# k& ~. a9 U0 ?  X
  3. *
    9 D5 n8 R0 p) Y) H* ^2 H
  4. *    模块名称 : 头文件汇总
    ! W( |# g+ d7 y7 _$ \  V/ t
  5. *    文件名称 : includes.h
    * g- g! l* I' ^3 Y# O7 Z
  6. *    版    本 : V1.0( ~6 a) U  L. |2 O$ @3 H3 ^
  7. *    说    明 : 当前使用头文件汇总
    $ ~. p1 h+ T3 x$ v9 `0 k
  8. *
    - ?, D% I1 X  v# m7 u
  9. *    修改记录 :# F% `3 x3 h! R: [, I
  10. *        版本号    日期        作者     说明
    : I$ ~6 {: X5 J( Y9 N5 K8 ?
  11. *        V1.0    2015-08-02  Eric2013   首次发布! v& @0 c7 X% j
  12. *' }/ N& w$ ^& G' {" a  t# v
  13. *    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
    ; ~7 h- h9 ^0 n4 }) m4 \) l9 R
  14. *
    : U; N9 t0 n  H3 \2 Z
  15. *********************************************************************************************************1 \. y) }- g' o4 r9 _
  16. */
    ' q/ ?- q/ c3 o7 }  f  d" |: \
  17. ' Y  s6 M$ r( h/ i( w( I2 U" z
  18. #ifndef  __INCLUDES_H__' f  O4 z# A; B! Q9 K0 }
  19. #define  __INCLUDES_H__
    3 n6 ~8 P. n0 m9 d" ]- Z: K

  20. . Q" [; y  |- {6 f
  21. /*% h  j8 u# t. T4 {
  22. *********************************************************************************************************
    ' P  O8 T# S% r$ ?- ?
  23. *                                         标准库& i! u& G4 G6 R3 P- H
  24. *********************************************************************************************************
    . K# w0 k0 l2 S, B7 u* ~5 v8 ]
  25. */! x$ O5 R; ]' d% q
  26. #include  <stdarg.h>
    ( M# ~' @* J* R& h
  27. #include  <stdio.h>
    7 i' A4 ?; c9 a4 d- t) I- @3 A
  28. #include  <stdlib.h>
    & ~' ?: l5 N6 D4 v* w+ K$ @4 L9 ]3 K
  29. #include  <math.h>
    1 n8 d+ V% X! y5 s/ U8 k# U
  30. 9 M6 E( F: [. L4 b% O* E
  31. ; t2 T7 G/ U" X* P" n; ]3 ^' H/ B
  32. /*
    ( @5 S# @, v! F: z. z0 b
  33. *********************************************************************************************************
    9 x. N* V5 M7 x: ~) x
  34. *                                         其它库/ i7 e( G, h( ~. Y, x; A# h& O
  35. *********************************************************************************************************, J4 }$ m/ F% w& n
  36. */4 |1 O  Q, M$ \. ^" S  T' V

  37. , y, b3 m& a  u1 C

  38. 9 a: h6 V" T3 @% \1 _; Z! [( ?$ w* P
  39. /*/ A! \: V2 e% w, L7 r: f" G$ K1 U
  40. *********************************************************************************************************
    . a: \  K2 Z; R$ D$ G: _1 Y) Z  m5 R
  41. *                                           OS% |" l9 m$ b9 f7 J5 x
  42. *********************************************************************************************************/ X9 F, _0 Z; I" r" K
  43. */2 `0 J6 ?; x) X' P$ d  }  a9 n0 g
  44. #include "RTL.h"
    3 y" N" L$ H6 t" J2 V' q' E
  45. " s# g0 Y2 M. }

  46. / m: ]0 @" z5 k: R
  47. /*; G* T. `( o' l
  48. *********************************************************************************************************
    4 Z8 D4 {; d4 q& _% h% S5 ?+ T
  49. *                                           宏定义
    / j4 t) b" ]9 v. w
  50. *********************************************************************************************************
    ' H+ o  M) A9 l/ f* u
  51. */
    2 W; g& W2 d) _! p- d

  52. 6 L( I) x0 x2 l: r% C! h

  53. % X. A! f3 S  b( v% m
  54. ) S4 v) i) F1 B8 M) F% t

  55. 0 `5 I+ }$ J4 h+ x6 l
  56. /*
    & s8 t# E4 j, y: V6 `, @
  57. *********************************************************************************************************+ H' V) |: Q! h$ n& J& b
  58. *                                        APP / BSP
    ( ]( q% N% Z$ [! Z
  59. *********************************************************************************************************
    1 [) z; r/ ~0 [; W( d
  60. */. v' {& C" X) X7 j( k& e

  61. 3 X6 u# F/ u8 C" ^! F& y
  62. #include  <bsp.h>4 I3 l! G9 D9 V5 F5 @+ U  H" O6 M$ H

  63. . ^6 r4 K0 ^5 G( K& y" m( B! U& H
  64. 9 W3 _4 u8 P! _
  65. #endif
    # h4 M. r- f/ O
  66. + ], O: A3 z" a0 {6 p( g3 \
  67. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
第5步:也是最后一步,添加相应的头文件路径:
在原来工程模板的基础上面新添加的两个路径:
6.10.png
至此,RTX的移植工作就完成了,剩下就是系统配置和应用了

  a5 h4 Y% `$ u" I2 c! q2 k3 S
/ a; _7 P& C+ y  _! G
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_ 开头的函数时,会将请求类型存到此缓冲中。
; t8 y9 [4 `- ?8 ~

* n/ w& F; t- H1 G* a  H, L0 Y
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"            /* 底层硬件驱动 */
    * M5 g/ w' e% Q1 A7 S6 ]3 s
  2. ' X! O2 O/ |( v+ o5 p
  3. /*' |0 o4 Z+ t" c  `8 Y* \6 n
  4. **********************************************************************************************************5 O8 U% @* y$ [! G8 h
  5.                                                    函数声明  _5 B) Y6 [, j
  6. **********************************************************************************************************. Y' ]& A6 A8 X3 D1 o! C
  7. */
    2 o, A7 I! P* M, y' F
  8. static void AppTaskCreate (void);
    ; |* N' P. D$ Q1 I' W6 O# C
  9. __task void AppTaskLED(void);
    & ^! G3 U9 T+ F2 w4 j1 U
  10. __task void AppTaskStart(void);6 [$ V! A7 f) l# z- |+ N* C) b
  11. / }, _& S3 r% m6 |
  12. /*( e/ q# N: W. F
  13. **********************************************************************************************************
    ! C6 L; Z0 m6 E' X6 h, }$ r2 H
  14.                                                     变量7 \8 y, [- j7 _! }5 x7 K  O" H
  15. **********************************************************************************************************
    0 a6 F4 H: L/ t+ X
  16. */
    % n& O# |% u# H/ {  s
  17. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */
    ) ^4 r' D8 L; Q% ]: u, P# q( R
  18. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */6 i/ H# k. E* F) l8 a
  19. # Z1 o' ^) S2 j
  20. /* 任务句柄 */
    7 x$ W- W) Q: x/ U: G' a1 r) ]8 i/ U
  21. OS_TID HandleTaskLED = NULL;
    ; G" I( D4 q+ e6 {3 W

  22. " Z4 |1 q: E  u5 V4 ~! l
  23. /*8 H+ g5 g7 W; w' h% D; d
  24. *********************************************************************************************************- B9 e8 Y" L& N
  25. *    函 数 名: main) U4 y5 r3 }, Z
  26. *    功能说明: 标准c程序入口。" d. x/ B1 T: ?& m3 k
  27. *    形    参: 无
    4 O9 v) T8 X5 U  U" ?
  28. *    返 回 值: 无0 C- G- r$ e0 t6 }) d: [& `
  29. *********************************************************************************************************5 h  r1 G, W- e; M/ f0 I& s$ _
  30. */' x5 _  f+ `" B, p! E3 |$ E- Q
  31. int main (void); e8 {; r. b4 g' d
  32. {   3 @& I' x, Q! @6 x$ @. y
  33.      /* 初始化外设 */
    & P% M' }; i7 ?3 T6 Z
  34.      bsp_Init();
    + q7 d. }2 O4 a1 t* y9 B
  35.    
    5 h" r8 A' X; a4 j! T5 ?- a
  36.      /* 创建启动任务 */
    0 u. V: W; f3 ~' F2 [1 K# V
  37.      os_sys_init_user (AppTaskStart,             /* 任务函数 */) u+ p! l' k- k. [; N1 v) ]3 O8 G) G
  38.                        2,                        /* 任务优先级 */
    4 B6 m! ^& L2 D* o
  39.                        &AppTaskStartStk,         /* 任务栈 */
    : T1 ^( g% u) m( O
  40.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */5 l$ c$ J4 u2 `. e
  41.      while(1);
    6 p4 J, ~# H/ ]# q
  42. }. @( M, z, |& ]; H2 N" b0 M! a

  43. 4 n" v) M! z( K
  44. /*" d: s% T9 d9 P, L3 l" j1 K
  45. *********************************************************************************************************
    * s+ Z: d1 m$ j  q! W' y3 h2 v1 F
  46. *    函 数 名: AppTaskLED/ M- A7 {' j5 H8 u2 l
  47. *    功能说明: LED闪烁
    , b; L/ N7 N* O$ Z4 I
  48. *    形    参: 无
    ( c+ _4 V! j( N
  49. *    返 回 值: 无
    $ }: Z* Q/ ]. f+ o# m8 d, G6 A, B
  50. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反). r) J& [. ^7 p- H# x( l: ^
  51. *********************************************************************************************************7 e. y! z) k, V9 y4 T% w$ h
  52. */4 |; i, @. r6 R
  53. __task void AppTaskLED(void)  b5 {8 q6 p; O( H+ Z
  54. {9 }- J* ~  @8 e" v" P7 l/ `
  55.     while(1)
    ; K% a, B7 q' j  K) s' w# J
  56.     {: o* G9 M( n$ q: q1 l; U
  57.          bsp_LedToggle(2);
    6 s1 ]: g. o5 x- |" T- p2 X& D
  58.          bsp_LedToggle(3);
    ; Y$ ~7 [3 Z) R8 X  X( T
  59.          os_dly_wait(200);, h( C/ d/ a# w. X  F4 b# C
  60.     }, N; ^4 A% b$ E4 j- H5 Q3 r
  61. }
    ( }6 s  b! q6 y) p! T, Z
  62. : L9 j9 e$ C- y" z
  63. /*0 L5 G; q- ?# f
  64. *********************************************************************************************************
    " y! D4 z' D9 m2 w. z
  65. *    函 数 名: AppTaskStart# u( r, V& x1 R" g
  66. *    功能说明: 启动任务,也就是最高优先级任务。
    / s: v6 X/ h0 s$ }5 x) A/ B" E
  67. *    形    参: 无6 i  b2 E: v& X! C
  68. *    返 回 值: 无
    / y, N1 k- Y: O/ R6 V
  69. *    优 先 级: 2
    ' R9 u! }. T3 ~' N; B
  70. *********************************************************************************************************8 {/ i+ y7 |- X- j5 z7 A
  71. */
    9 P. z$ R7 a7 x, A! ^
  72. __task void AppTaskStart(void)
    5 V0 ~' R- V( v7 E- d/ ~# q
  73. {7 c6 }& [# L% k
  74.      AppTaskCreate();% [! a1 ?) j; K) v, A+ P1 G" C9 I1 A+ i
  75.       H2 X) p/ F2 t" {- Z% r
  76.     while(1)1 c; z3 k$ B; g! w# p- m. K
  77.     {" i6 C0 A0 l8 k$ F3 K! m
  78.          bsp_LedToggle(1);
    ) }6 T- @' k7 D1 q* }4 M
  79.          bsp_LedToggle(4);
    ( h( ^( `5 N, k# e3 K
  80.          os_dly_wait(500);
    9 X- x: c2 Q* R2 C; g7 K" O. B
  81.     }
    6 p/ g+ ~9 G  V
  82. }
    $ g3 L5 J) a  B# {) V- ?5 s
  83. & a$ |0 a# ^" d& J; F9 D
  84. /*
    % y0 g" g6 R- f# l8 {. T( s* A2 [
  85. *********************************************************************************************************
    . z3 Z2 E9 ~2 p- d
  86. *    函 数 名: AppTaskCreate9 G3 o4 N* J. _7 v$ g' A4 m7 S
  87. *    功能说明: 创建应用任务! n$ J/ O! Z, I8 Y% X, [$ E! B
  88. *    形    参: 无+ p' v. }& |2 s# l, t
  89. *    返 回 值: 无
    5 j: m- ^) L  X3 e/ Z
  90. *********************************************************************************************************$ x1 A* k8 J$ g! a' V3 C) D) s
  91. */# v8 m" |' X, z7 e2 \7 m
  92. static void AppTaskCreate (void)$ f/ z* [; Q* E
  93. {/ F* i: h8 }8 ?; x% B
  94.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */% @) g  R! j- Z. J3 L
  95.                                         1,                       /* 任务优先级 */
    $ T0 A7 `7 ^) l3 f9 A$ Y
  96.                                         &AppTaskLEDStk,          /* 任务栈 */
    : F$ d$ L6 R* o2 R+ u/ a( Y$ F
  97.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */" j: f6 L+ m' B/ h, a
  98. }
复制代码
按照第三章的3.4小节中介绍的调试方法,可以看到如下图6.4所示任务执行状态:
6.13.png
图6.4 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

' q% B6 Y, H9 O
baiyongbin2009 回答时间:2016-1-20 15:34:06
本帖最后由 baiyongbin2009 于 2016-1-20 15:35 编辑
  A/ _+ F" C, H' }1 ~+ G( u$ I+ u& {$ d
6.3 STM32F407源码方式移植RTX系统. A7 `6 \9 l7 T/ ~6 L. @
5 H% _% S8 |" o5 }7 V
6.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. /*
    & F' q5 e4 L! W/ r) |* U0 b5 m8 {
  2. *********************************************************************************************************' ^/ T! V" b8 T( r% [5 R2 A
  3. *1 n- u; T- P' F, |4 ~
  4. *    模块名称 : 头文件汇总0 O) \7 s( l' `
  5. *    文件名称 : includes.h$ {( ?) f1 e5 P: s/ L8 |* {: t1 V/ Z
  6. *    版    本 : V1.0- P9 G) |, Y% G& m1 |: d. }' `! n: P
  7. *    说    明 : 当前使用头文件汇总: _- `5 R4 C. z# G; k
  8. *
    ' F1 [# \- t" ^+ X
  9. *    修改记录 :
    ! E4 L! g7 O1 B5 z. q5 k+ m& _
  10. *        版本号    日期        作者     说明
    2 y% z) Q4 a& M. `% ]( `4 t
  11. *        V1.0    2015-08-02  Eric2013   首次发布
    . A2 f5 [4 K/ w0 k8 }
  12. *
    ' C5 y* Y. W* G8 y9 I  ^. B
  13. *    Copyright (C), 2015-2020, 安富莱电子 www.armfly.com
    + g& `- p7 W. l0 e5 O& L
  14. *
    ' Y/ U4 D9 x8 F' b& l7 m1 z
  15. *********************************************************************************************************
    # I' S3 e6 o# f3 E, i9 z
  16. */1 n  Y, {  Q* x4 C. W- {: c5 ]) x  C+ ^

  17. 2 o- }3 N( |; c: x
  18. #ifndef  __INCLUDES_H__6 D2 l1 _) S" L# o
  19. #define  __INCLUDES_H__) J8 Y2 Y2 o. {
  20. 8 ~( }- h* k2 r' g8 A6 \7 Z! C
  21. /*) [& n* G% g- q/ ~0 c
  22. *********************************************************************************************************
    - y" G3 M0 h: G9 d
  23. *                                         标准库
    0 {) V& I. J9 `- C- R8 }7 k, Y; _
  24. *********************************************************************************************************
    7 {( p* ~$ u+ K8 X: E
  25. */1 Y3 ~3 r: k0 I4 ^6 ?% W8 v7 u
  26. #include  <stdarg.h>
    9 w# Y$ b1 d6 n' u. V- n/ R" R
  27. #include  <stdio.h>; e: V3 z$ U9 p) K* q4 M
  28. #include  <stdlib.h>
    9 v! }* [* Y3 @& }6 U$ D
  29. #include  <math.h>7 i" h9 e% I% g

  30. ) r% c# T2 E0 x/ A( ~  Z5 m  a
  31. 0 Y2 B+ F9 b) {
  32. /*; R* S2 h  k9 ?% J$ t
  33. *********************************************************************************************************
    - g& H" G9 C% i. u1 k! I
  34. *                                         其它库2 U. ]9 K& H% p
  35. *********************************************************************************************************
    ; l6 q! ~2 ?* ^2 Q( \& y: X
  36. */
    7 n0 O( R8 G& o

  37. : W" W3 j0 O. D

  38. 0 E* C$ F& m6 a; ?) j3 y- s
  39. /*
    " g% F. x' I  D4 f# s$ m
  40. *********************************************************************************************************
    2 v7 c  |6 ~# M# k5 U
  41. *                                           OS
    % `: m7 ~' y/ Q4 N
  42. *********************************************************************************************************! E: R; s5 Z' N$ k1 X" C0 f
  43. */
    ( o8 }9 ]7 h" F. |$ w
  44. #include "RTL.h"( U% e9 W" g/ A3 |; o1 V
  45. % Y+ e& _" E/ h
  46. 9 ^" y/ }1 D) x5 a% V
  47. /*& `9 E: J) k4 D; T; [! U
  48. *********************************************************************************************************0 x) u6 ?, B1 ]: I* a0 @0 m
  49. *                                           宏定义
    6 s4 f9 |5 l0 _% S" |
  50. ********************************************************************************************************** k) ]" U$ U2 Q
  51. */
    0 O7 C2 W# f% H: b+ N: C) ~

  52. 8 a$ `! A% \+ Z
  53. 5 i6 j  W! U7 C" _

  54.   ~0 ]4 G  _$ B3 ?" [; `

  55. % S7 H3 r4 U6 P/ x/ o% i/ Z+ k
  56. /*
    . c, Y( x; f; q9 g  M
  57. *********************************************************************************************************- y% G& b# d$ Q' T4 W& n* ^- Z
  58. *                                        APP / BSP
    : }9 Y3 m/ b3 |4 U
  59. *********************************************************************************************************
    - L/ z, y1 E7 K
  60. */( t1 P! J- P/ M& ~$ A1 q

  61. / S3 l. O, U  e5 |
  62. #include  <bsp.h>' B" c3 l( M# v

  63. $ Z" i  G* i( y$ h1 K
  64. # o: _: a+ _% H
  65. #endif
    . j8 w! [; d8 z  s" L* r
  66. * Y' B0 Q: `/ J  t* T
  67. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
第5步:也是最后一步,添加相应的头文件路径:
在原来工程模板的基础上面新添加的两个路径:
6.23.png
至此,RTX的移植工作就完成了,剩下就是系统配置和应用了

4 d$ C4 _" q1 Q( o& n7 G$ t
! R! C, r8 Q+ h' Y7 W+ w
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 U7 [0 T7 x* S$ ^$ l0 G( i
$ q2 F0 u3 \- n) I  M7 \
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"            /* 底层硬件驱动 */
    . i4 h* `4 k  ^2 T4 `
  2. - K$ j6 R  B) T. W% Q- U  P) j
  3. /*; R, Z3 P- A9 i5 f3 |5 A
  4. **********************************************************************************************************7 ]% \" A$ i: f6 R& d' w: ]* J1 k
  5.                                                    函数声明
    & {1 f, @/ ^# O% N5 t; i; `% J
  6. **********************************************************************************************************" t4 f& X7 B( P5 w" }5 t" O
  7. */" o7 O9 j& B3 T" D
  8. static void AppTaskCreate (void);1 }" q( @; N: t6 t
  9. __task void AppTaskLED(void);  b: U7 l" a6 G/ Q) Y3 v" g) t: G
  10. __task void AppTaskStart(void);
    " A4 [+ o  ]7 E7 W

  11. ' M% ^. P  u8 Y
  12. /*8 }% H0 B, _! J$ a
  13. **********************************************************************************************************
    " Q3 B2 A$ `( w) W; |7 |  r
  14.                                                     变量" P& H, O& Z9 [5 V
  15. **********************************************************************************************************7 H; B% i: U2 v  Q9 @9 s; k! z
  16. */
    ( T$ N! J% P3 F2 o# c# {5 a' J( o% F+ [
  17. static uint64_t AppTaskLEDStk[256/8];     /* 任务栈 */. v. b  O% g/ I7 @5 z! t4 O
  18. static uint64_t AppTaskStartStk[512/8];   /* 任务栈 */
    # S4 i) v. J; `  t0 x1 L

  19.   L9 z) A+ q8 ?' j
  20. /* 任务句柄 */
    - o3 O& M1 C% w/ X/ N5 s
  21. OS_TID HandleTaskLED = NULL;
    + F; c7 F% i- H( c7 V. E# X
  22. + P9 O; G& P2 l: _$ R
  23. /*6 r2 s5 `( u/ c- N4 E
  24. *********************************************************************************************************/ R0 C0 g, x& I2 L4 {7 j
  25. *    函 数 名: main
    3 |' U' y# Z6 P/ A( F
  26. *    功能说明: 标准c程序入口。' \( G9 W! Y+ q& P* j
  27. *    形    参: 无- L# d6 H% S2 Q5 H( H
  28. *    返 回 值: 无
    3 _6 C& x; H7 C7 I) J2 M6 P
  29. *********************************************************************************************************
    & x1 K, N1 }7 r7 v9 V
  30. */2 |* N4 s- T: n  \! Z8 K
  31. int main (void)" ?) ?$ t* g. S& o% h2 A
  32. {   
    7 A$ l' [+ r' U; T: N
  33.      /* 初始化外设 */; K. ^8 o( J3 z# M( g# a7 j
  34.      bsp_Init();
    3 i  X& y- }7 M! D. M% V" e
  35.    
    / ^) I5 n" N8 o& ^5 b- I! m- @
  36.      /* 创建启动任务 */
    4 k. Q1 M& h+ M  B! ~# W- q+ @
  37.      os_sys_init_user (AppTaskStart,             /* 任务函数 */% o; H; A- o4 a% ~
  38.                        2,                        /* 任务优先级 */
    2 Y* G& r( \3 i" ]% \
  39.                        &AppTaskStartStk,         /* 任务栈 */
    6 i" L, K7 s. D
  40.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
    9 T% h. Y% s7 d# y9 i  @& B
  41.      while(1);8 ]+ h7 c# T' Z1 r/ p$ g# \
  42. }
    5 j" ]9 b, Y! z* O+ y) Z$ k

  43. 9 z. D! F. c4 v- L& i) j' V
  44. /*. y9 Z/ N3 L. D- G0 m* _9 V
  45. *********************************************************************************************************
    " D3 c1 E6 D" e7 F- e
  46. *    函 数 名: AppTaskLED
    0 K3 A: x6 J% S, J
  47. *    功能说明: LED闪烁
    / I5 b. ]* u$ Q* X  W2 P5 n
  48. *    形    参: 无. u7 R1 U9 s# G2 k) [) B9 b
  49. *    返 回 值: 无
    " H# U, p2 _& F/ ~( I
  50. *    优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    % V9 _+ t) C8 g
  51. *********************************************************************************************************
    & w4 _- ~2 J/ T! X% |. O( c
  52. */# f" n, C- t! v
  53. __task void AppTaskLED(void)) A6 q' M- O4 j( ?: [# r- K0 k
  54. {
    - d+ |( H  `, |0 t" U
  55.     while(1)$ S3 j* m# \8 E: [3 [5 I
  56.     {5 n! w  V6 l3 t2 Z' ~
  57.          bsp_LedToggle(2);
    ( G  s7 v2 }0 j( y, U
  58.          bsp_LedToggle(3);
    - ]+ ?: z+ @" e6 \- U, M8 B* j
  59.          os_dly_wait(200);
      C! H4 e! @1 V8 k' ~
  60.     }  |9 v$ \% x; \% y/ l; z8 N! F( B
  61. }2 {1 B& X$ ~, O% \
  62. ! W. `9 T$ v1 |/ p4 W, X# g! _7 b( h
  63. /*8 f, G6 O9 C* y+ V2 M
  64. *********************************************************************************************************
    5 J9 @3 |. J; I& b$ i# b
  65. *    函 数 名: AppTaskStart2 Z& e1 Q( i: g+ t7 I, w
  66. *    功能说明: 启动任务,也就是最高优先级任务。/ p, }" S/ c) E' f3 d$ F% W5 F
  67. *    形    参: 无
    , k, j1 [; _0 n- I7 A
  68. *    返 回 值: 无
    ; p$ I, f: K# r& \/ {% Q# d
  69. *    优 先 级: 2   l" ]) }* ?+ M" V' g- j' F
  70. *********************************************************************************************************% r- B: Z6 b7 E& D% E
  71. *// X: q4 F4 m; v$ ?; A0 A) H! Z
  72. __task void AppTaskStart(void)5 ~0 z' |* K1 M9 E; f: z' Q
  73. {
    4 z' q1 I; y# k6 l) U
  74.      AppTaskCreate();
    + L: C! L- Q$ o. \$ Y! a  {# A
  75.     0 M" [  W& K3 f: X) V) f9 @# G( K* B- @
  76.     while(1)0 g: o2 E7 K+ ?1 l) O
  77.     {& z% o/ w) v, l  M8 ^9 A2 `$ t
  78.          bsp_LedToggle(1);! e9 D: D# w5 L5 D( B7 G% m2 U$ f
  79.          bsp_LedToggle(4);( D- t5 t2 U' ~/ M
  80.          os_dly_wait(500);
    3 W! ^' ]4 `8 z# G9 y* B
  81.     }
    * h+ ?2 u. i* s8 {9 H9 Q, V3 M
  82. }/ S0 U2 z9 t9 l
  83. % b! C2 I- o  N$ \$ L, O% |+ L7 x
  84. /*
      u4 T  b8 J7 R+ c2 T. _% T
  85. *********************************************************************************************************
    3 _. p$ i1 C: h9 W! g
  86. *    函 数 名: AppTaskCreate& o: `# D2 u+ k% @
  87. *    功能说明: 创建应用任务
    - _5 |/ O: i( _: o& t, h; _# `
  88. *    形    参: 无2 B3 A% r) [6 K: [
  89. *    返 回 值: 无6 A1 u$ w* H. K7 Z% [! T+ R
  90. *********************************************************************************************************
    ( w5 o( q0 Z7 V2 K
  91. */
    ! [1 {1 ^8 ]: t5 D
  92. static void AppTaskCreate (void)# k  F  ]0 R' @
  93. {/ K0 }+ E! g* X0 Q  F
  94.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */9 Y1 G( {( z7 w" u0 N
  95.                                         1,                       /* 任务优先级 */
    ( {" q/ e4 p% s# @( E/ W
  96.                                         &AppTaskLEDStk,          /* 任务栈 */
    4 h) |- I$ v$ ]0 y, F
  97.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */' s$ T9 G, c5 ?
  98. }
复制代码
按照第三章的3.5小节中介绍的调试方法,可以看到如下图6.8所示任务执行状态:
6.26.png
图6.8 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

  ~  [5 b+ n4 t, f) Q# w/ E
7 s; D7 }. O# m2 k4 N6 a/ A
baiyongbin2009 回答时间:2016-1-20 15:45:47
6.4  总结
     本章节为大家讲解了RTX的源码移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。
4 v$ s- C6 r6 p
湉湉 回答时间:2016-1-24 17:32:52
   好东西 介绍了MDK的自带系统的移植 和 RTX代码的移植
watershade 回答时间:2016-2-17 14:35:32
本帖最后由 watershade 于 2016-2-17 14:49 编辑 % V7 z6 }* \0 O: @
. t) q& N+ `  U2 S% z
请问一下,两个任务优先级不同,那样优先级低的那个是不是压根就不运行?哦,搞明白了。我之前做实验的高优先级事件没有添加osDelay
: q- F* u7 [* o; R2 [3 x2 D/ s
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版