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

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

[复制链接]
STMCU小助手 发布时间:2022-3-26 14:00
01. 概述- z3 T+ a$ X; T, ?
FreeRTOS中创建和删除任务API函数的应用。使用静态方法创建任务,任务的堆栈、任务控制块就需要有用户来指定。
! E+ W" h3 c6 t3 ]0 n- R9 c# S
' y2 Q! A- G+ e02. 功能描述
3 `) A5 f; W  M  n$ @4 h  L5 K设计三个任务:start_task、task1_task和task2_task,这三个任务的功能分别如下:
' s0 ~6 ?9 L2 v8 V6 e/ [
& d+ o. N* u5 u# j! |. V$ p; ystart_task: 用来创建其它两个任务。7 v+ z9 v% @) T# b! c! x5 ~

/ i4 k2 F5 ?) P; k6 b2 A) Qtask1_task: 当此任务运行5秒以后就会调用函数vTaskDelete()删除任务task2_task,该任务控制LED0的闪烁,并且周期性的输出信息到串口中。$ f7 h( Y3 g& {- C/ {$ u

/ `% W: Q( `" F+ ^task2_task:普通的应用任务,此任务控制LED1的闪烁,并且周期性的输出信息到串口中。
* R' X- \' v% o" V; @: A, S! W0 t. e* }- W0 e8 N
03. 任务设计% r+ ~8 t+ J8 M# Y
系统设置
. h$ k' |: B7 X2 V% I! G8 W
# {5 u0 |, @; a9 l* i, x. u5 p* s4 ?
在FreeRTOSConfig.h文件中需要将宏configSUPPORT_STATIC_ALLOCATION设置为1.
/ q7 C' V# h8 `1 u% N6 v3 B
" \6 G* y9 }0 s6 ^
  1. #define configSUPPORT_STATIC_ALLOCATION 1 //静态内存
复制代码

+ \" E9 P' @$ y. ?5 P# v8 E* q编译报如下错误1 E0 y$ W; Q: W$ J: \# }, w

0 j0 i, d7 Y7 h ]L770WQ6NJGA4QU~59]7%K0.png
7 \1 N1 d) @# s1 E" z/ \- C
! r) H" h. p9 ~. f1 G* T& n使用静态的方法创建任务我们需要自己实现函数vApplicationGetTimerTaskMemory()和函数vApplicationGetIdleTaskMemory()。' `3 n6 C8 Z& E9 f" A

