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

【安富莱】【RTX操作系统教程】第8章 任务优先级修改

[复制链接]
baiyongbin2009 发布时间:2016-1-22 15:57
第8章      任务优先级修改
    本章节主要为大家讲解RTX任务优先级设置的注意事项,任务优先级的分配方案及其相关的一个例子,内容相对比较简单。
    本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407。
8.1 任务优先级设置注意事项
8.2 任务优先级分配方案
8.3 任务优先级设置
8.4 实验例程说明
8.5         总结
8.1  任务优先级设置注意事项
    RTX操作系统任务优先级的设置要注意以下几个问题:
1.  设置任务的优先级时,数值越小优先级越低。
2.  最低任务优先级是0,此优先级被空闲任务使用,任何其它任务都不可以使用。
3.  用户可以设置的优先级范围是1-254,由于RTX支持时间片调度,所以也是支持用户任务设置为相同的优先级。
4.  优先级255被保留,用于最重要的任务。
9 u9 E; B: N: t5 i; ]5 Z
赞 收藏 评论6 发布时间:2016-1-22 15:57

举报

6个回答
baiyongbin2009 回答时间:2016-1-22 16:02:54
8.2  任务优先级分配方案
    对于初学者,有时候会纠结任务优先级设置为多少合适,因为任务优先级设置多少是没有标准的。对于这个问题,RTX有一个推荐的设置标准,任务优先级设置推荐方式如下图8.1所示:
                              
8.1.png
图8.1 任务优先级分配方案
IRQ任务:IRQ任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的。
高优先级后台任务:比如按键检测,触摸检测,USB消息处理,串口消息处理等,都可以归为这一类任务。
低优先级的时间片调度任务:比如emWin的界面显示,LED数码管的显示等不需要实时执行的都可以归为这一类任务。实际应用中用户不必拘泥于将这些任务都设置为优先级1的同优先级任务,可以设置多个优先级,只需注意这类任务不需要高实时性。
空闲任务:空闲任务是系统任务。
特别注意:IRQ任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数即可),只有这样高优先级任务才会释放CPU的使用权,从低优先级任务才有机会得到执行。
     这里的优先级分配方案是RTX操作系统推荐的一种方式,实际项目也可以不采用这种方法。调试出适合项目需求的才是最好的。
9 b! _# G* f8 f3 f# k( _7 A/ t
baiyongbin2009 回答时间:2016-1-22 16:10:33
8.3    任务优先级设置
    除了创建任务时可以设置任务优先级,也可以通过下面两个函数修改任务优先级:
关于这两个函数的讲解及其使用方法可以看教程第3章3.3小节里面说的参考资料rlarm.chm文件
8.2.png
                              
