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

【经验分享】FreeRTOS创建和删除任务示例(静态方法)

[复制链接]
STMCU小助手 发布时间:2022-3-26 14:00
01. 概述
' e1 q) J% u" K) a6 dFreeRTOS中创建和删除任务API函数的应用。使用静态方法创建任务,任务的堆栈、任务控制块就需要有用户来指定。
1 {; D  a' k( A) m" Q$ r/ x- g# r: t" M2 T; @
02. 功能描述9 o' M; S7 n+ Y' \( s: `
设计三个任务:start_task、task1_task和task2_task,这三个任务的功能分别如下:' F* F* v+ X/ ^9 F/ H$ y# O7 _  l

0 p& H6 O+ f$ ~  g% lstart_task: 用来创建其它两个任务。
+ J0 P# O& p3 |. b
6 c* j; M" @/ a7 V  J  n; Jtask1_task: 当此任务运行5秒以后就会调用函数vTaskDelete()删除任务task2_task,该任务控制LED0的闪烁,并且周期性的输出信息到串口中。
! X; |, f  y* Z/ |
$ \5 y/ ]8 i. @4 N3 I3 ~6 Qtask2_task:普通的应用任务,此任务控制LED1的闪烁,并且周期性的输出信息到串口中。
0 s1 f" ~6 K1 c6 I( S. I
  c( a5 a0 q  o9 [# c+ F03. 任务设计
' u7 M& u9 i. w系统设置
& E6 k: ^1 h) K* _0 ^1 x

' X* ~& K) y, p- A' ?# c- W2 ~在FreeRTOSConfig.h文件中需要将宏configSUPPORT_STATIC_ALLOCATION设置为1.
+ |3 S8 z2 q2 h4 k* X4 x: J" d, x7 q% R* A
  1. #define configSUPPORT_STATIC_ALLOCATION 1 //静态内存
复制代码
$ A  e6 O  r' s5 \. Y4 w
编译报如下错误3 O- |0 h$ w$ f  z# z0 ^

/ Y6 ]5 A! [! v4 n, n2 { ]L770WQ6NJGA4QU~59]7%K0.png
5 L8 y5 V6 ~" H2 I4 {7 _$ H$ @4 S- z' n* D& u: K( ]/ D7 w7 d0 i. t
使用静态的方法创建任务我们需要自己实现函数vApplicationGetTimerTaskMemory()和函数vApplicationGetIdleTaskMemory()。
+ L4 r  ?* p6 z- W7 {; ^" c0 m6 I4 A* h2 W; g7 C- w
  1. //空闲任务任务堆栈
    8 s1 F/ A& P2 l9 o
  2. static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
    1 `9 i# G& o. `3 t
  3. //空闲任务控制块$ T1 S; A/ q5 t
  4. static StaticTask_t IdleTaskTCB;
    5 ~) }3 o  \3 n7 M

  5. + x# D& q# r* Y" o. i+ H! x% o1 r
  6. //定时器服务任务堆栈
    * {! B; H2 s! O, n
  7. static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];- x( Q" y8 H0 ^5 i& h. _
  8. //定时器服务任务控制块
    , l) E0 ?1 u! u# z
  9. static StaticTask_t TimerTaskTCB;* q6 A7 T0 ?' O
  10. : W2 X6 Y7 S) e6 A
  11. //ppxIdleTaskTCBBuffer:任务控制块内存6 a0 D& o* c' s( B6 }
  12. //ppxIdleTaskStackBuffer:任务堆栈内存2 x) V0 ?$ S, x' c% }) k* m& T: p
  13. //pulIdleTaskStackSize:任务堆栈大小! a) s8 ]' N; }* I4 c. |( n0 H
  14. void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
    ( g3 M! l) F- l3 L7 ^1 m2 p% l% ]
  15.                                                                    StackType_t **ppxIdleTaskStackBuffer, : [( o( i* D0 n
  16.                                                                    uint32_t *pulIdleTaskStackSize)
    . t+ v+ k% L1 R! z& q
  17. {
    / G/ N. W6 Z/ V3 R1 N& l
  18.         *ppxIdleTaskTCBBuffer=&IdleTaskTCB;
    2 p- a5 @  [  I: v8 U9 K
  19.         *ppxIdleTaskStackBuffer=IdleTaskStack;" \( N; W+ E! `) Y6 d* g
  20.         *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
    ' [, s5 [1 f+ x
  21. }! H( T3 q, j! e7 O
  22. ! v# R0 J6 U  Q9 U; k! d% J
  23. 7 l* y- N1 s" ?/ W& J$ @
  24. //获取定时器服务任务的任务堆栈和任务控制块内存, Z) K% ^4 i, B
  25. //ppxTimerTaskTCBBuffer:任务控制块内存5 y, v+ }. f& |8 y) H+ e. I
  26. //ppxTimerTaskStackBuffer:任务堆栈内存
    9 V1 z$ L4 @  f
  27. //pulTimerTaskStackSize:任务堆栈大小  q9 q- u4 ^; Q  q% p* I
  28. void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
    $ \* n( r; v$ l2 @. Q( B& R
  29.                                                                         StackType_t **ppxTimerTaskStackBuffer,
    ) l8 s2 t) D5 A2 l* s/ Z6 @# y
  30.                                                                         uint32_t *pulTimerTaskStackSize)
    $ g9 n/ C5 q+ Z+ Y2 N
  31. {
    ) Y0 E2 B. D: D3 Y; W; l7 E
  32.         *ppxTimerTaskTCBBuffer=&TimerTaskTCB;
    # }% X4 l& J- j- W) i
  33.         *ppxTimerTaskStackBuffer=TimerTaskStack;5 r% x1 @3 f& v9 f* g. u  x9 q
  34.         *pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;! `" @' i: D$ }8 g. y1 a" t/ p
  35. }# \! l7 R9 B7 _
复制代码
) c, Z# e* h  X1 ~
任务优先级,堆栈大小,任务句柄和任务函数
0 {1 T, F0 ]7 k% C: n, d
2 p, w3 t+ J3 C9 B; c1 \
  1. <blockquote>$ l) `2 V5 z- c; o$ |
复制代码

5 ]* y9 G( D8 [. J* |5 Hstart_task函数
  1. //开始任务任务函数3 {4 h. E  W( _1 v2 e4 P' ^
  2. void start_task(void *pvParameters)4 O) ~  A* u  F" k) v" }9 q
  3. {* K8 i! T& f: e" B6 S( [" q
  4.     taskENTER_CRITICAL();           //进入临界区9 j* P  i( C4 X1 f: D
  5.     //创建TASK1任务
    ( Z4 I$ N# W2 D8 H; p
  6.         Task1Task_Handler=xTaskCreateStatic((TaskFunction_t        )task1_task,                # G6 E: O1 ]6 q( {( b6 y0 \! b+ u
  7.                                                                                 (const char*         )"task1_task",               
    6 @6 {/ x1 r* ^) u7 Y
  8.                                                                                 (uint32_t                 )TASK1_STK_SIZE,        
    + ~- H. I: a6 ^7 L
  9.                                                                                 (void*                           )NULL,                                
    5 X1 e$ a1 f8 }* o3 N) s- n
  10.                                                                                 (UBaseType_t         )TASK1_TASK_PRIO,         
    $ E# q- Q* r* T, k3 d
  11.                                                                                 (StackType_t*   )Task1TaskStack,        " H) r( \3 I/ W8 o% e4 M4 F  t
  12.                                                                                 (StaticTask_t*  )&Task1TaskTCB);        
    ! {- Q  ?9 B4 b+ J' N: r
  13.     //创建TASK2任务
    / i$ G& q  y1 b  `2 _% o
  14.         Task2Task_Handler=xTaskCreateStatic((TaskFunction_t        )task2_task,               
    & h3 I# D: R, V! a& e' b4 V, w) }
  15.                                                                                 (const char*         )"task2_task",               
    6 c; F$ q/ V7 S
  16.                                                                                 (uint32_t                 )TASK2_STK_SIZE,        
    4 Y. l; f" j& `" ]$ O, A
  17.                                                                                 (void*                           )NULL,                                * e$ |- R1 M# T" e+ M+ u' t; N5 c
  18.                                                                                 (UBaseType_t         )TASK2_TASK_PRIO,         3 a! p9 f8 K3 B- f5 ~
  19.                                                                                 (StackType_t*   )Task2TaskStack,        
    * R$ ~- k& ^. w) b
  20.                                                                                 (StaticTask_t*  )&Task2TaskTCB);9 @& G0 S3 G! q8 H, u
  21.     vTaskDelete(StartTask_Handler); //删除开始任务
    2 ]" ?5 s  Y' g) t
  22.     taskEXIT_CRITICAL();            //退出临界区- F; P3 [8 N1 I6 j- b
  23. }
