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

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

[复制链接]
STMCU小助手 发布时间:2022-6-18 17:00
01. 概述
/ T6 q/ e9 |. B4 |# SFreeRTOS中创建和删除任务API函数的应用。使用静态方法创建任务,任务的堆栈、任务控制块就需要有用户来指定。
! k5 V, d/ H1 R3 z% \" G
3 V8 k* {) |8 A$ ]8 I3 B+ e02. 功能描述5 [6 m: r: {/ h( A: T. d$ m( P
设计三个任务:start_task、task1_task和task2_task,这三个任务的功能分别如下:
, z. K) `( O0 n  O4 S1 t
5 `# V" U+ `0 S$ U' sstart_task: 用来创建其它两个任务。
: _& a6 {1 ~  d4 l' w* u9 d) ~( Z. W
task1_task: 当此任务运行5秒以后就会调用函数vTaskDelete()删除任务task2_task,该任务控制LED0的闪烁,并且周期性的输出信息到串口中。
1 k. _$ e2 K# q. t
. g1 C' d% _) _' u% ktask2_task:普通的应用任务,此任务控制LED1的闪烁,并且周期性的输出信息到串口中。1 k# n$ N% B( L. H( M& y
1 @& X+ d8 v2 n( v
03. 任务设计$ L2 v( ^* q' z* M2 f9 P
系统设置
: n$ f( c, ^! }: F" J( w+ G: I
; |+ I( V9 U! c, k+ h在FreeRTOSConfig.h文件中需要将宏configSUPPORT_STATIC_ALLOCATION设置为1.* C$ [" E4 W% S$ r7 H  }

, L: L5 x3 X/ L
  1. #define configSUPPORT_STATIC_ALLOCATION 1 //静态内存
复制代码
7 c$ _2 Q- Q4 c
编译报如下错误) O8 i, g$ H# K- p
5 U3 H% B0 Q3 P+ S4 W
HI%IAR`~]R9$V39@2Z~WA%V.png
0 P  E9 L' }* O2 }& F) s. y# r# ?  r
8 q9 |. `5 a6 ]使用静态的方法创建任务我们需要自己实现函数vApplicationGetTimerTaskMemory()和函数vApplicationGetIdleTaskMemory()。, E" E% h( t& G! Z0 w" D% D

9 t& M* ^8 v& z: V7 X- a' U/ H0 `
  1. //空闲任务任务堆栈3 P; C* e' I8 M5 T; o: \
  2. static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
    ( Y- e4 W. H5 G9 F+ U( T& S
  3. //空闲任务控制块
    5 c+ X1 Q- P( r# w0 s
  4. static StaticTask_t IdleTaskTCB;* y9 R. i- Q3 }

  5. % [5 S$ R# f' O$ S+ G& b
  6. //定时器服务任务堆栈% p1 k' r4 a# C1 i
  7. static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
    * ?% w; t; c4 Y9 F' @; H7 S; q
  8. //定时器服务任务控制块( d6 Z! H1 Z" p& A
  9. static StaticTask_t TimerTaskTCB;7 F- p, x0 `; t3 @& u8 y9 H( H  q

  10. " f' j: n5 P# U+ \! S7 L
  11. //ppxIdleTaskTCBBuffer:任务控制块内存) s$ a2 h1 Q% g
  12. //ppxIdleTaskStackBuffer:任务堆栈内存+ k) \( Z0 ]9 F4 u2 r; [4 j0 G- ~
  13. //pulIdleTaskStackSize:任务堆栈大小  }, k' Q& G2 }+ F6 q/ ^% C
  14. void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
    $ ?5 V, w+ l6 ^, j1 z5 K/ O7 b
  15.                                                                    StackType_t **ppxIdleTaskStackBuffer, 4 b3 v1 o* z6 R! f7 {0 g- ]
  16.                                                                    uint32_t *pulIdleTaskStackSize)5 F& _! M8 \% ~1 H
  17. {& j( C! Y/ `3 b; Y7 |2 [% W3 j
  18.         *ppxIdleTaskTCBBuffer=&IdleTaskTCB;9 t4 L3 P2 y2 o! _/ `
  19.         *ppxIdleTaskStackBuffer=IdleTaskStack;8 z6 g0 N% o" g! j  n' ?, k
  20.         *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
    " M/ u: b" Y0 U9 D9 P% y: [
  21. }1 M) v+ u; j- J, h- k& ]9 x

  22. ( R- K- |% c# ^( N1 p7 O) T

  23. # T+ f  C9 [/ S& R, z1 B
  24. //获取定时器服务任务的任务堆栈和任务控制块内存
    3 g; L( g* j8 L. P$ x
  25. //ppxTimerTaskTCBBuffer:任务控制块内存) W2 _( }  Q; D" J1 v( W: z  g
  26. //ppxTimerTaskStackBuffer:任务堆栈内存+ X% t$ [* l8 ]; j4 a2 L) w0 Y
  27. //pulTimerTaskStackSize:任务堆栈大小, [5 P8 _+ e3 j+ r/ h
  28. void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, " x+ Q& h. e7 P# o( D
  29.                                                                         StackType_t **ppxTimerTaskStackBuffer,
    0 A9 {  ~6 S. ?/ p0 x2 Z2 b( _
  30.                                                                         uint32_t *pulTimerTaskStackSize)
      ?6 w6 \3 @! K, [% ]: J& L3 i  V
  31. {
    # a/ P" {& ^" X  |
  32.         *ppxTimerTaskTCBBuffer=&TimerTaskTCB;
    & p6 p" W1 m, U- ^5 U/ C2 Y
  33.         *ppxTimerTaskStackBuffer=TimerTaskStack;. h* Y- d( A$ i2 t* c
  34.         *pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
    8 @' u8 J4 C3 p% I, l$ N
  35. }
复制代码
: \( A: a4 G/ r
任务优先级,堆栈大小,任务句柄和任务函数
  w; G# n  \, l9 p; s* ^4 Y1 D4 f+ R8 }7 J8 D/ S* g8 Z" j) Y3 o1 K8 i, g8 f8 ^

  1. % O- B" T9 f7 _3 t: I
  2. //任务优先级% A8 p+ R5 Z- ]& {/ P- v: X
  3. #define START_TASK_PRIO                1/ c9 a/ @9 S9 a- E1 i# Z
  4. //任务堆栈大小        
    5 B* |! B0 k$ d$ T- c
  5. #define START_STK_SIZE                 128  6 x6 E2 t" u8 J+ M
  6. //任务堆栈
    . v7 L' h9 ~7 k. u+ R
  7. StackType_t StartTaskStack[START_STK_SIZE];
    ! A8 Q1 R1 i; _7 `9 y. V7 O
  8. //任务控制块
    4 `5 C& }1 U0 Q4 L' j* i% J. j0 _
  9. StaticTask_t StartTaskTCB;0 P$ i- {: A- ?# ?  S- P$ X
  10. //任务句柄* U3 @! `$ A1 J2 y- b
  11. TaskHandle_t StartTask_Handler;3 j3 L( B' j8 o: v8 U
  12. //任务函数
    7 @2 ]6 O8 M; l" v( R8 h
  13. void start_task(void *pvParameters);
    9 d2 u3 E" P7 x. r0 j* T
  14. 3 h3 `. v8 ]( d, R$ v+ D$ @/ C
  15. //任务优先级6 A* K+ ^( @! `. y  a5 f; J
  16. #define TASK1_TASK_PRIO                2' m6 |& G/ i; I) S: Q
  17. //任务堆栈大小        
    1 ?% o* Q# c' E/ {+ O+ h' y7 P2 d- c
  18. #define TASK1_STK_SIZE                 50  
    9 v0 H* E) B9 a. H; x3 E
  19. //任务堆栈; B! D- z- C: x( A! y
  20. StackType_t Task1TaskStack[TASK1_STK_SIZE];
    5 o7 P7 d  e& H) ~$ r' T
  21. //任务控制块. M$ t* D' I$ @" j5 N) |3 W
  22. StaticTask_t Task1TaskTCB;
    $ Q) I) w5 c9 F; K
  23. //任务句柄
    0 m+ }& t, F/ m! c, B
  24. TaskHandle_t Task1Task_Handler;
    0 N8 A; J# O. o1 N) N0 z7 W. n
  25. //任务函数( c7 `. U# K5 _: q0 f, |
  26. void task1_task(void *pvParameters);9 t% Z7 w( p* s& b' y3 q/ Y- ~* G

  27. ! r. y* o: b% s6 B
  28. //任务优先级
    . f4 g- c6 K" T& c: V  R( G# F/ ^
  29. #define TASK2_TASK_PRIO                3% u: K5 O3 Y2 H# ?& y4 H3 e
  30. //任务堆栈大小        
    ; P4 f7 P8 s" w. x1 E/ n$ f
  31. #define TASK2_STK_SIZE                 50  
    3 q6 R# l; w+ Y5 x4 i. e
  32. //任务堆栈
    6 J7 p+ y$ A) k( T
  33. StackType_t Task2TaskStack[TASK2_STK_SIZE];) o7 o3 `: Z5 d+ L
  34. //任务控制块3 K' ]$ J) R! r; p* \8 [, H5 }
  35. StaticTask_t Task2TaskTCB;5 T9 i. y& S0 C1 M2 Y( s, m
  36. //任务句柄
    - I7 T+ |1 J* H
  37. TaskHandle_t Task2Task_Handler;) g* L2 g# N4 s. s+ S/ Z0 N! H
  38. //任务函数2 {/ T# v& L3 @% w3 o) i% ]
  39. void task2_task(void *pvParameters);
复制代码

' h" ?: L2 ~% Z( w  [7 _6 r, Tstart_task函数5 _* E) A& o2 j! ^" o

7 _8 L2 E  b& O; L6 I: X
  1. //开始任务任务函数
    " D, n) s- W2 z' o! |
  2. void start_task(void *pvParameters)7 \  g- B8 G, K9 z2 M: _( {
  3. {4 v2 Z9 I$ c! I; t
  4.     taskENTER_CRITICAL();           //进入临界区
    : r3 ^: g: t) A, t; J4 }; s; D
  5.     //创建TASK1任务
    ( O7 B) w/ s; z( B3 @
  6.         Task1Task_Handler=xTaskCreateStatic((TaskFunction_t        )task1_task,               
    0 }4 F8 d: ~; n( y& v: r! M
  7.                                                                                 (const char*         )"task1_task",               
    6 Z) L3 \. l3 ?
  8.                                                                                 (uint32_t                 )TASK1_STK_SIZE,        
    9 b) p0 r% F# ^
  9.                                                                                 (void*                           )NULL,                                8 G& q8 L9 N/ H. X% g/ z
  10.                                                                                 (UBaseType_t         )TASK1_TASK_PRIO,         
    ! E$ f" a  x" p9 y  Q$ a
  11.                                                                                 (StackType_t*   )Task1TaskStack,        ! @6 p; |  p2 x$ c4 }2 p
  12.                                                                                 (StaticTask_t*  )&Task1TaskTCB);        + Q! f# Q, ^& v
  13.     //创建TASK2任务
    * o0 |6 p4 j* ]' V1 A+ |/ A
  14.         Task2Task_Handler=xTaskCreateStatic((TaskFunction_t        )task2_task,               
      P+ Z8 A* x1 {1 k7 _) @
  15.                                                                                 (const char*         )"task2_task",                6 P/ f/ ~: r* c" J
  16.                                                                                 (uint32_t                 )TASK2_STK_SIZE,        
    . ~7 K2 B' Q/ H& i8 s- }( N- F; Q
  17.                                                                                 (void*                           )NULL,                                
    ) H1 Y1 A9 ~- p! f. K; Q4 c( V# N
  18.                                                                                 (UBaseType_t         )TASK2_TASK_PRIO,         
    4 R% e' T. J( n) P% h
  19.                                                                                 (StackType_t*   )Task2TaskStack,        
    $ y9 y2 U  d* I9 @$ l/ Z
  20.                                                                                 (StaticTask_t*  )&Task2TaskTCB);6 V8 e6 C5 {: y0 O" d: \- w+ q, w
  21.     vTaskDelete(StartTask_Handler); //删除开始任务
    ( t" B3 d% w7 e
  22.     taskEXIT_CRITICAL();            //退出临界区
    , ?, {/ M) e2 {  h6 g% r9 t: ^
  23. }
复制代码
0 W9 `; b2 `7 D2 }
task1_task函数
) v" L) d+ l0 t* D- ?3 y- g/ C& W; [' [/ k* a
  1. //任务1& M* X1 V7 ^$ J; h- A
  2. void task1_task(void *pvParameters)9 K6 u: N% z% j7 W' g" S
  3. {
    ! Z- O0 a# Y; X; L
  4.         u8 task1_num = 0;
    . @0 W  e( Q% d- ?" n
  5.         ' }6 z/ }5 J$ F( A3 i
  6.         while(1)
    8 l: T6 _' i" g  j% d
  7.         {2 n! m# l- G: `) c& E
  8.                 task1_num++;7 N/ h5 p+ v" I% j; P2 o5 w
  9.                 LED0 = !LED0;
    : W  ~) z0 w" h0 F1 M9 ]7 m
  10.                 printf("任务1已经运行%d次\r\n", task1_num);) _( U! w6 D; G& f- \
  11.         
    + P/ g5 n% l  p) j. f, r* b
  12.                 if (5 == task1_num)
    2 Y" z1 r  ^  y, A$ \; S
  13.                 {
    % }+ y" B! A" D) I* Q- [
  14.                         //任务1删除任务2" J5 z+ V3 `8 F6 R2 o
  15.                         vTaskDelete(Task2Task_Handler);
    ) p- p- }% [8 I1 `3 A
  16.                         printf("任务1删除了任务2\r\n");
    8 ]- r( `* u6 K. f5 T
  17.                 }0 q8 |) w2 ~2 h: p1 K7 S: W
  18.                
    4 v$ X3 M5 l+ x) a$ U7 {$ t7 Q
  19.                 //延时1秒 1000个时钟节拍
    ! F) w, X9 `$ r; J) [4 b
  20.                 vTaskDelay(1000);. q. i4 s/ P  e$ x0 j1 m
  21.         }, V9 o* U7 _8 X
  22. }
复制代码

2 O) n- z$ t. F, C+ }/ \) ~. etask2_task函数9 x5 K% @" c6 p3 n2 l4 h- }. C

; U+ b( W: `/ U/ X; J; @
  1. //任务2
    5 E. T: ^+ K0 z  S
  2. void task2_task(void *pvParameters)
    " i$ ]5 u  H4 y8 o7 n3 V
  3. {
    ! t: d0 G7 l- L( k: E: k6 `. x
  4.         u8 task2_num = 0;
    # E* @/ t6 @2 l& ]! z: `% e
  5.         
    % N: O7 x& V- a5 q, y
  6.         while(1)
    & K7 |- @: S! M% }: ^- C2 V
  7.         {
    % R) {: d1 d' F: \) o
  8.                 task2_num++;
    " J) e' E. j- i8 D
  9.                 LED1 = !LED1;6 e/ M9 Y" Z/ x
  10.                 printf("任务2已经执行了%d次\r\n", task2_num);2 o9 i- G6 L" N- t3 i) n9 p  u2 l
  11.                 ! m4 k4 a+ Y3 W* E5 T
  12.                 //延时1秒 1000个时钟节拍
    0 N2 L9 i- p  e  M+ k+ g
  13.                 vTaskDelay(1000);/ J% z% A, M2 u/ d. T3 n; ]1 \8 W
  14.         }
    " V( L# E" i; P" A2 P. S$ z9 K
  15. }