这里重点的说一下函数os_tsk_prio。
函数原型:
  1. OS_RESULT os_tsk_prio (( [% S8 A+ a: W# E; j
  2.     OS_TID task_id,       /* 任务ID */
    + S) p$ D- q: ]6 {! ^. E
  3.     U8     new_prio );    /* 新的任务优先级 (1-254) */
复制代码

, l3 _/ a' K. `, P: N
函数描述:
函数os_tsk_prio用于修改任务的优先级。
  (1)第1个参数填任务的ID。如果ID参数是0,那么设置就是当前任务的优先级。
(2)第2个参数修改任务的优先级,如果new_prio的数值比当前执行任务的优先级大,将触发一次任务切换,切换到任务ID为task_id的任务中。如果new_pro的数值比当前执行任务的优先级小,当前任务会继续执行。
(3)如果任务优先级修改成功,函数返回OS_R_OK,其余所有情况返回OS_R_NOK,比如所写的任务ID不存在或者任务还没有启动。
; h# S/ B0 e( u. H$ T1 j8 C0 }4 A5 K& x  Z
使用这个函数要注意以下几个问题
1.     参数new_prio的范围是1-254。
2.     被修改任务的新优先级会一直保持有效直到用户再次修改。
3.     优先级0用于空闲任务,如果用户将这个参数设置为0的话,RTX系统会将其更改为1。优先级255被保留用于最重要的任务。
4.    对于RTX操作系统来说,优先级参数中数值越小优先级越低,也就是说空闲任务的优先级是最低的,因为它的优先级数值是0
使用举例:
  1. /*' u/ }+ m- R$ P* j, ~, ]% @2 N
  2. **********************************************************************************************************) u6 m% A, {( J6 c' j3 g
  3.                                                     变量
    6 Y, q; i# c" D9 O) m' i
  4. **********************************************************************************************************
    ; d* \6 \: F. Z7 C
  5. */; t0 v) H. B4 M' P+ `! m6 ~
  6. static uint64_t AppTaskUserIFStk[512/8];  /* 任务栈 */7 G6 a* \& g0 i
  7. & P0 s: U) i4 r3 |( x. ]: y8 N, F
  8. /* 任务句柄 */
    % u( F; |+ ?. o. w
  9. OS_TID HandleTaskUserIF = NULL;
    . m+ I0 N+ ]; y( U3 N4 X" p! q
  10. /*
    ) x: }* d' E6 s0 m3 L; [$ m
  11. *********************************************************************************************************% }" {' p  `. i- a3 Z
  12. *    函 数 名: AppTaskChangePrio! m4 j9 Y, \4 D. @0 P
  13. *    功能说明: 修改任务优先级
    2 R, F8 ?& n$ o& x; N
  14. *    形    参: 无
    # L, D% I  S0 _" I1 z" P
  15. *    返 回 值: 无
    6 V. S* T5 \5 B
  16. *********************************************************************************************************
    # N* `  }$ D' F* W3 j4 U
  17. */
    6 t' G* i  Q& s* ]
  18. static void AppTaskDelete (void). I# m6 o: l, Y9 J0 A* `
  19. {/ _2 e- O( B6 q( z+ H( }4 p6 R
  20.      HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF,             /* 任务函数 */! q$ L! _1 N$ A. j0 b, z2 a; E
  21.                                            1,                         /* 任务优先级 */  V' [( j: Z  t* }- Y( v& f
  22.                                            &AppTaskUserIFStk,         /* 任务栈 */
    6 O9 }" I; j, W; ~7 q% Y/ q
  23.                                            sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */
    & S: }0 K) o( l5 g, X5 A. g

  24. ) C4 I/ h( @3 K9 d
  25.      if(os_tsk_prio(HandleTaskLED, 3) == OS_R_OK)
    4 f  m% G( z( w+ Q
  26.      {
    : K% B1 k8 A) n/ e5 u7 f9 _
  27.          printf("任务AppTaskLED优先级修改成功\r\n");/ i: `7 S. Q3 h' H
  28.      }
    - `% \! G. C) Q
  29.      else' ~3 E; X# O! `1 c6 R
  30.      {/ E$ M' \" ]) Y/ r2 t) U4 L6 B
  31.          printf("任务AppTaskLED优先级修改失败\r\n");                    
    $ ?. g3 Q9 B& y% w7 Q. d
  32.      }- x0 K( f& W# k! V3 r2 K
  33.     9 `! y0 N3 l) V- D9 Y$ h) Q5 _
  34. }
复制代码

$ J2 n3 {1 N9 v: m+ K0 N7 U6 b
6 ~7 w2 R6 b: f3 S$ d
baiyongbin2009 回答时间:2016-1-22 16:38:03
8.4  实验例程说明
# B- z, O6 t: s

/ N0 I" g9 F. \# @  N& q$ f+ w
8.4.1     STM32F103开发板实验
配套例子:
    V4-403_RTX实验_任务优先级修改
实验目的:
    1. 学习RTX的任务优先级修改。
实验内容:
    1. K1按键按下,串口打印。
    2. K2按键按下,将任务AppTaskLED的优先级由2修改为3。
    3. k3按键按下,将任务AppTaskLED的优先级由3修改为2。
    4. 各个任务实现的功能如下:
      AppTaskUserIF任务   :按键消息处理。
      AppTaskLED任务     :LED闪烁。
      AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
      AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。
RTX配置:
    RTX配置向导详情如下:
8.3.png
                              
Task Configuration
(1)Number of concurrent running tasks
    允许创建4个任务,实际创建了如下四个任务
                    AppTaskUserIF任务   :按键消息处理。
                    AppTaskLED任务     :LED闪烁。
                    AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
                    AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。
(2)Number of tasks with user-provided stack
    创建的4个任务都是采用自定义堆栈方式。
. I5 Z) I/ R4 {  B5 x" T# J
RTX任务调试信息:
8.4.png
程序设计:
任务栈大小分配:
    staticuint64_t AppTaskUserIFStk[512/8];   /* 任务栈 */
    staticuint64_t AppTaskLEDStk[256/8];      /* 任务栈 */
    staticuint64_t AppTaskMsgProStk[512/8];  /* 任务栈 */
    staticuint64_t AppTaskStartStk[512/8];     /* 任务栈 */
      将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。
系统栈大小分配:
8.5.png
RTX初始化:
  1. /*2 C  @& W$ P' A3 Z# Y
  2. *********************************************************************************************************
    4 n6 O* R1 f: M& p( N! M
  3. *    函 数 名: main
    . w* z( ^# e0 K
  4. *    功能说明: 标准c程序入口。
    ; R1 {$ c9 r+ p9 |9 @5 Z+ u
  5. *    形    参: 无  N& k- i8 ]* O! h1 h6 s" Z; w
  6. *    返 回 值: 无* p/ W, Y6 w6 Z0 h. E/ X% K3 \
  7. *********************************************************************************************************( ^% ^* [8 \, S0 ~9 D' z& n
  8. */
    7 x6 k; W2 L7 C$ q6 r8 i4 Y
  9. int main (void), w, D  H# y$ K0 P
  10. {   
    4 C0 S& U, L4 U8 [9 V! J
  11.      /* 初始化外设 */' V; T' v/ R- ]. z0 a2 v. P% h
  12.      bsp_Init();# g0 \6 K; j7 A
  13.    
    0 a! g8 \6 I; O
  14.      /* 创建启动任务 */1 c* `/ V$ Z$ x7 \7 ]: r) a# ?8 {
  15.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
    + M) e$ d- ^* Y2 r8 E
  16.                        4,                        /* 任务优先级 */
    . V! @5 @8 Z3 [
  17.                        &AppTaskStartStk,         /* 任务栈 */$ f  M( A2 S9 ]$ \8 ]3 h
  18.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
    " F# X3 ~& a( Z7 J: u; {5 c* S
  19.      while(1);; ]- {, @/ W& K7 V1 V
  20. }