复制代码
9 D. ]: N' W2 p
task1_task函数* A% w+ O/ w  Q) l: Z. W
% A7 w$ A3 v# T2 W  u0 C2 q
  1. //任务13 ]( F' C. P0 z4 Z
  2. void task1_task(void *pvParameters)
    2 d/ D" t6 E, G2 M1 a
  3. {
    ' P9 w5 d) U" r4 t4 X' G* k; ?
  4.         u8 task1_num = 0;1 S: S( W* Z4 u' H. \* T/ n
  5.         
    % i7 k+ w" k# v+ n: T9 u
  6.         while(1)8 t( g3 B; v. Y: C4 x
  7.         {% a9 k, p1 T( Z( M- `
  8.                 task1_num++;, M2 o) k4 L) K) A2 B# X
  9.                 LED0 = !LED0;
    & M$ E1 Q/ m/ B0 J; j
  10.                 printf("任务1已经运行%d次\r\n", task1_num);
    2 R' ^' ]/ a" K; t
  11.         
    , R$ c: Q3 u% d6 t: t
  12.                 if (5 == task1_num). M( Z1 Z8 K# D3 D7 J2 x( S- c
  13.                 {
    % c0 G) ^# X' u9 U, }: _. {
  14.                         //任务1删除任务2
    % {7 Z6 }! @- n, p9 u4 X# Y& q
  15.                         vTaskDelete(Task2Task_Handler);0 T6 s- o7 c7 p- m8 P0 L, A
  16.                         printf("任务1删除了任务2\r\n");7 t  L- `* W7 Z+ t: _
  17.                 }8 t& j" u) U: R+ G4 ]
  18.                 ) K% _5 D* E  D" I: y  Z
  19.                 //延时1秒 1000个时钟节拍
    " |3 y: t+ `9 O( M% o; J: ]; o, _
  20.                 vTaskDelay(1000);
    8 p+ i8 P  U$ G
  21.         }
    $ e# g5 o7 ]" P# m/ g9 q+ V( \
  22. }
复制代码
# Z& e  q$ h6 K* J
task2_task函数
  u5 U- W6 s; ^0 e( T
" e2 C9 R& l% z$ ~% m1 `/ u
  1. //任务2
    + e- V- |% j2 D6 u% d0 M' I' O4 U
  2. void task2_task(void *pvParameters)
    + h3 h7 m- ]3 C( U* K1 U: L
  3. {. d3 r1 _" e- K
  4.         u8 task2_num = 0;
    0 q# L9 T( l6 h& O' I. L
  5.         9 i* m) U! t( G# _1 M
  6.         while(1)& o' g. z+ B- }7 {* s8 l" ^7 _) }
  7.         {
    " u  I0 f1 ?- Z6 v0 {
  8.                 task2_num++;$ j& V6 w$ o" f8 a6 s' z
  9.                 LED1 = !LED1;
    8 m! i  H4 {" l' k8 b8 O
  10.                 printf("任务2已经执行了%d次\r\n", task2_num);
    - ^2 W# }7 A, T0 {6 g
  11.                
    ) S! L, N2 m0 h$ T# d+ V; O
  12.                 //延时1秒 1000个时钟节拍
    # D3 y' {3 v* F; l* x. k& f
  13.                 vTaskDelay(1000);
    % Q4 n! ?  b5 F9 I" o5 @, E
  14.         }
    ( w4 d) O9 G, y& w
  15. }
复制代码

) T9 k: B! y9 m' U6 B' q7 A04. 程序设计
, W+ |% V( E/ r3 |2 |0 y5 p5 `main.c文件
- o! E& K$ N4 ^" O; d2 x" C9 ~* {$ G9 _- [! A2 p
  1. #include "sys.h"; H$ Q# T; g0 I
  2. #include "delay.h"  Y3 l5 W( J- m$ a& M
  3. #include "usart.h"
    7 c! I/ Q# i7 y/ F
  4. #include "led.h"
    , C% j' e* r7 ^- w' C
  5. #include "FreeRTOS.h"
    - }0 b6 p  d% z* @$ ~- t
  6. #include "task.h"0 e% w. d4 k% T0 z2 v

  7. ' G' O; y! e; A% o) b$ e( }6 m
  8. 7 X" o' P6 x! u6 _" y: x
  9. //空闲任务任务堆栈7 H2 Y3 ~# m& x
  10. static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];5 _8 |3 b  Q6 P
  11. //空闲任务控制块
    1 {6 \& w& G% {
  12. static StaticTask_t IdleTaskTCB;5 @4 I0 {9 _7 p/ a7 |
  13. 5 F. U# B! Z% q
  14. //定时器服务任务堆栈9 F5 M, _0 V8 k' `0 U5 z( G
  15. static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];2 }0 b( R' `/ x
  16. //定时器服务任务控制块1 A9 h9 v+ \; C' p; x  k
  17. static StaticTask_t TimerTaskTCB;
    1 x  V( G; z4 p4 t4 T  E4 i; r

  18. 3 z" x. W: Y5 m0 `3 u& s
  19. //任务优先级8 _& t: T+ Y: D5 a
  20. #define START_TASK_PRIO                1
    ( k' o! {6 s' N7 D# c! x" n
  21. //任务堆栈大小        ( K( a/ U0 O3 I% N) R+ v
  22. #define START_STK_SIZE                 128  3 w0 \, v, ^2 x0 A' z/ x. Y
  23. //任务堆栈
    ; M, r9 R+ U9 Y
  24. StackType_t StartTaskStack[START_STK_SIZE];
      h2 V& k9 R( f4 S, `5 _
  25. //任务控制块
    6 {+ d& m& D" Y8 H" Q7 L7 z
  26. StaticTask_t StartTaskTCB;, F, T( `8 q- u% i" y6 ?' z
  27. //任务句柄
    0 u+ S. P! E7 q; w- j1 |0 s& D
  28. TaskHandle_t StartTask_Handler;0 w5 N( Z) w3 N- B
  29. //任务函数5 ^2 T! `% y" h$ c. d/ ~/ p
  30. void start_task(void *pvParameters);
    6 o5 B1 W3 _; t, i  g2 u5 s5 {4 u
  31. $ [4 Z2 A& `! p  v2 d4 p: D
  32. //任务优先级7 a4 w6 c5 [2 K1 X  K
  33. #define TASK1_TASK_PRIO                2' {/ m7 n" P+ O6 X$ f; e3 l* J
  34. //任务堆栈大小        
    9 E- E5 c- O$ p2 H8 q* u
  35. #define TASK1_STK_SIZE                 50  
    # d& A0 n$ O, y6 `* j
  36. //任务堆栈
    7 C) r8 Z6 G& x8 f' v- d
  37. StackType_t Task1TaskStack[TASK1_STK_SIZE];
    + `) H4 d- D6 s+ F1 ?# i: Z; N
  38. //任务控制块
    + w/ U. m% r2 \- `) I, ?1 V: |
  39. StaticTask_t Task1TaskTCB;9 o4 d8 a7 G: p
  40. //任务句柄
    8 l% ^4 z" D4 P" y5 K3 s- p
  41. TaskHandle_t Task1Task_Handler;
    6 F2 `1 }; t: G, j: X$ s
  42. //任务函数! H' w8 g; Z* [
  43. void task1_task(void *pvParameters);$ B& W; X6 V% ~; T

  44. 6 m# ^9 }: |- c  G( d
  45. //任务优先级
      R: H0 @2 A' N9 G: T
  46. #define TASK2_TASK_PRIO                3
    / E& n& B' d4 a
  47. //任务堆栈大小        3 E' }! y! S" I6 y
  48. #define TASK2_STK_SIZE                 50  * q3 |- x# m; a! V# p" ?
  49. //任务堆栈) g; w. ]# p8 i/ ?4 `- q  m
  50. StackType_t Task2TaskStack[TASK2_STK_SIZE];5 ]* k% U* e9 T2 Q! C
  51. //任务控制块
    + \0 c/ `5 Z; _  n! b
  52. StaticTask_t Task2TaskTCB;
    4 A" R+ d& e1 w* K' F
  53. //任务句柄) ~  i8 ?. C& H- S3 `" P
  54. TaskHandle_t Task2Task_Handler;1 y! |, [- q4 \8 c9 B" E
  55. //任务函数: K9 C2 i, B/ H) K
  56. void task2_task(void *pvParameters);6 F1 F- R2 R* L% ~
  57. # }9 }3 [& r1 Z9 m% e

  58. $ B* v/ i7 C5 D7 ]3 n
  59. //ppxIdleTaskTCBBuffer:任务控制块内存" S7 \6 y; w5 \: H- t2 Z" v
  60. //ppxIdleTaskStackBuffer:任务堆栈内存8 P7 T: ]: V) A0 h
  61. //pulIdleTaskStackSize:任务堆栈大小
    1 n* W7 g" ]) a( [0 ]0 f3 @
  62. void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
    3 Z" X- f* V* Z( h) t; l
  63.                                                                    StackType_t **ppxIdleTaskStackBuffer, . ^9 x) K) e4 o
  64.                                                                    uint32_t *pulIdleTaskStackSize): ~+ |; G7 e% k- _
  65. {5 J9 {. v" s' V" `4 K. D" q" _) z
  66.         *ppxIdleTaskTCBBuffer=&IdleTaskTCB;
    4 M8 l5 `9 `# P0 r% Y& A# o! v
  67.         *ppxIdleTaskStackBuffer=IdleTaskStack;/ c$ n0 j1 t: T* q. }
  68.         *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
    4 d7 o" y8 R/ s/ Y: S  q
  69. }! T; x% A; P$ R" Y0 h

  70. . \$ j- K; Z7 {# ~3 m2 @6 O- [

  71. * ~. u6 i4 }, T% }3 w0 a
  72. //获取定时器服务任务的任务堆栈和任务控制块内存
    2 Y) A( @8 |& j) L# C2 Y2 M, l
  73. //ppxTimerTaskTCBBuffer:任务控制块内存
    % d) D9 U, N) M3 _; h7 L3 O  @5 z
  74. //ppxTimerTaskStackBuffer:任务堆栈内存
    * @. ~+ a: V. E' L5 B# Y) s. ^
  75. //pulTimerTaskStackSize:任务堆栈大小
    & u, k: a. p( ]& h2 [
  76. void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, ! i- `1 P6 o' w+ X
  77.                                                                         StackType_t **ppxTimerTaskStackBuffer, / d  }* ?" ]: T' P: P( l
  78.                                                                         uint32_t *pulTimerTaskStackSize)5 `$ M# x  H' |$ N# |" r& y
  79. {0 z0 N* j) ?- @4 d: I
  80.         *ppxTimerTaskTCBBuffer=&TimerTaskTCB;
    8 E# Y& k5 w( Y6 c0 [$ q8 ]
  81.         *ppxTimerTaskStackBuffer=TimerTaskStack;
    8 L) o/ N0 F0 S+ D
  82.         *pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;. G& b% `( ]! y# Z  o& d% U
  83. }
    $ D% M0 H# Z) d! Y6 Q
  84. . f$ K  l  Z# G' ~" ]' w
  85. //主函数
    1 L/ w+ r& q: n4 p
  86. int main(void)8 Z! S5 U: R/ y% a
  87. {
    ; s5 I) V8 s+ Z4 A0 O9 L8 \
  88.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组42 @' I5 r- j, C# v* h; U* H
  89.         delay_init(168);                //初始化延时函数& @$ E* ^0 m' @1 W" k4 F7 \# u, m
  90.         uart_init(115200);             //初始化串口
    * [( F0 F2 v% b
  91.         LED_Init();                        //初始化LED端口7 n+ Q7 X; ^: e. o2 U1 }
  92.         8 H9 m5 }% V0 V  b
  93.     //创建开始任务9 p1 i9 V8 ^( \! L2 Z7 e2 p2 w. C
  94.         StartTask_Handler=xTaskCreateStatic((TaskFunction_t        )start_task,                //任务函数/ \4 C1 ?- h2 h5 w" I9 c$ ^3 P
  95.                                                                                 (const char*         )"start_task",                //任务名称
    + \8 X8 P/ s+ x  W/ l. Z
  96.                                                                                 (uint32_t                 )START_STK_SIZE,        //任务堆栈大小
    , Q  [7 s3 `3 [) l3 q1 s% E
  97.                                                                                 (void*                           )NULL,                                //传递给任务函数的参数
    " m. v( V: J2 v. V7 ^4 n
  98.                                                                                 (UBaseType_t         )START_TASK_PRIO,         //任务优先级2 _1 b' G5 y( C9 @
  99.                                                                                 (StackType_t*   )StartTaskStack,        //任务堆栈
    2 }, A8 ^0 h4 r/ T2 ^: A8 w8 d' o
  100.                                                                                 (StaticTask_t*  )&StartTaskTCB);        //任务控制块   
    * b/ a. j; m: g$ \/ ]/ B6 e

  101. 0 Y0 }5 I- p" ?& A8 u
  102.     vTaskStartScheduler();          //开启任务调度; y+ l' e1 E8 N3 k; {$ H' {
  103. }
    0 i3 ^% ]; k. F
  104. # O( ^$ Q- M3 \
  105. //开始任务任务函数
    + S  }7 _/ Q5 C: }4 f1 @0 c
  106. void start_task(void *pvParameters)
      ^* n+ h" b# \0 E+ F
  107. {
    4 p5 s5 Q5 }$ ~) I9 Q6 G! G" u
  108.     taskENTER_CRITICAL();           //进入临界区5 ]7 Z! \  N7 d. j
  109.     //创建TASK1任务% P0 B2 @8 b, @5 A
  110.         Task1Task_Handler=xTaskCreateStatic((TaskFunction_t        )task1_task,               
    - }& l- b: _4 O7 E2 p9 L
  111.                                                                                 (const char*         )"task1_task",               
    4 \7 M5 D. {4 R7 b7 J
  112.                                                                                 (uint32_t                 )TASK1_STK_SIZE,        , }" H& C& G" @( ]9 n
  113.                                                                                 (void*                           )NULL,                                
    ) r5 ~& _& m. q, ~; t5 T
  114.                                                                                 (UBaseType_t         )TASK1_TASK_PRIO,         
    ' g5 {! }" k2 j( z0 N4 a4 a
  115.                                                                                 (StackType_t*   )Task1TaskStack,        
    - y5 h' p- {- T8 D3 y
  116.                                                                                 (StaticTask_t*  )&Task1TaskTCB);        
    2 N4 T# @* A; n" r' ]3 y3 H7 B6 y
  117.     //创建TASK2任务
    3 D0 I# P( ^, K" s! _
  118.         Task2Task_Handler=xTaskCreateStatic((TaskFunction_t        )task2_task,                , W7 }) Y4 ~' j) t/ l
  119.                                                                                 (const char*         )"task2_task",                ; l& L8 v$ y8 V( U! i+ R9 s. L
  120.                                                                                 (uint32_t                 )TASK2_STK_SIZE,        7 c9 R. W' [$ v* f) x
  121.                                                                                 (void*                           )NULL,                                
    * v; f4 l; E/ B8 T" h& ]$ K
  122.                                                                                 (UBaseType_t         )TASK2_TASK_PRIO,         
    - r" `/ S: {3 E$ [" c
  123.                                                                                 (StackType_t*   )Task2TaskStack,        4 r; S) `- w, Y% f8 h
  124.                                                                                 (StaticTask_t*  )&Task2TaskTCB);; E8 @, A, L6 Z7 T2 p, r* C' u
  125.     vTaskDelete(StartTask_Handler); //删除开始任务( C/ X( `: U2 {
  126.     taskEXIT_CRITICAL();            //退出临界区
    7 w! W; Y3 ^9 h9 D$ h5 |
  127. }4 w* u2 X" G: d" o$ V+ O

  128. ; d( u4 Y: d2 U
  129. //任务10 |- l  G: M2 f( \5 ]" p
  130. void task1_task(void *pvParameters)2 b- y2 k% L7 E7 k
  131. {7 M* K$ k" u+ g+ f
  132.         u8 task1_num = 0;( C- W! u8 P/ ]3 P, v# f- k
  133.         
    - H( O# M  e% S! N2 r8 W  i3 R, U
  134.         while(1)
    0 @: b0 u/ h6 R) ^
  135.         {1 d9 f8 r% k  {! L1 T
  136.                 task1_num++;
    1 @% f/ Z6 v& C3 V
  137.                 LED0 = !LED0;
    " w8 F2 i0 t! l+ b$ p. L8 R6 J
  138.                 printf("任务1已经运行%d次\r\n", task1_num);( E+ ^* ~$ ~* v  }% z  \' w( W
  139.         
    ) m/ Z- y5 N  v
  140.                 if (5 == task1_num)
    2 w9 z6 v( b3 f) ]
  141.                 {, z, f% T4 V  J+ O6 I3 l% g1 {' [
  142.                         //任务1删除任务20 S# C" ]8 S. Z
  143.                         vTaskDelete(Task2Task_Handler);
    ( B) m' P- ^" S; a  s# R- x
  144.                         printf("任务1删除了任务2\r\n");. u% M2 K' Z) O% Q+ o% _
  145.                 }
    0 w' w% _) O4 H$ r; n4 C
  146.                 : }1 Y8 S8 u$ J; U; a# [
  147.                 //延时1秒 1000个时钟节拍
    2 N2 ~! v. s" K) K' v
  148.                 vTaskDelay(1000);
    0 z( c* x+ _; q/ n1 U( W/ F0 \8 U$ Y
  149.         }  G% a7 N" ^+ D( A4 ~7 `
  150. }9 g2 k$ s  o( Y  J0 l1 q

  151. * Z- K. |) e! t  [! g* T: c
  152. //任务27 @9 c: k& g+ V
  153. void task2_task(void *pvParameters)
    / ]( V5 a+ `/ N& j8 |
  154. {
    5 A: X, F( r& n
  155.         u8 task2_num = 0;) ^3 D& p6 d0 W
  156.         7 K/ f& |# \  L. g" K5 i5 c
  157.         while(1)
    4 Z6 b* H# t* Q+ V5 E
  158.         {
    0 `5 ]: B+ Y; N
  159.                 task2_num++;
    6 t$ V' b1 w  ]! i
  160.                 LED1 = !LED1;
    5 j6 X: I. m4 c: \' @) R
  161.                 printf("任务2已经执行了%d次\r\n", task2_num);- j; }' G8 K9 V" {
  162.                 # M3 w9 {3 |# B$ M! [8 b
  163.                 //延时1秒 1000个时钟节拍
    & Q* `  a* R# [4 `- A" h
  164.                 vTaskDelay(1000);5 W+ z" s: L( f$ J& `
  165.         }
    & T4 F! ^9 \; a' \) Z* d- Z
  166. }
    + Y# z3 T8 i- q
复制代码
- i: ?* I( D3 m2 c5 [7 |# {
05. 结果验证8 w$ O, W: ~% U% Y4 k
任务1运行5秒中之后删除了任务2,任务2被删除之后就不会被运行。最后只剩下任务1运行了。
- \' t+ }. D% W, W2 z+ e) x. p
  y6 ?7 e, |& Q" Y* s' e' b  f! a' l: }0 H
赞 收藏 评论0 发布时间:2022-3-26 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版