复制代码
2 z1 H9 @& z) \& B; _# x! R( H
04. 程序设计
2 I; M7 M* x2 w4 {8 Emain.c文件! t# M0 H: {: ]  d) x4 r7 J

5 }3 d$ O8 Q  d8 U
  1. #include "sys.h"2 x; }4 C4 K9 a: b; i# s
  2. #include "delay.h"( E$ M! S$ W* m1 n
  3. #include "usart.h"" j1 T# C; `; _  W
  4. #include "led.h"
    * \) i8 e' c2 l9 u3 y& E  H
  5. #include "FreeRTOS.h"5 p* h; h  l/ [4 z% [6 @1 m8 ]
  6. #include "task.h"7 [, w2 Q- z# z* ]+ q& N- g( t  o
  7. " [4 R' o/ B1 |& `) i# Y$ u% p& g5 [' ?
  8. % k/ ^8 v4 c, q; Y) U: ^3 A
  9. //空闲任务任务堆栈
    $ g& f; |4 V; q! @/ c
  10. static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
    ( [( i+ [& o( W. x8 L
  11. //空闲任务控制块
    ' O4 \/ l. N( D$ a4 C3 @4 R  c
  12. static StaticTask_t IdleTaskTCB;5 f* u6 m2 k! K3 D, h4 W( Q
  13. 6 A( H/ _% x) f0 I
  14. //定时器服务任务堆栈' s  W7 Q9 n) t. Q
  15. static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
    8 ~  b0 g: c' v8 b7 }$ t# d/ x
  16. //定时器服务任务控制块
    & j/ E& j: y4 {; @& d( o
  17. static StaticTask_t TimerTaskTCB;3 [2 x! }, C4 h  Q# f' S* z

  18. 1 O6 C6 P1 @6 i+ f! k, ?
  19. //任务优先级
    $ L' v& g6 G- \
  20. #define START_TASK_PRIO                19 a6 E: f4 i0 K# o; P% m& `
  21. //任务堆栈大小        
    5 i( B7 w$ c! E/ J7 R
  22. #define START_STK_SIZE                 128  7 I+ h$ r$ y$ J4 w; ^/ c
  23. //任务堆栈1 z( i: t( C( L. z: @
  24. StackType_t StartTaskStack[START_STK_SIZE];6 S3 x1 P0 U* Y0 m  l3 P+ C
  25. //任务控制块
    9 g  ^* ?8 o8 U# {! e7 z9 O: Q) C9 ^
  26. StaticTask_t StartTaskTCB;  @6 H' {9 x" D6 j8 _
  27. //任务句柄
    8 U) W5 I# S% {' x" S& G
  28. TaskHandle_t StartTask_Handler;8 r% K& r( _, \. \: l9 c
  29. //任务函数$ r1 Q6 S# s$ m) B4 A
  30. void start_task(void *pvParameters);
    0 c, c: ?8 J; r. L" f
  31. 8 [  R2 f& [+ I- b, m) F2 f5 q
  32. //任务优先级
    0 r4 w0 A( p4 l" A9 i/ U" i
  33. #define TASK1_TASK_PRIO                2; _* R9 \8 ^9 w) ?1 V7 f
  34. //任务堆栈大小        
    ( o  l) e+ V! ^* F" E3 ]6 K0 _
  35. #define TASK1_STK_SIZE                 50  ; d3 s; Z; u3 x0 c6 V9 V7 }
  36. //任务堆栈
    / b" Z. w2 P. i. H5 [- Z! O
  37. StackType_t Task1TaskStack[TASK1_STK_SIZE];
    / r! L- S* O+ K2 `$ N% k+ A
  38. //任务控制块, e1 u8 E" ~/ M
  39. StaticTask_t Task1TaskTCB;
    ; F% r# T: @  f! C
  40. //任务句柄
    7 ?' q3 @) t% B( {, A& v' ?3 B
  41. TaskHandle_t Task1Task_Handler;  t  ^- i( W8 s- l, `: \
  42. //任务函数
      u" \  y6 J% k* E9 Q
  43. void task1_task(void *pvParameters);* I) F7 Y* _& l& ^3 M1 Y
  44. 4 m0 \# G6 U( j$ D
  45. //任务优先级
    ( f6 ]* W/ e2 L8 e4 L8 J  t) b
  46. #define TASK2_TASK_PRIO                3
    6 Z' C0 I$ F, A% [
  47. //任务堆栈大小          m& C* U, M# u) o/ X' U: a
  48. #define TASK2_STK_SIZE                 50  
    ) _  f0 }! B8 s8 }
  49. //任务堆栈
    " J/ L2 _2 n. g6 y6 }. M" g+ N6 c2 j8 [
  50. StackType_t Task2TaskStack[TASK2_STK_SIZE];% E' m# N6 J' i- s6 x9 s# K
  51. //任务控制块
    ' b$ W6 s$ u# s" G9 J- H$ S
  52. StaticTask_t Task2TaskTCB;
    6 V$ C1 ^) g1 A3 a* s
  53. //任务句柄* H- x5 Y$ p8 W# ^
  54. TaskHandle_t Task2Task_Handler;% s! p1 l* y! V: D8 b
  55. //任务函数
    5 C$ Q- @) I3 E
  56. void task2_task(void *pvParameters);& t& n! j) h; s3 [; A# u

  57. ( Y3 M3 [, H( s) j' \. A
  58. ' ?* F. w1 H; O* t2 Q) A
  59. //ppxIdleTaskTCBBuffer:任务控制块内存6 h+ u4 f- L6 R3 c' t* P% B  G
  60. //ppxIdleTaskStackBuffer:任务堆栈内存7 D7 {6 u1 D6 K  o7 x
  61. //pulIdleTaskStackSize:任务堆栈大小
    $ i3 f5 ?6 D: i2 R% K
  62. void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, : ~5 @* V/ r# o
  63.                                                                    StackType_t **ppxIdleTaskStackBuffer,
    7 [& _. R' y! w( X& b- o% d
  64.                                                                    uint32_t *pulIdleTaskStackSize)
    ; ~: ~- p( ?! m7 Q0 H% u) T
  65. {
    7 F' A0 K  [! V4 k
  66.         *ppxIdleTaskTCBBuffer=&IdleTaskTCB;
    , p% T/ A0 P( U0 ~
  67.         *ppxIdleTaskStackBuffer=IdleTaskStack;
    * ~3 }+ Q* [: _8 w2 W8 `( F
  68.         *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
    + n$ U  Q3 `& L( T
  69. }# P7 s2 A. _3 [+ b! i
  70. % ^' G* P$ i9 I+ a9 M
  71. % c5 T( g: C$ U( k- s" c" t
  72. //获取定时器服务任务的任务堆栈和任务控制块内存
    # R, Y1 `$ {( `; @
  73. //ppxTimerTaskTCBBuffer:任务控制块内存
    7 ~/ O, o; s* q
  74. //ppxTimerTaskStackBuffer:任务堆栈内存
    7 O# y+ i5 p7 E" e
  75. //pulTimerTaskStackSize:任务堆栈大小- u: m2 M2 x9 t, m9 @# N+ P
  76. void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 0 G# E7 C- x! n' ^7 b/ ~
  77.                                                                         StackType_t **ppxTimerTaskStackBuffer,
    . z' K* p. @* ~6 G1 K4 v
  78.                                                                         uint32_t *pulTimerTaskStackSize)
    . P8 p$ c& w- j
  79. {( `# u1 h$ \2 B% ]( \  W* k
  80.         *ppxTimerTaskTCBBuffer=&TimerTaskTCB;! @3 s+ }. l& L' C, Y+ S
  81.         *ppxTimerTaskStackBuffer=TimerTaskStack;
    ! Y$ H0 @% s. F8 l4 t+ G" D! {" t
  82.         *pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;. U' Z/ \: I( I' \1 r! X8 k& _0 T, W
  83. }
    7 g+ e% _8 i+ n
  84. 5 c  T0 V( W( f8 K1 W
  85. //主函数: r( g+ d/ h+ B3 ^
  86. int main(void): q" B% x7 \2 `3 D8 L& h' w
  87. { % |6 W/ d3 F( q6 A( a3 X; `
  88.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4; {. \2 Y2 }7 ~% h/ E) T3 v2 l
  89.         delay_init(168);                //初始化延时函数
    ; P0 N. u7 k8 o% M2 v3 C# Q- A- {
  90.         uart_init(115200);             //初始化串口
    " r5 X) g0 V0 z$ _5 g- k- |
  91.         LED_Init();                        //初始化LED端口( C3 r5 K& [; e3 ~
  92.         : ?' h3 h- K5 k0 d7 ?! _* r
  93.     //创建开始任务+ N8 E" R) G' q, \6 T
  94.         StartTask_Handler=xTaskCreateStatic((TaskFunction_t        )start_task,                //任务函数+ M$ w: e. B3 Q- u
  95.                                                                                 (const char*         )"start_task",                //任务名称+ b8 Z' M, J+ a: M! l6 x# Q
  96.                                                                                 (uint32_t                 )START_STK_SIZE,        //任务堆栈大小9 E- `: C2 D3 v: j: c! D9 f
  97.                                                                                 (void*                           )NULL,                                //传递给任务函数的参数
    5 U/ n- O0 _9 P( ?+ d9 b! l5 e. o7 B
  98.                                                                                 (UBaseType_t         )START_TASK_PRIO,         //任务优先级
    3 B/ N3 t" |" A3 F, N
  99.                                                                                 (StackType_t*   )StartTaskStack,        //任务堆栈
    4 H7 @8 R9 K* b
  100.                                                                                 (StaticTask_t*  )&StartTaskTCB);        //任务控制块   4 S% @1 H- w* r2 e# T- G& y* L, o2 J0 e
  101. ( Q( t# S: v& p# ~; p
  102.     vTaskStartScheduler();          //开启任务调度- Y9 L, g; E% `
  103. }0 R) O( d# q- B2 t
  104. : I7 Z& f1 y! V& h; C$ P. E
  105. //开始任务任务函数
    5 |# {0 m. K) e
  106. void start_task(void *pvParameters)* ~7 q* z- }- r" Q  }
  107. {
    + R' N* |7 v, B# [* w( M  P( h1 w
  108.     taskENTER_CRITICAL();           //进入临界区* E, ~- q9 J7 l% z1 y
  109.     //创建TASK1任务
    & u+ g5 T" _' N" V% j" |# P
  110.         Task1Task_Handler=xTaskCreateStatic((TaskFunction_t        )task1_task,                7 r7 d* a; z* N
  111.                                                                                 (const char*         )"task1_task",                6 m; K' K4 u3 v# s6 r9 k
  112.                                                                                 (uint32_t                 )TASK1_STK_SIZE,        
    $ n# X0 G6 Y) Q2 }7 Q
  113.                                                                                 (void*                           )NULL,                                  _& a' L* c% R$ ~3 M  j6 ], P
  114.                                                                                 (UBaseType_t         )TASK1_TASK_PRIO,         8 P1 z# T6 P: T2 n  @. j
  115.                                                                                 (StackType_t*   )Task1TaskStack,        , X% y1 x: _- |" e/ D; d$ k
  116.                                                                                 (StaticTask_t*  )&Task1TaskTCB);        
    7 t: O% P# i. k$ }+ B- f0 V
  117.     //创建TASK2任务
    5 I3 G& f5 Z1 x" R+ ?. Z
  118.         Task2Task_Handler=xTaskCreateStatic((TaskFunction_t        )task2_task,                ) {1 U1 z7 G+ {$ X0 @9 s
  119.                                                                                 (const char*         )"task2_task",               
    ; w/ \+ k2 L0 q+ {* i! a
  120.                                                                                 (uint32_t                 )TASK2_STK_SIZE,        2 _. S8 k8 O$ `! f9 r
  121.                                                                                 (void*                           )NULL,                                
    # H. b6 ]3 Z* K( C% C$ v
  122.                                                                                 (UBaseType_t         )TASK2_TASK_PRIO,         % J( G/ z: @2 e9 \+ I. {. n
  123.                                                                                 (StackType_t*   )Task2TaskStack,        % b4 t" M: J# N& _
  124.                                                                                 (StaticTask_t*  )&Task2TaskTCB);+ }6 x. g, u8 P+ T
  125.     vTaskDelete(StartTask_Handler); //删除开始任务
    : _8 O6 f: ?$ _6 |  z% `$ M. X
  126.     taskEXIT_CRITICAL();            //退出临界区
    : i# ?5 y+ {; Z
  127. }. Z: \0 S; j2 j

  128. + m; N" [- _  H8 x. ]+ Z# v
  129. //任务15 l4 t7 A; y& b' H* S
  130. void task1_task(void *pvParameters)
    9 F5 u. \" Y- W* B" V
  131. {3 z" A3 L( C* c" {" o' c  @( q
  132.         u8 task1_num = 0;
    - U6 U; \/ K% n7 E- C3 p5 p$ X8 x1 v
  133.         
    # P: }5 g* l8 h4 G! H+ r
  134.         while(1)
    6 \. ]+ B& u* s7 d2 \% i; |2 G7 h
  135.         {
    3 {9 W8 Y- w3 Q, N- T2 u* E; _
  136.                 task1_num++;0 z5 @1 a; t' H1 t8 r3 q
  137.                 LED0 = !LED0;
    5 p6 v( U2 T' O; x
  138.                 printf("任务1已经运行%d次\r\n", task1_num);2 Z8 c( ]' M  y3 L% E/ i
  139.         
    2 o4 W' l; v; F" t- f: G
  140.                 if (5 == task1_num)
    0 d3 }' `! r9 B5 j
  141.                 {
    4 }5 R+ a- V$ v* C- j* s, U
  142.                         //任务1删除任务21 s% w0 @! C+ G- r& J: B4 _  C; |
  143.                         vTaskDelete(Task2Task_Handler);
    - E2 l- W1 c# ?- M/ X4 D. D5 R
  144.                         printf("任务1删除了任务2\r\n");
    - u7 ^$ G, c* l! d$ A8 R
  145.                 }
    4 D2 B" G# g' I; x% h& \& ~
  146.                
      X. E. r* e! e6 M6 z( r
  147.                 //延时1秒 1000个时钟节拍! R& n' v9 I/ C9 U8 y' c
  148.                 vTaskDelay(1000);: i, f3 F% H+ y% X' _/ Q
  149.         }
    6 n4 t9 O# j2 |  K# P% L' c! I
  150. }
    3 y( v$ H: i' e

  151. . J( r! V* {& x4 [+ U
  152. //任务2- a  S  O+ a4 C" z4 r
  153. void task2_task(void *pvParameters)
    5 w( W- \/ n' |  d) V9 ?
  154. {$ G( X9 z+ J3 c4 l
  155.         u8 task2_num = 0;4 c, ^; J- h* u
  156.         7 c- z0 G/ @; \( {
  157.         while(1)
    ; t* p- ?% J1 w4 ]4 k
  158.         {1 e! O5 p: }1 E7 {, ]
  159.                 task2_num++;
    ! C2 O. N' _' q' P
  160.                 LED1 = !LED1;
    - O  L& B; b8 x
  161.                 printf("任务2已经执行了%d次\r\n", task2_num);
    5 E2 ?3 z. v$ X5 U) x# I
  162.                 5 O7 p9 X2 P: N
  163.                 //延时1秒 1000个时钟节拍
    5 p7 f: `. U! }3 D  T. r  R( r; a
  164.                 vTaskDelay(1000);4 L; b( E. o3 j* {5 m
  165.         }; N& x; m% y* n
  166. }
    : Z* D0 I9 I- z+ ~& _- X: g
复制代码
0 t. u& S. x/ S. \/ G- u
05. 结果验证

. m/ T& p: N; J: k! m! b任务1运行5秒中之后删除了任务2,任务2被删除之后就不会被运行。最后只剩下任务1运行了。% q+ Q: Q2 `- a+ Y0 a
- n0 u: a5 Q6 J2 A

+ Z9 F2 o- E8 \6 b6 G' P- J
赞 收藏 评论0 发布时间:2022-6-18 17:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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