复制代码

6 R# U/ o1 k% y4 g; M1 E  Y- c
RTX任务创建:
  1. /*
    $ T% ]1 s* y+ c2 G: w, B* c2 j: f
  2. *********************************************************************************************************
    & A9 b, V7 g1 u/ w
  3. *    函 数 名: AppTaskCreate2 E1 H! D: ?/ r8 h4 ]
  4. *    功能说明: 创建应用任务
    ( v0 B. b2 Z8 ?  V% H
  5. *    形    参: 无. @* M) a, ]6 z  Y4 E: G
  6. *    返 回 值: 无
    % N* F/ A# V) \% B- Z
  7. *********************************************************************************************************
      A7 c+ H8 o1 I
  8. */& Z2 i" h- P( k8 e3 I
  9. static void AppTaskCreate (void)
    + w6 Q7 ^, ~$ @) `2 C
  10. {" p+ ]" O. r8 T$ b/ r, ~
  11.      HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF,             /* 任务函数 */1 M3 N2 v+ E; ^9 o8 U
  12.                                            1,                         /* 任务优先级 */
    8 E  B- g, p; r  g; c2 C$ E" N
  13.                                            &AppTaskUserIFStk,         /* 任务栈 */% X  j0 L3 L0 b! _
  14.                                            sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */
    $ S8 V4 n' a4 f+ ^
  15.     8 E8 H5 ^1 Y4 ?0 ^7 Q# ^
  16.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
    ) h2 V; n; Q* f4 z
  17.                                         2,                       /* 任务优先级 */
    " i* F  i8 g1 \+ h6 V4 l6 a
  18.                                         &AppTaskLEDStk,          /* 任务栈 */
      ?3 o3 F7 q& Q. \
  19.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
    # |$ j4 j$ O$ n5 g# T9 h+ c
  20.    
    & X# G. j6 [. S+ W. B
  21.      HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro,             /* 任务函数 */5 ]8 N. e4 L- q; F9 y
  22.                                            3,                         /* 任务优先级 */
    2 ]/ T2 D- Y$ K
  23.                                            &AppTaskMsgProStk,         /* 任务栈 */, l; S7 @4 T0 F) e$ l" }% N' S6 }
  24.                                            sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */) f& w( i7 A. \% K- y# b
  25. }
复制代码
  R7 f/ P: e- s) f  Z7 m6 G2 ]4 K
四个RTX任务的实现:
  1. /*6 g& [+ @/ Q* h: y# x! f
  2. *********************************************************************************************************
    4 t" _4 V7 V* [4 s# w& ]
  3. *    函 数 名: AppTaskUserIF7 E; J$ c- j% h
  4. *    功能说明: 按键消息处理     
    & w# u  q! ^+ m- z4 U! b
  5. *    形    参: 无! _2 j" |' C8 Q3 t- V' m- g
  6. *    返 回 值: 无
    7 p" u% H9 h2 i" I  h
  7. *   优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
    " P7 e# N; ?1 E: }( ?- ~
  8. *********************************************************************************************************
    6 u$ R9 s" V( R% o" u7 B$ o
  9. */, c  E, w1 `5 N/ K6 S2 d+ d5 g
  10. __task void AppTaskUserIF(void)
    1 {  o) P5 o5 w
  11. {% e5 b0 t  t' W: f/ d6 }/ {
  12.      uint8_t ucKeyCode;
    + P8 K0 ]4 R  h( v
  13. + L# J- M( @. n: A9 b! V2 l' h5 |! b1 F
  14.     while(1)
    0 X+ s- ]: C1 M6 I
  15.     {
    4 Z' ?3 i: v! C4 {; y! p: |
  16.          ucKeyCode = bsp_GetKey();
    . d) ~: K. D6 f1 s/ L" m0 t
  17.         
    $ I7 a( A2 c" Q. {3 d
  18.          if (ucKeyCode != KEY_NONE)$ J, X9 z$ o) Q! s/ r' d
  19.          {% g0 z" G  ]& `/ ~" N
  20.               switch (ucKeyCode); J8 r7 [' b4 T$ {+ D. ^- }) `$ I
  21.               {" X7 J7 [5 G. K( P& @
  22.                    /* K1键按下,打印调试说明 */2 U# t* N) f+ ^8 w: a1 D
  23.                    case KEY_DOWN_K1: * _) \+ T# l" u! T: U8 e( t$ k
  24.                        printf("K1键按下,使用MDK中自带的RTX调试组件,请务必使用MDK4.74版本进行调试\r\n");
    7 A% R, g& y1 Z( T/ K; a
  25.                        break;$ V+ H# l- z1 S! |; o0 z
  26.                   # ?) G. n4 C! ^8 x
  27.                    /* K2键按下,修改任务AppTaskLED优先级 */+ |  U) _0 \+ x: \  B0 ]# }
  28.                    case KEY_DOWN_K2: 1 v4 R8 X. v. d3 R* f/ v3 N
  29.                        printf("K2键按下,将任务AppTaskLED的优先级由2修改为3\r\n");+ K& ?7 x# Q& D, V
  30.                        if(os_tsk_prio(HandleTaskLED, 3) == OS_R_OK)
    " h; B# o9 m! H
  31.                        {- k: Y. S1 h. @
  32.                             printf("任务AppTaskLED优先级修改成功\r\n");
    & q9 P3 T  q) W* Q7 \  E# @
  33.                        }
    / z) j& Y! T- c# ~
  34.                        else1 i0 h5 s7 v; b  R  ^
  35.                        {
    5 Q% ^" o+ n) T- z. J
  36.                             printf("任务AppTaskLED优先级修改失败\r\n");                    
    4 B5 x3 B/ Q, Z$ [' A/ l
  37.                        }
    7 i6 `; f/ w  c4 |. E  U" X
  38.                        break;  
    . u- g; p4 K; c  g2 B( {
  39. 8 e# v0 y- }$ M% Y2 |5 j6 X
  40.                   /* K3键按下,修改任务AppTaskLED优先级 */- z2 X& G8 E" o) |, b* L
  41.                    case KEY_DOWN_K3: # B* H9 R' ]' k4 B& e/ t
  42.                        printf("K3键按下,将任务AppTaskLED的优先级由3修改为2\r\n");
    & k/ e+ {) b- g0 K7 k1 L4 q
  43.                        if(os_tsk_prio(HandleTaskLED, 2) == OS_R_OK)
    3 H5 n3 G0 l! G9 l+ s
  44.                        {: y9 o0 ~9 f- ?# \8 \  R$ ^
  45.                             printf("任务AppTaskLED优先级修改成功\r\n");3 P5 \* M+ L1 _1 t* t3 Z
  46.                        }
    ! s" M% j# |& i7 L
  47.                        else
    ( ^0 a. ?2 U3 k) _( @" D& N) {# W
  48.                        {; Q* M, m  N* R7 m
  49.                             printf("任务AppTaskLED优先级修改失败\r\n");                    1 ?5 o! _- `" g, Q& f/ ~3 m* y) `
  50.                        }
    , |& M3 N8 [0 \: ?% ^
  51.                        break;                          
    ( O6 ]5 k* p6 A
  52.                   
    # C8 b3 ~- D; x4 q6 t# q$ d' `
  53.                   2 |, C" j8 X8 e* `% |
  54.                    /* 其他的键值不处理 */" o3 l! r# E/ S4 T# H) s
  55.                    default:                    : |5 H6 H8 ]0 e5 @' K) @3 [
  56.                        break;% u/ j0 ~7 Y6 Q# j+ q/ k
  57.               }% t  x% M6 q+ u  o5 v/ ?) i7 e$ x2 E) j
  58.          }
    , U7 Y6 `4 P! U; j4 a3 s
  59.         
    ( K! k- U4 C/ I7 W
  60.          os_dly_wait(20);7 ^( b% V: Y, c+ i7 p2 a
  61.      }
    , n1 s' x1 j2 F3 a
  62. }
    7 ^1 F9 d3 h( @0 _' B" ^
  63. 7 R* O% e! c& h, Z  K" w
  64. /*
    1 [% |. r0 ]8 k2 H& O( ^2 `, N
  65. *********************************************************************************************************+ u$ F- {% |$ j5 A4 ~& k* g& Y
  66. *    函 数 名: AppTaskLED/ P: `3 Z7 i% f! y3 q/ U
  67. *    功能说明: LED闪烁1 l" l* d; W6 g+ `
  68. *    形    参: 无2 a6 M" T. m$ s' l; s8 R
  69. *    返 回 值: 无
    ( Y8 `3 |0 {- L+ W3 |
  70. *   优 先 级: 2 7 _, L2 d; }9 Q/ j, [: J$ n
  71. *********************************************************************************************************$ W9 Z: Q2 f/ c; `' g3 Q( Q, {
  72. */0 y( Z6 M3 s1 k+ G+ z7 G
  73. __task void AppTaskLED(void)
    2 c7 F$ u/ N8 F
  74. {, M1 D8 V7 o; C  E1 t9 A
  75.     while(1)
      ~( _% j! Q$ r6 T0 M% J4 z
  76.     {. ~! K$ d4 ~1 d5 v: u$ J: `, ~
  77.          bsp_LedToggle(2);
    8 M9 j9 n: y; H
  78.          bsp_LedToggle(3);5 l% _  q3 r# k1 d' r
  79.         os_dly_wait(200);
    , {2 o/ O2 q, @1 V% Q+ d
  80.     }2 d7 r% s3 n3 d* `6 g* d
  81. }
    . p: s% ]. a. P$ k3 |
  82. 4 z! n, ~; I- D  S9 L7 o9 F
  83. /*2 n4 j) Y) d$ t
  84. *********************************************************************************************************3 {4 z0 t6 b0 ]) g0 {9 M1 A
  85. *    函 数 名: AppTaskMsgPro
    - R" w& X/ u1 N  r: L- m5 I+ A0 ?& P
  86. *    功能说明: 信息处理,这里是用作LED闪烁   
    + ]  l- s+ _3 b2 I; M
  87. *    形    参: 无
    ) }. j; ~- R7 ]* A9 q: k
  88. *    返 回 值: 无6 k3 M9 V: L( {: N" h2 ?  p( _
  89. *   优 先 级: 3
    # I! K, c; T1 q4 r5 F( M
  90. *********************************************************************************************************; m% L; Y6 @7 Q/ b" B+ L
  91. */+ R5 N+ l4 X+ @7 i5 i' S4 p
  92. __task void AppTaskMsgPro(void)
    9 @+ g' M% Z/ y9 i3 k: V4 W5 Q
  93. {# ]$ n; |" ?+ A  N1 r" \$ x5 B
  94.     while(1)
    ; B# {* L! {* S/ V; r- \0 G! q
  95.     {
    , x+ f$ h" A7 w
  96.          bsp_LedToggle(1);
    ' ~1 c9 R% I% r/ ?5 Y
  97.          bsp_LedToggle(4);
    ( S/ w$ m  l/ m2 C& c
  98.         os_dly_wait(300);
    8 x8 l& e$ h0 P& x4 T! V
  99.     }
    ; [; l6 B& |  \5 i
  100. }
    ) ~) b+ {/ g, p- }' F- M) x

  101. " |4 v7 n" a: X9 c6 D1 t
  102. /*
    / n( {( [3 z! s, I" ~
  103. *********************************************************************************************************
    4 E' \) m0 h3 [
  104. *    函 数 名: AppTaskStart$ d2 F: h1 r: L; P# B+ `
  105. *    功能说明: 启动任务,也就是最高优先级任务。& k2 y, t9 v5 I2 P9 f8 z2 V3 M
  106. *    形    参: 无
    9 d  e- T' ?% @$ [6 v2 h0 f
  107. *    返 回 值: 无9 r+ l  T" c1 ~* [! f
  108. *   优 先 级: 4
    : _( b( h% i/ \. Z8 F4 r
  109. *********************************************************************************************************$ [: N, J+ b+ r
  110. */, x5 L1 r8 H' \
  111. __task void AppTaskStart(void)3 Y4 R  D; R- T0 x" \& |/ w
  112. {
    8 c5 c' X3 O- k5 ]+ r9 Y* r
  113.      AppTaskCreate();3 @: \0 J' }* I( ?
  114.     ' |# `3 i( N4 }6 a6 K
  115.     while(1)
    " U6 S- j5 d, U5 E* c1 T
  116.     {
      o9 p& r) Y+ u# {0 Q5 @; A
  117.          /* 按键扫描 */+ U+ c6 T- d, L5 X8 X
  118.          bsp_KeyScan();
    6 x! b9 A7 X3 Y- H
  119.         os_dly_wait(10);# |0 ]/ F' C5 A# o3 \! E
  120.     }
    , M. o: ^* M8 P4 h! Q
  121. }
复制代码

) N' B# r. n5 r4 F/ o1 p
8 ]8 }; H' ?8 [, o4 u- s# c" H
8.4.2     STM32F407开发板实验
配套例子:
    V5-403_RTX实验_任务优先级修改