' v) o$ D% [. O; ^7 s7 v7 e/ o
  1. //空闲任务任务堆栈
    3 L: ^! d' ~6 T) Q4 I! `, @
  2. static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
    4 T0 i3 i3 i3 `2 F+ {9 D
  3. //空闲任务控制块9 V: d7 B1 s) {8 W' b
  4. static StaticTask_t IdleTaskTCB;
    + ^6 j+ c. N5 u8 ~9 _  a' a; z. s

  5. 9 n9 j  ^, D' \2 B# y. J
  6. //定时器服务任务堆栈
    & S& [- C4 x! ^3 t  C- i
  7. static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];, ?: D' w  ~5 N0 R2 v
  8. //定时器服务任务控制块
    ; ^  @# x& X: h( k0 o5 ^
  9. static StaticTask_t TimerTaskTCB;
      t0 B7 u5 y0 ]' i
  10. $ W9 `: Q: A6 r  h# s
  11. //ppxIdleTaskTCBBuffer:任务控制块内存
    % ~& z$ f5 A& J! ?0 Y6 F( D
  12. //ppxIdleTaskStackBuffer:任务堆栈内存
    - u& R1 ^: d! A% b: p
  13. //pulIdleTaskStackSize:任务堆栈大小8 H' f, W0 \% h' U4 J6 p( y- Y0 {
  14. void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 7 w4 h5 W5 j& O: \! w$ O5 q
  15.                                                                    StackType_t **ppxIdleTaskStackBuffer,
    # E6 B. Q& j8 @% l
  16.                                                                    uint32_t *pulIdleTaskStackSize)
    * V6 r5 D9 M' ?
  17. {3 I: L. [6 T, b: ]) A" b; P6 j) n
  18.         *ppxIdleTaskTCBBuffer=&IdleTaskTCB;4 o0 F2 E) i9 Z1 O
  19.         *ppxIdleTaskStackBuffer=IdleTaskStack;
    3 i6 u7 ?  T- d9 o8 l8 x' X- S
  20.         *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;3 }3 x9 ?3 v# m
  21. }+ ^4 ]& K' j; ^
  22. 7 x- Y  i* Q( V6 P% F
  23. 7 T6 b, U5 {4 L) \0 d
  24. //获取定时器服务任务的任务堆栈和任务控制块内存7 T% ?) i# S; w' v
  25. //ppxTimerTaskTCBBuffer:任务控制块内存
    9 o# @* K7 F( q2 R) Y0 Y0 n% P) _9 x2 Q
  26. //ppxTimerTaskStackBuffer:任务堆栈内存9 L+ v% L$ o  m7 ~
  27. //pulTimerTaskStackSize:任务堆栈大小
    9 a5 B0 G: u, R2 z8 N# [$ J) f
  28. void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
    6 I: B/ |& K6 `0 G% A2 T
  29.                                                                         StackType_t **ppxTimerTaskStackBuffer,
    . A5 w1 o* l* O0 W, r1 p" ?
  30.                                                                         uint32_t *pulTimerTaskStackSize)
    / e5 ~3 M: U! P+ l! E
  31. {* ~8 T: V& A& G' h
  32.         *ppxTimerTaskTCBBuffer=&TimerTaskTCB;6 x8 K2 ^$ N( _: G
  33.         *ppxTimerTaskStackBuffer=TimerTaskStack;2 t! Y2 |% z) t4 X5 z6 F1 o( L5 u
  34.         *pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;5 N( L+ M, v" [$ U$ q. n3 y
  35. }
    $ k6 j* A' J" U2 B
复制代码

& K+ a  j$ v' l2 D3 x任务优先级,堆栈大小,任务句柄和任务函数
- @6 t+ w9 j/ z! {; [% u+ S. R) V8 @. @% [  j
  1. <blockquote>7 P) [  |5 g& U
复制代码
, f( i1 ^% H; Q# H$ I; b" ~* T
start_task函数
  1. //开始任务任务函数
    7 {4 e1 Z+ l/ `+ e" }
  2. void start_task(void *pvParameters)
    0 _! _; y4 m: @5 s1 \
  3. {
    + A' [) n0 w  d* f
  4.     taskENTER_CRITICAL();           //进入临界区
    9 `% V  f' A) N
  5.     //创建TASK1任务
    ! |; l2 J& q9 B& |
  6.         Task1Task_Handler=xTaskCreateStatic((TaskFunction_t        )task1_task,                . T7 d  b3 N7 V" f3 d+ v* ^
  7.                                                                                 (const char*         )"task1_task",               
    ; s' }0 M& h7 _: M1 i  c4 \0 w
  8.                                                                                 (uint32_t                 )TASK1_STK_SIZE,        ! B5 K% t1 V8 K( f
  9.                                                                                 (void*                           )NULL,                                , q/ `, ^. S0 K8 w0 }. n
  10.                                                                                 (UBaseType_t         )TASK1_TASK_PRIO,         
    ) `  b/ S- _* v' U8 E
  11.                                                                                 (StackType_t*   )Task1TaskStack,        
    4 k9 y$ X: ?8 @3 e
  12.                                                                                 (StaticTask_t*  )&Task1TaskTCB);        % _  o5 ?& `% `. w8 {  P$ q- Y
  13.     //创建TASK2任务
    2 Q" d- K) r7 v/ @4 |
  14.         Task2Task_Handler=xTaskCreateStatic((TaskFunction_t        )task2_task,                , ]/ ?' p2 v- _3 Q) l5 a$ {0 D, L
  15.                                                                                 (const char*         )"task2_task",               
    + Z. M- y; V1 J6 [
  16.                                                                                 (uint32_t                 )TASK2_STK_SIZE,        
    6 x7 x2 N2 M7 G" P
  17.                                                                                 (void*                           )NULL,                                
    ; w# ~9 d1 b0 w1 O+ j" K4 j' V
  18.                                                                                 (UBaseType_t         )TASK2_TASK_PRIO,           J2 I9 f, E' F. l0 ]  Z
  19.                                                                                 (StackType_t*   )Task2TaskStack,        
    - ^+ q( Z2 R" f
  20.                                                                                 (StaticTask_t*  )&Task2TaskTCB);
    ' z  ]) U: f" R3 D$ R9 A
  21.     vTaskDelete(StartTask_Handler); //删除开始任务7 m: Y+ S1 @* k+ F& d' h2 O0 w+ D
  22.     taskEXIT_CRITICAL();            //退出临界区
    0 g( M' B1 S- _* n
  23. }
复制代码

0 ]/ z% r( V! W$ b) dtask1_task函数
; J; e  [( H% U0 ]1 {* s% E, b3 G9 |
; a1 Q/ k& i2 M' c) m0 e/ Y
  1. //任务17 Y9 H2 Q6 E: D/ a. D; ?/ L" t
  2. void task1_task(void *pvParameters)" @' k! ^) h9 ^% \6 u
  3. {
    & \3 {# ?! w+ \: J4 z
  4.         u8 task1_num = 0;
    $ Z" a9 ?' t; \; v
  5.         8 o  ]% S% M3 v% T! P3 G- h/ C
  6.         while(1)& o0 B7 B4 t4 A# S' D1 {
  7.         {7 D* r7 w$ z: E. N) {9 G
  8.                 task1_num++;3 K. n$ J3 @3 b  W, ^
  9.                 LED0 = !LED0;
    7 x% v/ C: \8 L) A
  10.                 printf("任务1已经运行%d次\r\n", task1_num);$ U1 G' @1 }2 ?/ }
  11.         9 C' s, e9 I8 D  K* ^5 K  g3 }
  12.                 if (5 == task1_num)
    7 e" o7 \6 e! O9 X
  13.                 {
    . E3 {0 C. I1 O4 F0 {' ^9 Z
  14.                         //任务1删除任务2
    * Y# i: T8 R* @0 u
  15.                         vTaskDelete(Task2Task_Handler);
      P" h: \) |, c9 o( D: q
  16.                         printf("任务1删除了任务2\r\n");. y: A5 j" }1 c) c  {/ g% h& q9 [
  17.                 }2 i9 B4 f# U  [* m, P, v
  18.                
      c/ P$ O8 R% G0 d2 w2 c; X
  19.                 //延时1秒 1000个时钟节拍3 B% _5 H# I( p5 W7 L% q* B& m" Y
  20.                 vTaskDelay(1000);: p" N; t+ h! u
  21.         }' F, |" G7 y: E4 D" Y. K& ]6 u9 ]
  22. }
复制代码
& w$ s) V& ]! F( P
task2_task函数5 e: {% d$ I) h+ T) P

  r0 y% I, {' e' |2 g! y
  1. //任务2' I* a7 K/ X7 n/ c+ n- \
  2. void task2_task(void *pvParameters)
    / w9 E8 {7 W9 `
  3. {
    8 ?5 O0 V$ Q2 v7 N
  4.         u8 task2_num = 0;
    & V& r; N: y3 g$ X# i
  5.         
    ( C: I2 i. @( h0 g6 m
  6.         while(1)
    3 G4 L% c- P" \+ Z4 E& c/ \
  7.         {; E" E3 }5 t/ v4 w3 D2 Z
  8.                 task2_num++;
    9 P, X# J1 M9 Y) p
  9.                 LED1 = !LED1;
    9 ~( g0 l, H# X. f
  10.                 printf("任务2已经执行了%d次\r\n", task2_num);
    + i% e; s1 R; N9 R  }
  11.                 ! Q6 t& I* V# `  @" v7 d# W( s5 T
  12.                 //延时1秒 1000个时钟节拍7 |4 z% \! {' f
  13.                 vTaskDelay(1000);
    6 Q+ ^8 Q3 \9 N* t0 G- W
  14.         }; b5 C4 _) Z- I/ _
  15. }
