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

STM32G0学习手册——FreeRTOS消息队列

[复制链接]
STMCU小助手 发布时间:2022-10-28 15:27
1.创建好带有printf-stdarg.c的FreeRTOS的工程
0 s7 k4 j& k, D1 b2 F) ~' p/ ~. q6 b- q" C# S" @/ d5 U% J
2.修改main.c文件
7 C. l" J; O5 h; ^  i) ]: V, t% f5 c" L$ G* W  R
  1. /* Private includes ----------------------------------------------------------*/& M$ y1 e( m6 n# q- m( \6 p
  2. /* USER CODE BEGIN Includes */
    9 b8 D3 \( }' D9 a) A7 G+ D7 N

  3. ' d8 a- W' P% Q! t6 W8 Q
  4. #include "FreeRTOS.h"
    4 L7 ?1 |! {7 I+ f, @6 t' r
  5. #include "task.h"" l) }" Z. ^9 \; [" J
  6. #include "queue.h"0 |/ G1 D/ n+ S! E& A
  7. #include <stdio.h>  [. k9 r" ~% b! E. R" z# x
  8. #include <string.h>1 ^, e  A( S! f/ G) `
  9. ) E: j1 [, h  h+ \2 j' `# Y
  10. /* USER CODE END Includes */" e# `- j2 y: F  e

  11. ; B7 T% H& \1 e$ o1 X7 z+ F
  12. /* Private typedef -----------------------------------------------------------*/
    1 W& p+ Z- c5 ^1 J  s
  13. /* USER CODE BEGIN PTD */  ?! m4 v9 F, D

  14. 7 N; W7 ?  n% X* J7 Y7 H
  15. /* USER CODE END PTD */0 _. l4 H, f8 }* i

  16. 5 }; E! ?! o8 }0 g' X  m2 B; a+ u- J
  17. /* Private define ------------------------------------------------------------*/) R+ O# d' p. R( |
  18. /* USER CODE BEGIN PD */
    7 G, W& `; s; X8 j2 z, v

  19. * \! F' }4 A: S- ^+ d* u
  20. #define QUEUE_LEN   43 {2 J7 @, o: W7 E3 O# c
  21. #define QUEUE_SIZE  4
    0 ^  b9 j  h' H5 d8 K8 e
  22. 5 d' l( k4 b/ F$ {+ Z. e2 y
  23. /* USER CODE END PD */0 @& a7 u" Z7 _4 b  |# L

  24. $ v) @2 w6 @/ \/ V( J8 @9 K
  25. /* Private macro -------------------------------------------------------------*/
    ( f' q: b" A- k' i3 N1 y
  26. /* USER CODE BEGIN PM */1 r4 S; E+ v4 o( z" r$ q' ~
  27. static TaskHandle_t CreateAppTask_Handle = NULL;
    / n0 H! k0 a+ D3 k0 ^7 y
  28. static TaskHandle_t Led1Task_Handle =  NULL;/ j0 A$ ~6 N! ~! _' D( t$ v1 `
  29. static TaskHandle_t Led2Task_Handle =  NULL;
    ' K! D! V* W8 b8 f* R) R4 y1 s
  30. 3 \* L% X$ }& a, K
  31. static QueueHandle_t Message1 = NULL;. N2 v6 Y8 O8 Y- t

  32. $ h9 _9 A* p# j  {# {
  33. extern int f_printf(const char *format, ...);- `5 y' j+ P' f4 `, J2 W9 V  W
  34. 9 H" S2 s# M' d8 s1 ]
  35. /* USER CODE END PM */
    # O1 D. D+ A6 Y  @
  36. 9 y$ q: e* Q7 Q5 U* o6 u3 M+ q
  37. /* Private variables ---------------------------------------------------------*/
    0 Z6 |4 J8 p+ w2 r( {
  38. / ?* s/ q7 E( e
  39. /* USER CODE BEGIN PV */, m# e9 g% K: ?+ p) r
  40. static void CreateAppTask(void);
    7 \% O) V2 k+ [* q
  41. static void Led1Task(void);3 l2 @- V, r7 T& @) s! U1 ]6 M
  42. static void Led2Task(void);. c% k2 N- s. l1 h7 X. U
  43. % W) X/ d% w) Y3 a' j/ E# o( ~
  44. /* USER CODE END PV */
    " \8 M$ V# }4 `0 x3 U. \

  45. ' y9 V8 n2 M# J/ j+ I4 u! e
  46. int main(); k! ^- |$ c5 ]" |4 u
  47. {9 ]! F* O& ~- F  E% Q! `: Z
  48.   /**/6 \* x# E1 A$ f6 q/ r* m1 Z

  49.   c7 Z+ t6 t! |7 T2 D& H
  50.   /* USER CODE BEGIN 2 */
    ( e0 t$ y! u  ], I. D2 z

  51. * g$ _7 r$ t3 |
  52.         UBaseType_t xReturn = pdPASS;
    6 t0 {5 j  G; N$ r  i, I0 B
  53.         
    ( e" Q- K( G& ?0 F# G8 f3 B
  54.         xReturn = xTaskCreate((TaskFunction_t) CreateAppTask,: }: q6 w; s8 _
  55.                               (const char *)   "CAP",
    0 p; X4 A$ ?. L4 ^) }5 G
  56.                               (uint16_t)       512,
    & L5 ~% T/ q2 \. L
  57.                                                   (void *)         NULL,( c% d+ G3 a/ W7 n' b$ n$ c# T
  58.                                                   (UBaseType_t)    1,! n" S3 {/ @# y+ ?
  59.                                                   (TaskHandle_t *) &CreateAppTask_Handle);! V7 v8 s8 ^9 O1 w5 Q' L
  60.         
    8 Q! n8 C2 R2 z
  61.   if(xReturn == pdPASS)
    ) n. e( e! c/ u2 j
  62.         {2 i5 t9 M7 y7 X  P% T, b8 j
  63.                 f_printf("start.\r\n");
    0 c! n% k1 d9 C1 N( {
  64.                 vTaskStartScheduler();
    5 D0 e' c" W6 m" R* d) l+ Y, h" S
  65.         }* |4 O! k! H# I0 `! I' ]

  66. 8 r' h9 L$ _! X2 q) t
  67.   /* USER CODE END 2 */  r# t* Q& `/ `8 j+ r& p8 v
  68.   while(1)
    . |3 S# Y( ?, t- H) L
  69.   {( e/ ^1 h* K0 f' f$ b
  70. 4 h+ D% \' x* j# {1 B& w) a. m" F
  71.   }! i* S; k# y/ F; f; r' y% ]) p& M
  72. }
    / S) _4 p  {" s) F. E6 D  d

  73. : T$ F$ `2 K/ a) E$ _/ c
  74. /* USER CODE BEGIN 4 */
    5 h0 T: D( `/ k: ~5 F2 B
  75. static void CreateAppTask(void), ~7 S- ?3 L- ?* A
  76. {: ~6 t5 e3 ?4 e5 ?+ f4 N
  77.         UBaseType_t xReturn = pdPASS;
    5 {" Z! c7 S9 Z! P
  78.         . \0 F3 t) M+ S* z
  79.     taskENTER_CRITICAL();
    3 a+ h  T) J& u8 ?
  80.         
    * t& o' V. V4 S
  81.         /*消息队列任务一定要在调用的任务前面创建,不然代码运行不了*/
    $ n. D  J4 ~* }5 @- K$ b
  82.         Message1 = xQueueCreate((UBaseType_t)QUEUE_LEN , (UBaseType_t)QUEUE_SIZE);! R- A3 W+ X0 g- V" I  x/ c* L( \
  83.         
    2 O. |5 p, ^: [4 F4 K: H  @
  84.         taskEXIT_CRITICAL();
    7 ?7 g2 o" B, V1 S; e4 c% ]9 e1 s
  85.         
    ; Y4 \( s! W) R& q$ E- v
  86.         xReturn = xTaskCreate((TaskFunction_t) Led1Task,
    6 {% L% a1 }* e: v
  87.                                                                                                 (const char *) "LED1TASK",4 I3 h) w2 i+ ~. _" m
  88.                                                                                                 (uint16_t)      512,5 j: Q! \' p  T1 J0 X& N4 A5 w# u
  89.                                                                                                 (void *)        NULL,- a' T9 m5 P5 G! M$ a
  90.                                                                                                 (UBaseType_t)  1,
    # W8 B: D  z% X" X
  91.                                                                                                 (TaskHandle_t *) &Led1Task_Handle);0 N; W- R& y: p- r' R, h5 E4 F2 I
  92.         
      l' v' t4 r& h8 F( [: {. s' |5 V
  93.     xReturn = xTaskCreate((TaskFunction_t) Led2Task,
    & Q! p/ Y4 L- R/ \4 M- g0 o& p
  94.                                                                                                 (const char*) "LED2TASK",                                                                                                ' i7 d3 R9 I: L# u
  95.                                                                                                 (uint16_t)     512,+ p' }3 i8 X% ^0 I: m! p
  96.                                                                                                 (void *)       NULL,
    / s" W( N  m) ]7 {( q) z
  97.                                                                                                 (UBaseType_t)  2,' g6 _- `6 Q4 t
  98.                                                                                                 (TaskHandle_t *) &Led2Task_Handle);6 c2 K# _0 V5 i  U1 G5 L
  99.         if(xReturn ==pdPASS)  y4 l" V6 X# Q1 k% P- P" b- e
  100.                 f_printf("TASKCREATE PASS.\r\n");
    2 a; \% n4 k; G: c6 X. T  n
  101.         
    & M/ I' D4 R* K# j) ?
  102. 9 [  E  s" m0 G
  103.         . S9 S. E1 r3 G7 n
  104.         if(NULL != Message1)
    / \, o- {. m$ f, o' S
  105.         {" q& n, `8 t! u9 U. s4 F# v1 A
  106.           f_printf("QUEUE PASS.\r\n");
    2 F* ~) E8 N( y- o* Z
  107.           vTaskDelete((TaskHandle_t)CreateAppTask_Handle);, t& _) n9 u+ W* N+ l
  108.         }( Z" x( _: b) V, Z5 c, V# ?8 H& h# H" N
  109. }8 d- P. T+ }( O! s9 ?' ]7 X
  110. static void Led1Task(void)* w3 B% M0 E* r2 {, a/ s+ p
  111. {
    ) u0 U; A- h2 i
  112.         while(1)
    # H6 C( ?2 O3 B9 Y
  113.         {
    - w; S- }( V: o  y  M
  114.                 UBaseType_t xReturn ;
    , y4 f$ l( y  \1 o8 v- s" c2 I
  115.                 uint16_t a=1;3 T; ~& o& U$ f+ ~) x
  116.                 uint16_t temp=0;
    # g3 W. [8 ?4 l+ y" A% m3 K
  117.                 uint16_t temp2=0;
    3 O# m; e" b  N0 B2 w5 `1 }0 d' r
  118. 6 O" M  N* F3 Y! R, O/ K
  119.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    # Q( r( q' c) G
  120.                 {
    1 w$ J$ R: d4 R5 C$ i# s9 C
  121.                         for(temp = 0 ; temp < 10 ; temp++)
    ' {  ^1 S- ?% V: b; M! y; `9 i
  122.                         {
    $ W2 [& y; J; @" r! Q7 q8 s
  123.                                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))9 b# q; Q7 q1 R- l9 o
  124.                                 {* X; G6 c* c. Z  k' d* ?
  125.                                         temp2 |= 1;
    8 ^* X# ^" U7 v2 K( P$ T
  126.                                         temp2 <<= 1;
    4 N+ d) K4 ~6 J/ i( Z  s$ I( O" T
  127.                                         vTaskDelay(30);; E9 ^1 D6 {4 v* J! |
  128.                                 }# f, p; r5 a0 m3 ~
  129.                                 else
    ! N* `" k$ P1 n/ h) n0 @2 n
  130.                                 {7 |7 h4 D  w. b$ N6 B4 F
  131.                                         temp2 &= 0xFFFE;7 a" ~8 {: |& ^$ D, ~. Z+ A: `
  132.                                         temp2 <<= 1;
    4 C4 F) V+ L3 c0 t
  133.                                         vTaskDelay(30);
    5 r9 O7 W9 g6 }. v8 ~
  134.                                 }( d. m. P% M6 \
  135.                         }4 Y4 o) v* ^3 E/ n' u
  136.                         if(temp2 > 0x1F)
    4 q6 \* v2 b( f1 k6 s
  137.                         {
    , U# }: m  o4 S8 V$ C7 l# L
  138.                           xReturn = xQueueSend(Message1,&a,0);
    " j# ]% b3 T/ X( N! D; a5 F
  139.                           if(xReturn == pdPASS)
    # r* t0 B) r: y5 l: c/ @
  140.                           f_printf("SEND PASS \r\n");. e( b. [* q4 c3 G+ D1 g
  141.                         }/ D8 y  D! k  q0 k& j) B* P+ V0 I
  142.                 }" j2 w" p- M: Q2 V! M! {3 v
  143. * _" O* |. b) H
  144.         }
    0 U, ^/ P( ^' A: ^0 ]
  145. }
    6 @$ h: G$ f+ b6 o( J: J
  146. static void Led2Task(void)  H3 p  r$ h* P$ y- y  i
  147. {$ X8 R7 J& A+ \( }5 R8 |
  148.         while(1)
    * r" I; C9 U$ T. h6 i) I" I
  149.         {- f: k4 H2 j$ U: I6 |$ q
  150.                 BaseType_t xReturn = pdTRUE;) w( P4 Q1 a+ ^2 l4 p) K8 N4 q
  151.                 uint16_t receive_buff ;# x- c: y4 p& ~( R, E; a+ o  e
  152.                 xReturn = xQueueReceive (Message1, &receive_buff,portMAX_DELAY);
    * {. ]/ t$ {6 ~. |6 E; T' y
  153.                
    , l/ }8 s& l5 T2 U) S9 ?2 g5 z
  154.                 if(xReturn == pdTRUE)+ \* w+ |0 |2 b# O0 r5 Q5 b8 U
  155.                 {
    $ O: m1 j$ \$ O
  156.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);. F; f  z6 j# i6 S  U
  157.                         f_printf("RECEIVE PASS\r\n");
    ) _5 Y0 d) {3 J. T# H7 h/ R5 q
  158.                 }
    ! ?8 ]- B; s! z; A# B5 D- G

  159. 9 U# Z- G. x7 q4 h7 K8 N: C
  160.         }
    1 D$ s2 ~2 n! l* Y
  161. }& e$ b! p# E0 X. a7 f' D$ n

  162. + C% K4 {1 n4 J$ g
  163. /* USER CODE END 4 */
复制代码
; s0 u5 R  S+ p" z3 l6 h
* y/ y6 X* O; f
————————————————  K3 f- v, L5 I5 O
版权声明:SCCELE6 k3 Q2 `/ Y+ Y0 o, t* Q; q: D3 u
5 b0 G/ H5 ~% P7 v8 l
赞 收藏 评论0 发布时间:2022-10-28 15:27

举报

0个回答

所属标签

相似技术帖

官网相关资源

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