实验目的:
    1. 学习RTX的任务优先级修改。
实验内容:
    1. K1按键按下,串口打印。
    2. K2按键按下,将任务AppTaskLED的优先级由2修改为3。
    3. k3按键按下,将任务AppTaskLED的优先级由3修改为2。
    4. 各个任务实现的功能如下:
      AppTaskUserIF任务   :按键消息处理。
      AppTaskLED任务     :LED闪烁。
      AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
      AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。
RTX配置:
    RTX配置向导详情如下:
8.6.png
Task Configuration
(1)Number of concurrent running tasks
     允许创建4个任务,实际创建了如下四个任务
                     AppTaskUserIF任务   :按键消息处理。
                     AppTaskLED任务     :LED闪烁。
                     AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
                     AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。
(2)Number of tasks with user-provided stack
    创建的4个任务都是采用自定义堆栈方式。
( f/ z9 G( \! v
RTX任务调试信息:
8.7.png
程序设计:
任务栈大小分配:
     staticuint64_t AppTaskUserIFStk[512/8];   /* 任务栈 */
    staticuint64_t AppTaskLEDStk[256/8];      /* 任务栈 */
    staticuint64_t AppTaskMsgProStk[512/8];  /* 任务栈 */
    staticuint64_t AppTaskStartStk[512/8];     /* 任务栈 */
      将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。
系统栈大小分配:
8.8.png
RTX初始化:
  1. /*
    9 x- }/ Q0 Y2 B' n9 y4 p8 X( y. g
  2. *********************************************************************************************************
      M4 z# n6 `8 T, C$ p
  3. *    函 数 名: main
    & W' H, n( [. d( w" w2 A5 r
  4. *    功能说明: 标准c程序入口。
    * _+ X9 B5 Y  H: \
  5. *    形    参: 无
    4 b2 \9 \1 P1 y& t* u
  6. *    返 回 值: 无* t0 L/ U% W3 ^2 ~' a* i- v9 x3 E& x
  7. *********************************************************************************************************
    9 M0 E5 g- W& \" e9 k
  8. */
    5 F7 h- I$ ^/ U# p
  9. int main (void)
    # ~( F* X1 o) y
  10. {   
    8 o) `, r0 ]. C5 q1 A
  11.      /* 初始化外设 */& l  M% J# ?0 X1 ^5 J' l7 y
  12.      bsp_Init();
    $ H( a+ g. |+ ~, y
  13.     9 v* p- a8 _- m9 H$ k
  14.      /* 创建启动任务 */& S( T7 S# H$ U) h
  15.      os_sys_init_user (AppTaskStart,             /* 任务函数 */8 X! w& A6 }: v( {) u/ S
  16.                        4,                        /* 任务优先级 */0 e  ?6 }' m! r: K' u! S. @" s& ^6 t
  17.                        &AppTaskStartStk,         /* 任务栈 */0 k' ?; V" m3 L+ N
  18.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
    4 F, J: {) x) w; d+ {2 B( ~
  19.      while(1);5 B# W2 k: E$ S) P
  20. }
复制代码

! s" G8 l$ p; }: c
RTX任务创建:
  1. /*
    - a- P) r' ^5 z$ A7 n
  2. *********************************************************************************************************
    9 [; h/ Q  H5 m: G5 ~" F5 t. D" G0 V
  3. *    函 数 名: AppTaskCreate1 U4 n& U6 Z) H# ]/ q' l' W# |
  4. *    功能说明: 创建应用任务7 U. l3 g# q7 I* o1 G
  5. *    形    参: 无8 g% b4 J- H* q2 r
  6. *    返 回 值: 无
      X: C7 J& @& Y# }: G9 B
  7. *********************************************************************************************************  n  C% o  D  L/ a  k% C- l7 [
  8. */
    7 |+ x$ w0 P$ o7 ~$ ?6 w
  9. static void AppTaskCreate (void)
    0 ?7 o5 t5 k8 ]! v# R; @7 y4 H$ p
  10. {
    % ]4 W6 ]3 H- @2 t' |, ]6 Y
  11.      HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF,             /* 任务函数 */4 ^9 x7 w: H( F1 y5 k% C2 B, [
  12.                                            1,                         /* 任务优先级 */; D$ j% E. f; Q) y) c, ^
  13.                                            &AppTaskUserIFStk,         /* 任务栈 */
      p% d: U  r" }7 B3 N# ?2 B
  14.                                            sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */2 v, s* {. Z# X7 }2 v8 o' w
  15.     4 b7 u+ l! ^- D% O8 P
  16.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
    & ]% A) j- N; c4 W8 D. f( k0 d
  17.                                         2,                       /* 任务优先级 */
    1 x4 z# ]' r( T5 d, C$ }& z
  18.                                         &AppTaskLEDStk,          /* 任务栈 */. X  F0 \3 D* @$ l& j! N
  19.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */% U8 {* {* h' J1 w8 S
  20.     8 E2 X& p1 w2 G& U. ?: P, L7 [- {% b
  21.      HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro,             /* 任务函数 */
      m% I3 T. R, `8 s1 `& H: H$ y
  22.                                            3,                         /* 任务优先级 */" g# P3 |0 _) D; D
  23.                                            &AppTaskMsgProStk,         /* 任务栈 */
    ' w* t" A3 h6 r, v" n2 k2 l7 N# S& q
  24.                                            sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */9 _- o, r$ ^' O8 c4 C( E+ d* H
  25. }
复制代码
7 c9 V  d9 ~. g, Y$ C  ?

/ a, x; o' o; J+ i+ J7 l3 ^  T$ K2 L5 v0 ?0 m* n$ A2 u
% M; Q# A" n; k& |. L! `* B* o
baiyongbin2009 回答时间:2016-1-22 16:38:34
续8.4.2" M+ C% S0 K! `7 W

: e7 x! F. C1 u/ t' W' d
四个RTX任务的实现:
  1. /*4 T0 t1 i2 T% S
  2. *********************************************************************************************************) I4 G1 M' Z& P7 `
  3. * 函 数 名: AppTaskUserIF+ j: l3 b* `& U
  4. * 功能说明: 按键消息处理
    2 O& y9 \2 t9 J7 h3 d. }6 u4 i
  5. * 形 参: 无
      c7 H# l3 {3 ]5 E
  6. * 返 回 值: 无/ C" a7 Z+ \' }2 z! O2 N2 L- J1 k
  7. * 优 先 级: 1 (数值越小优先级越低,这个跟uCOS相反)
    0 X* C% `1 S# M, _/ t- e- S% A/ O
  8. *********************************************************************************************************3 t+ u+ h) _. J$ |
  9. *// c9 _% y/ K, O$ X6 n0 |+ ]& o5 j
  10. __task void AppTaskUserIF(void)
    4 N* O* Z, Q- P! D( p5 u
  11. {
      o. U3 F5 k5 O
  12. uint8_t ucKeyCode;( G# c+ u: G% z+ z

  13. % p/ m) p8 I3 |. N7 r
  14. while(1)
    / a( ^5 u* Y8 F: T' I9 Y2 w  T* _0 u
  15. {
    , N7 Q, T# r6 [. ~  L' M
  16. ucKeyCode = bsp_GetKey();
    1 g) |) r  X, h0 P
  17. 8 T) m- [: z, ?$ H
  18. if (ucKeyCode != KEY_NONE)
    2 v: ^0 K7 g( _- ?& ^' {
  19. {
    : y8 p. w4 M0 \9 c
  20. switch (ucKeyCode)
    : H  n' M9 r8 u3 e- l
  21. {  m- B+ B" q* P: G; n
  22. /* K1键按下,打印调试说明 */6 u# k2 u" b/ x2 \. @
  23. case KEY_DOWN_K1: ! T: R/ C5 d" S5 `3 n& l
  24. printf("K1键按下,使用MDK中自带的RTX调试组件,请务必使用MDK4.74版本进行调试\r\n");
    ! [( n. X4 ?+ q' M. F
  25. break;  z5 |( F  l! {& J. o% ]" H" G4 M

  26. ; I! j/ M: L: g, w$ P
  27. /* K2键按下,修改任务AppTaskLED优先级 */% h, }# b7 |" }
  28. case KEY_DOWN_K2: * ^% l9 t+ e2 k
  29. printf("K2键按下,将任务AppTaskLED的优先级由2修改为3\r\n");
    5 [4 q, O# z6 o$ k$ h  ^
  30. if(os_tsk_prio(HandleTaskLED, 3) == OS_R_OK)
    4 Y$ @! D" {/ _- N
  31. {" E1 N9 Q) U! n) V: F2 p! t6 c0 {
  32. printf("任务AppTaskLED优先级修改成功\r\n");
    , O! H* K! @7 N; E8 W
  33. }3 ?4 g! i. D! O
  34. else' ?! i! G* o. R1 D
  35. {4 v6 o8 _+ Z$ Z  s. w% O
  36. printf("任务AppTaskLED优先级修改失败\r\n");
    . `7 P' D. d2 T2 _" z3 ~+ H5 M
  37. }
    ' \5 G* @8 I7 o, O1 j2 l
  38. break;
    $ p9 q% {9 s& N) U2 R
  39. / H, ]& ^; F9 l# D7 X* F) Q& u
  40. /* K3键按下,修改任务AppTaskLED优先级 *// I' q$ b$ U% l) |' d. J
  41. case KEY_DOWN_K3:
    " J; N# [1 g+ o1 M, P1 a) w0 O  P% {8 L
  42. printf("K3键按下,将任务AppTaskLED的优先级由3修改为2\r\n");
    ! p/ M; g9 s, f1 i- m
  43. if(os_tsk_prio(HandleTaskLED, 2) == OS_R_OK)( I' k0 E% D2 ?4 M
  44. {
    6 v0 S: L; z, _7 Q8 h+ V$ L- R+ Z1 `
  45. printf("任务AppTaskLED优先级修改成功\r\n");
    ; ], ]* B' k5 j8 r- X
  46. }6 I; B* I9 C: Z
  47. else7 @" i1 U0 P: S# K8 u# [8 C! G- p
  48. {7 ?8 b' j* u7 [6 \( l9 ?2 V6 w/ e
  49. printf("任务AppTaskLED优先级修改失败\r\n"); ! Z: I# K) `" b
  50. }
    5 x$ V+ s& _+ K7 W0 \# u: I5 R
  51. break;
    + K9 Z1 _( A* M3 C& \9 ~

  52. ! w: V3 ^/ u* k: _3 i& O
  53.   x$ t1 i9 F# [! r1 Y
  54. /* 其他的键值不处理 */, c1 `: V  U6 r' L9 u! O
  55. default:
    " X; X* X$ @& O. ^* O4 }5 j9 ]
  56. break;
    3 S% ~& g- K. Y+ \) V4 N2 a
  57. }8 ?, e1 x; n" H. c) U8 A: [
  58. }
    2 B2 L% |8 y' T* Y8 t8 a

  59. 7 o& i5 t% G3 m
  60. os_dly_wait(20);
    7 P$ I4 r! ]! r/ F3 m& y
  61. }
    3 f- i5 r" I7 |$ J7 _' ?
  62. }6 U4 s$ R" Q" \) r) H. t- @

  63. . f8 _8 W% f1 W& z
  64. /*
    ) H/ Q+ h0 u/ w; e* P& M
  65. *********************************************************************************************************
    " K% k  [  |; v  C. r' ]2 T) B
  66. * 函 数 名: AppTaskLED
    ' @0 N9 S: {( |2 L" Q/ m! X
  67. * 功能说明: LED闪烁& B' k* V2 N* w0 _2 k. Q
  68. * 形 参: 无6 X: B" s# Q- \+ O4 w+ H
  69. * 返 回 值: 无; q! O6 E/ V# n) h1 |7 I; X, n/ O
  70. * 优 先 级: 2 & i, T+ d1 c7 w9 |) w! A2 }3 a* T
  71. *********************************************************************************************************( j* z9 z) B- i' Z
  72. */
    & O" j( G' C# T) o/ K
  73. __task void AppTaskLED(void)- R+ t* I5 }+ c1 K! `) u$ u# P
  74. {! v+ E7 C8 {' C) f% R
  75. while(1)# v: e# L; P  `, S
  76. {
    * }- b* ?7 ~/ r3 j5 Y! I( n
  77. bsp_LedToggle(2);! G& s' g& c& {1 y! r8 Y5 @
  78. bsp_LedToggle(3);% g, ^6 N. I1 a) O2 g( [4 D
  79. os_dly_wait(200);/ `( R4 t6 S4 L$ j* ~
  80. }
    ! j, q. u+ O7 ]+ W
  81. }) J8 v) V/ u1 Q/ k. O# L

  82. 6 f+ d- _1 F/ I; S3 W: [
  83. /*
    , ~3 U5 C, X& _7 h6 P* E. {
  84. *********************************************************************************************************
    8 F5 J% u/ `2 n. m/ @4 h6 Q
  85. * 函 数 名: AppTaskMsgPro5 h3 e# N+ h) R3 k" P" y# W( `
  86. * 功能说明: 信息处理,这里是用作LED闪烁
    9 r; R) G. X2 ?8 a) N, _
  87. * 形 参: 无1 d+ v8 u' a5 N- c7 h
  88. * 返 回 值: 无
    / l' w0 S+ @* Q' m2 h
  89. * 优 先 级: 3
    * h1 [, Q. b: d# s! U1 M' W
  90. *********************************************************************************************************/ T. `; k$ A+ j& q' u$ k8 a
  91. */
      C/ X0 {+ Q$ {0 Z
  92. __task void AppTaskMsgPro(void)6 ]7 X8 ]) F3 q/ S! j% l8 O
  93. {+ F, q; q+ M* o8 h2 u
  94. while(1)) W  i6 t' }2 s) }* }6 |) g9 s
  95. {
    / [$ n9 Q4 [( [$ ]
  96. bsp_LedToggle(1);
    ! j$ p% M7 o$ |# Q
  97. bsp_LedToggle(4);
    4 l8 N! a/ [8 ~* w
  98. os_dly_wait(300);; l6 W. K$ D1 Z( A+ M$ }: M
  99. }
    / X+ q3 F1 A" U- f9 D& }
  100. }2 {2 n1 R3 u& t2 x5 F5 E* ]
  101. $ s4 ~8 |; x+ [0 o4 x
  102. /*
      u7 P' X8 Q8 D4 v( y
  103. *********************************************************************************************************! y4 h- Z& e4 k- ]- d8 J
  104. * 函 数 名: AppTaskStart% y0 k" t) X! c: t
  105. * 功能说明: 启动任务,也就是最高优先级任务。
    1 t& g! `: Y' D, h8 H- i% ~
  106. * 形 参: 无% H3 g- Y' }, M4 m5 F  |
  107. * 返 回 值: 无; \" l0 t( {, o* f
  108. * 优 先 级: 4 % `" H  t; O. }3 i7 p4 F7 c& u  _
  109. *********************************************************************************************************
    % J3 M4 N* R9 X5 e1 e+ {, h6 j
  110. */: V. n3 N% m! @( r: _
  111. __task void AppTaskStart(void)
    & w: b8 Z# U% j  C, L
  112. {
    . P/ ^+ g5 e, L
  113. AppTaskCreate();4 c/ L2 C% e0 I: {* ]: y
  114. # g5 c+ W; u7 B
  115. while(1)
    $ I* J* F7 a- i8 Y
  116. {  O% H1 A# |) F* U
  117. /* 按键扫描 */
    + J9 l) {+ E, I; U; B/ l( k. H/ V
  118. bsp_KeyScan();
    % g% b) N8 s# Q/ a
  119. os_dly_wait(10);
    9 W; x7 W4 K# C, P, F
  120. }) f2 I8 U5 v; N7 d3 b
  121. }
复制代码

8 H( {. ?3 t" v# X8 N
baiyongbin2009 回答时间:2016-1-22 16:39:21
8.5  总结
    本章节内容相对比较容易,重点是学习任务优先级分配方案,随着后面的学习,初学者需要慢慢积累这方面的经验。
; F0 Q( k0 f; |3 o3 ^
电子技术2014 回答时间:2016-1-23 13:51:31
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版