复制代码

' U0 j  N  B0 K3 {4 O7 z' ^04. 程序设计
' q! c, E* k' r$ ^  A! Smain.c文件
% |  X$ `: n# @0 ?: E) P4 @6 K5 X6 a& j9 G
  1. #include "sys.h": e& }# X& `! D* J6 P
  2. #include "delay.h"' b  N7 N' K' U+ M5 z$ T8 A- P( h/ ~7 M
  3. #include "usart.h"
    # y3 D: L0 E( ~  x- S5 W* \2 z
  4. #include "led.h"
    8 n; Q0 U4 ]: ?" i
  5. #include "FreeRTOS.h"# M! t; T% y. v) z: I' ^
  6. #include "task.h"
    - T0 P# X  T0 b' y' z

  7. & G6 g- ]( @% ~" W

  8. - o+ o7 X8 a  r; ~7 V9 X
  9. //空闲任务任务堆栈: M4 Q% z8 s% @6 Y. D+ ~4 y6 g
  10. static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
    ( s7 m  m1 ?$ D
  11. //空闲任务控制块
    & ^% s8 M5 @+ e
  12. static StaticTask_t IdleTaskTCB;
    ( ~) U! V( J7 e& r4 o$ z

  13. & [" y8 D  q) ^6 L; C* a
  14. //定时器服务任务堆栈
    / q' q2 K0 p# X
  15. static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];. h, ]/ s) g* D+ ?5 h6 W$ `; C
  16. //定时器服务任务控制块; v: A& ?, Y5 ~9 X( n$ D
  17. static StaticTask_t TimerTaskTCB;& w8 }- k6 M# t3 l0 W1 a

  18. 6 l6 t& i* ^. F% E$ S5 n# P! d. c0 g
  19. //任务优先级* e  Y: Z2 S' a' k+ i$ A
  20. #define START_TASK_PRIO                1
    " e. O& T$ S! \. m9 R5 j$ g' s% V
  21. //任务堆栈大小        : W, F3 W( |+ Z2 X0 Z. c
  22. #define START_STK_SIZE                 128  3 \9 q. E2 e- P% @! {
  23. //任务堆栈9 ?6 U4 c3 [4 ]" D: u% ]7 }
  24. StackType_t StartTaskStack[START_STK_SIZE];
    2 p$ H) o7 h* ?5 Y; r
  25. //任务控制块
    ! s% e9 M# \$ v4 m( F! R
  26. StaticTask_t StartTaskTCB;
      D" w; ^/ W$ k0 G- v
  27. //任务句柄
    . `& M1 V0 S# W0 T9 a0 ^% L
  28. TaskHandle_t StartTask_Handler;% @; d1 w- y  e8 s
  29. //任务函数5 o( y% q* z$ L7 x& B/ ~3 a  a
  30. void start_task(void *pvParameters);2 r# u2 ]; U2 e" K& n4 g4 r$ X+ [

  31. & ~' T3 q0 R. M4 S' W! z
  32. //任务优先级; c% W5 ]. x6 F/ _# c
  33. #define TASK1_TASK_PRIO                2( |" s7 ?, S" y
  34. //任务堆栈大小        
    7 I2 b3 ^3 T4 T; D
  35. #define TASK1_STK_SIZE                 50  
    1 I, ^: y- H3 N* @
  36. //任务堆栈! D2 g/ w- M  Z1 H* m3 }5 d2 X1 g
  37. StackType_t Task1TaskStack[TASK1_STK_SIZE];- J! P9 i3 y" t3 s: Z; P
  38. //任务控制块4 Q/ @5 @0 m/ s' @  K% T
  39. StaticTask_t Task1TaskTCB;3 y0 w$ H3 ]6 R% t3 M5 n+ H4 T
  40. //任务句柄
    , v! D- R) O4 d1 R& p
  41. TaskHandle_t Task1Task_Handler;7 y3 ^2 k. c' t& C
  42. //任务函数$ l0 W' W# H$ {8 D2 [+ k
  43. void task1_task(void *pvParameters);2 ?- A, B% E1 ?

  44. $ |" R/ y; i4 [$ n: a7 J
  45. //任务优先级
    " N- J- |' {$ g# |
  46. #define TASK2_TASK_PRIO                3
    : s# w* o1 ?5 ?& A0 g, _* J. F7 e: |
  47. //任务堆栈大小        ! o' o# R6 K4 p- s4 b
  48. #define TASK2_STK_SIZE                 50  
    ! j5 |, T" ~# `$ a& v6 ^
  49. //任务堆栈- Y# P- g& d8 C2 U% r: J1 ~
  50. StackType_t Task2TaskStack[TASK2_STK_SIZE];, f& Z- G0 P  M' c
  51. //任务控制块
    3 K0 f, G2 N8 q* ?8 s
  52. StaticTask_t Task2TaskTCB;
    9 v. m" H" @6 ~' q7 N- e
  53. //任务句柄2 \5 T' `+ m5 n3 ~" N  j) p% t8 V
  54. TaskHandle_t Task2Task_Handler;
    / n, O% f7 t  b/ v
  55. //任务函数, I  c- r/ s; V  o1 K# `
  56. void task2_task(void *pvParameters);( G; E2 [/ o- A1 t' j6 Z7 R9 E

  57. ' X! f' }- I- |( N; d  y
  58. + g! c, R2 L. y2 m$ g( P
  59. //ppxIdleTaskTCBBuffer:任务控制块内存
    : r, ?, L. {1 x1 m4 p; P+ V0 F
  60. //ppxIdleTaskStackBuffer:任务堆栈内存. F8 U; ~  r- i# F
  61. //pulIdleTaskStackSize:任务堆栈大小& J8 m3 K" w1 d- e9 o
  62. void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
    : i: l7 Q& Z% [0 p/ k: C; @1 I( M; W% h
  63.                                                                    StackType_t **ppxIdleTaskStackBuffer, ; l6 |- N$ N! c8 x* T4 q+ ~" V
  64.                                                                    uint32_t *pulIdleTaskStackSize). h2 ^, ~4 m8 a! z2 M* S' h. V
  65. {
    1 p" [' }$ h$ \$ a4 S
  66.         *ppxIdleTaskTCBBuffer=&IdleTaskTCB;
    , b  e# i# m9 ^$ L9 U. z
  67.         *ppxIdleTaskStackBuffer=IdleTaskStack;6 z! s* `7 q( L; Y% c0 [
  68.         *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
    + d7 i$ K1 e9 k5 ?( M% z$ w
  69. }% @/ c& `& l1 S; f* B

  70. 5 z: H0 h; y; I2 h* o

  71. 8 R* A' l; M  V0 D8 }% Q( P
  72. //获取定时器服务任务的任务堆栈和任务控制块内存. d6 y3 y  w* Q5 g9 ?
  73. //ppxTimerTaskTCBBuffer:任务控制块内存: B6 ~5 s. h" Y7 h& j/ E/ F
  74. //ppxTimerTaskStackBuffer:任务堆栈内存$ p# h& ~2 h" V% ~$ M
  75. //pulTimerTaskStackSize:任务堆栈大小
    ; R- L1 J2 G5 ]9 O! @7 }
  76. void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer,
    * T/ E& X' x6 K0 \
  77.                                                                         StackType_t **ppxTimerTaskStackBuffer, " ^4 {7 N5 }( _* ~" s; m
  78.                                                                         uint32_t *pulTimerTaskStackSize)
    % B" E1 a/ p% `  j
  79. {; K% L+ x' I/ b
  80.         *ppxTimerTaskTCBBuffer=&TimerTaskTCB;
    1 b1 @& l" l* C- `9 b  c. ~
  81.         *ppxTimerTaskStackBuffer=TimerTaskStack;0 v" [- O% N- q, X. f  Z
  82.         *pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;9 L6 z8 ]+ |! Y, _/ T
  83. }
    8 ]( o9 A  Z9 B/ ?) X5 c

  84. - n  p( t9 n7 c: J' t" B+ {- o
  85. //主函数# T& j! G' f8 H1 b8 G: B$ I1 E9 |
  86. int main(void)0 w( i! q: m% W& I9 X2 U. K
  87. {
    6 Z* w) Q0 A( ~2 ?; w
  88.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
    1 d+ }8 k( Q4 R7 ^+ b
  89.         delay_init(168);                //初始化延时函数0 o) n2 X* ]8 x# q3 w" W' c, i4 H
  90.         uart_init(115200);             //初始化串口
    5 a2 G- K" P/ n, R
  91.         LED_Init();                        //初始化LED端口
    1 E  ]: z$ E  R- @' }3 A
  92.         
    4 m! M) S8 y) m7 I- n$ z
  93.     //创建开始任务' J& _9 n! [( T7 |' G, w0 s8 e. K
  94.         StartTask_Handler=xTaskCreateStatic((TaskFunction_t        )start_task,                //任务函数
    & \. E9 ?1 y7 h5 Z" R
  95.                                                                                 (const char*         )"start_task",                //任务名称( J- g  O6 A- M# i/ h
  96.                                                                                 (uint32_t                 )START_STK_SIZE,        //任务堆栈大小
    5 A" P0 y6 x; L: {! x4 j6 F
  97.                                                                                 (void*                           )NULL,                                //传递给任务函数的参数/ K; q! j0 J* v; d
  98.                                                                                 (UBaseType_t         )START_TASK_PRIO,         //任务优先级
      K: I6 Q. N0 P
  99.                                                                                 (StackType_t*   )StartTaskStack,        //任务堆栈: ~% T4 e4 U$ i; f  _) h( a1 L
  100.                                                                                 (StaticTask_t*  )&StartTaskTCB);        //任务控制块   4 y- W6 g6 b* U' S
  101. ' i# z5 R" i8 _& P, ?
  102.     vTaskStartScheduler();          //开启任务调度
    - O! M: w. o) }! k: w
  103. }
    " V8 y" {+ A5 i- l1 [2 B

  104. % @' S/ u. w1 |0 z
  105. //开始任务任务函数
    ! Q, [" L6 w: L! y3 H- _2 P8 |
  106. void start_task(void *pvParameters)
    6 t# U, p9 H+ [& A
  107. {1 |' z9 g! k/ V
  108.     taskENTER_CRITICAL();           //进入临界区0 S$ R5 K* i# c4 k
  109.     //创建TASK1任务
    ; G% u: I4 r! Y( Q: o7 d
  110.         Task1Task_Handler=xTaskCreateStatic((TaskFunction_t        )task1_task,                $ ]' b9 w: C" i( S5 X& p% P8 q
  111.                                                                                 (const char*         )"task1_task",                ' k/ B5 p1 w3 n$ t4 F
  112.                                                                                 (uint32_t                 )TASK1_STK_SIZE,        
    6 C9 w$ s/ D; X% I
  113.                                                                                 (void*                           )NULL,                                / f1 Q5 @! j: f, u* m
  114.                                                                                 (UBaseType_t         )TASK1_TASK_PRIO,         
    5 |+ w  b7 w# V0 }* f* o1 A" k
  115.                                                                                 (StackType_t*   )Task1TaskStack,        + d8 d9 f2 ^3 J+ L
  116.                                                                                 (StaticTask_t*  )&Task1TaskTCB);        
    * @' W6 X& E% i5 V9 X% I3 V
  117.     //创建TASK2任务+ |$ B! [. U# l2 y6 A+ M% z
  118.         Task2Task_Handler=xTaskCreateStatic((TaskFunction_t        )task2_task,                8 k4 h' H: r& k
  119.                                                                                 (const char*         )"task2_task",               
    " g8 h; L/ P+ w2 y5 L0 g$ E0 G
  120.                                                                                 (uint32_t                 )TASK2_STK_SIZE,        
    + |6 O0 s8 V. r! o' o4 S/ h
  121.                                                                                 (void*                           )NULL,                                * k1 R- c, r7 [4 k7 m4 s4 Y# E
  122.                                                                                 (UBaseType_t         )TASK2_TASK_PRIO,         
    $ V( e2 V* L. f+ b+ U* R. S7 h
  123.                                                                                 (StackType_t*   )Task2TaskStack,        8 `# f  f1 ]4 K3 K- l
  124.                                                                                 (StaticTask_t*  )&Task2TaskTCB);
    $ C2 N: j7 f* V7 d7 J3 r7 i
  125.     vTaskDelete(StartTask_Handler); //删除开始任务
    / F! h( x" m$ E% T
  126.     taskEXIT_CRITICAL();            //退出临界区
    + m7 w+ L) h( G/ E: h
  127. }
    1 V" u& _3 F  x6 ~' S# ^# M4 i
  128. 6 J$ H3 ?$ Y5 `# _
  129. //任务19 |/ W2 l  O1 h* ~; [! [
  130. void task1_task(void *pvParameters)
    ' K' u) G# }% V/ P7 P2 x" L1 q9 e
  131. {6 c9 E1 b; }4 w+ G0 }8 {5 g
  132.         u8 task1_num = 0;
    % z; l( p8 \2 v1 x
  133.         
      `0 N0 T; T% x1 \
  134.         while(1)- e1 Y# b( R6 c% n' o& Z( T3 J
  135.         {- W5 e& ~. \6 ~% B! {& }' W; V
  136.                 task1_num++;
    % p' v. D0 u! n& y
  137.                 LED0 = !LED0;  r- D; g/ x- j; b/ s( Q
  138.                 printf("任务1已经运行%d次\r\n", task1_num);
    / b5 t# f2 w! h, Y0 w& U$ _! a
  139.         - J4 e8 A" E# @. C8 x
  140.                 if (5 == task1_num)" Z# |" j7 z+ v2 T/ @$ g/ i2 U, \
  141.                 {
    " [) D; P$ d# Z" n1 Z& U9 ?
  142.                         //任务1删除任务2
    4 G: d. Q+ I% }" p2 o% D
  143.                         vTaskDelete(Task2Task_Handler);
    8 e3 s1 ~8 t  ?4 |6 K- Y+ ~. N
  144.                         printf("任务1删除了任务2\r\n");
    ( ^, y7 Q' c& K- W- p
  145.                 }
    ( w. C6 C, f( Q% A. B+ E4 n6 p
  146.                
    0 D& V% ?" M5 _- K3 Y
  147.                 //延时1秒 1000个时钟节拍
    0 Z$ A: b3 v3 u3 f$ o' H
  148.                 vTaskDelay(1000);5 r- u, p. o9 s1 R4 l
  149.         }0 ^8 A6 r9 t. G+ r" t% _" z; g
  150. }, S" z4 W. X2 j2 _
  151. 3 t( I( g. O. Z8 G3 Y& w& y# T
  152. //任务2' R6 y& v5 N* @, O/ z: g
  153. void task2_task(void *pvParameters)
    $ o" D1 ^- K  m' C( b; w5 C
  154. {
    6 p0 V$ W8 |! n( r9 w% s
  155.         u8 task2_num = 0;
    ' J# _9 Y( K! x7 J, J0 b, I
  156.         . M+ f2 V2 c* L
  157.         while(1)* B' O- T- z8 R9 l3 `- a$ \6 b
  158.         {2 W0 C! `8 O3 F3 Y% Q+ ^4 V
  159.                 task2_num++;
    ( c* O! l' X, Y: S
  160.                 LED1 = !LED1;
    , I* W* t8 x5 S' d" j
  161.                 printf("任务2已经执行了%d次\r\n", task2_num);
    ( h9 g( |# I( X1 a
  162.                
    2 Y; f0 u5 [9 O/ i
  163.                 //延时1秒 1000个时钟节拍3 `, A9 G1 @$ _9 S% M5 \+ H
  164.                 vTaskDelay(1000);
    $ y" m8 x, }( y: O
  165.         }) i! d. ~( p( G3 V( P# t( S6 Z, s
  166. }0 Y+ k4 C7 a9 ]) ]" ]- _: y
复制代码

1 J  a. Q' E- @05. 结果验证+ Y, `  V2 O8 m
任务1运行5秒中之后删除了任务2,任务2被删除之后就不会被运行。最后只剩下任务1运行了。; F( x5 O( u( U
7 @4 b4 h$ e* m- \: p2 q( M  \

: j2 I7 h7 [# {0 S2 ^2 t& Y; \
收藏 评论0 发布时间:2022-3-26 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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