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

【经验分享】STM32G0学习手册——FreeRTOS信号量

[复制链接]
STMCU小助手 发布时间:2021-11-12 01:00
二值信号量的用法示例" w( J# ?% `5 Z5 d. ^3 w" |. J
1.创建好带有printf-stdarg.c的FreeRTOS的工程
+ y5 f' Y- J; C, M. A% R5 R3 y' {* X9 a9 |; C: e
2.修改main.c文件
8 L, ~4 w' w3 r
0 k7 D1 Z! m$ {; L# ]
  1. /* USER CODE BEGIN Includes */
    % d" T+ J  s4 @$ b
  2. ' l& S- ^0 N4 B7 r
  3. #include "FreeRTOS.h") ~2 R2 E+ Y0 x, O% [( z! Y
  4. #include "task.h"! ~. `: R, S5 u) V1 c
  5. #include "queue.h"
      C2 b* j- l5 \7 Q$ R9 n$ j; K
  6. #include "semphr.h"7 U/ U9 d' m/ s" B' [( e
  7. #include <stdio.h>
    0 G* ^$ w4 I& m, \1 n5 R
  8. #include <string.h>, Y/ g3 l- d  n4 g9 W5 u
  9. 2 ]" D) ?1 d. H" c. i' f, P
  10. /* USER CODE END Includes */
    " B7 _4 t7 o, U# O
  11. /* USER CODE BEGIN PV */
    8 i& ]) }" \" B) p5 L! C9 y
  12. 6 c3 X' @  i( b! w) q  E* p( s
  13. static TaskHandle_t AppTaskCreate_Handle = NULL;1 S( w; ^9 F( R6 n
  14. static TaskHandle_t KeyTask_Handle = NULL;
    - n" H' Z  s. D# N6 |
  15. static TaskHandle_t Led1Task_Handle = NULL;. v# ?2 s% k8 x0 @' n

  16. : b3 J9 O) i1 R4 [! X
  17. /*Create a binary semaphore handle*/; q8 C6 A; i; C
  18. static SemaphoreHandle_t Binary_Handle = NULL;2 J* n) N+ X6 i6 O

  19. 0 M0 g8 f( h# I
  20. extern int f_printf(const char *format, ...);
    + O4 z* A! H# Y7 F( K! [7 j

  21. 4 w2 w$ F# g; h* S+ k8 Y
  22. /* USER CODE END PV */
    5 A( k4 z% A9 U3 ?/ a2 W
  23. /* USER CODE BEGIN PFP */
    1 s+ S5 U; [7 ~

  24. ' P4 ?+ q# m+ ~7 k
  25. /*Create a task function*/
    1 P9 n1 [4 h7 p3 T3 S
  26. static void AppTaskCreate(void);, v3 R/ @& X" ?1 j) @: P9 U
  27. static void KeyTaskCreate(void);
    , N$ u5 w9 T2 L5 H+ q7 y+ t" W
  28. static void Led1TaskCreate(void);( x- E* L* b4 J

  29. 2 ~/ G4 a4 w& R8 C2 Q: I
  30. /* USER CODE END PFP */
    # @+ ?. Y; Z3 S! q$ S: u0 B

  31. 5 w) K# o' f1 }5 q
  32. int main()
    5 X$ p" n$ @! e( {
  33. {
    " d; ]4 E/ @, _% Q
  34.   /*
    $ A2 y7 Z; J$ [) D7 Q/ c9 a
  35.   *
    + Y! @+ J* x; K5 c! C  G
  36.   */
    $ g7 u# u) Z5 M# b' J1 W
  37.   /* USER CODE BEGIN WHILE */
    ( |# b8 z, w! F' \) K
  38.   UBaseType_t xReturn = pdPASS;8 b: \# q6 \) i- m, \9 g' D  L
  39.         5 \0 b4 \" ?* m& f1 N+ G
  40.         xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,: ]$ N0 Y' O4 @# `6 y
  41.                               (const char *) "APPTASKCREATE",+ ?7 _4 K! o* Y. I1 R/ \
  42.                                                   (uint16_t)     128,. b& j5 f9 O" e2 U  X1 x
  43.                                                   (void *)       NULL,  T+ r" F2 o9 k# a
  44.                                                   (UBaseType_t)  2,- q0 K2 i( M; |; L
  45.                                                   (TaskHandle_t *)&AppTaskCreate_Handle);% _8 }) R$ l' P* k4 Z/ c  @
  46.   if(xReturn ==pdPASS)+ Q( U+ g; b4 u) x
  47.         {
    0 A. ?+ t' ]% v5 G; L' ^
  48.                 vTaskStartScheduler();$ S3 H5 v, [) @" N" i; |: R4 c6 K
  49.                 f_printf("start..\r\n");
    # J/ e+ X7 ~6 {. ^9 Y1 K
  50.         }
    9 D4 A. B4 o& e6 X- O
  51.   while (1)
    . n$ I$ w2 s( u6 p- V
  52.   {  \: o9 f- }) A( ?0 H
  53.     /* USER CODE END WHILE */
    * s$ H. K7 h4 q3 J
  54. 7 {) {3 T6 k1 K) S; j$ ~7 q
  55.     /* USER CODE BEGIN 3 */5 v# F% J& ?3 j) F3 I1 y
  56.   }
    . G9 ?* V6 C- q- L: j
  57.   /* USER CODE END 3 */
    : n1 d  E8 _4 a# A7 |+ g
  58. ' h2 G" _- G; o  y9 Y" W) q. [

  59. % o2 ^7 T+ Q5 ]) n0 S  y# H
  60. }
    * X+ E/ w, ~* ^  M4 w/ q# j; K

  61. 2 u9 \& P3 d! o: v+ @
  62. , J4 [6 a7 w* l* w# G7 ~1 t
  63. /* USER CODE BEGIN 4 */# v0 G& J0 g7 |9 @" r% N! \$ w  Y+ W
  64. static void AppTaskCreate(void)
    # S$ i8 M1 u. M5 t- o
  65. {
    - w, t* I+ C5 ~$ i) `
  66.   UBaseType_t xReturn = pdPASS;
    " @3 L6 e/ r5 L- k% E
  67. 4 R9 @- t% G% K3 _  a
  68. ( R( B7 U+ b7 T# n0 t+ X
  69.   xReturn = xTaskCreate((TaskFunction_t) KeyTaskCreate,
    9 E9 e- N$ N& B. N6 D) Y
  70.                              (const char *)   "KEYTASKCREATE",7 x& K/ o+ X9 ^- g5 Z7 ~
  71.                                                  (uint16_t)       128,3 u. ^7 H5 ]4 k8 ^% w0 E0 G# e
  72.                                                  (void *)         NULL,6 F5 c" r0 U2 e( S( _( K0 }- c
  73.                                                  (UBaseType_t )   2,
    4 r% x! X" G& @5 g  q6 w
  74.                                                  (TaskHandle_t *) &KeyTask_Handle);
    - o- E9 R1 ?$ X* W3 S. n- `

  75. 3 x- m$ e! h6 g1 ], u  {% n6 [4 z
  76.   xReturn = xTaskCreate((TaskFunction_t) Led1TaskCreate,
      l7 }1 W3 l+ u: O7 z
  77.                                                 (const char *)   "LED1TASKCREATE",
      D+ P& q; _# W% {4 W. \8 c; \
  78.                                                 (uint16_t)       128,
    9 @( y) X6 F" o0 @8 L3 k
  79.                                                 (void *)         NULL,
      D  v$ @$ j, q" }
  80.                                                 (UBaseType_t)    1,
    ; [  g- |1 y. H! J! ~& `3 i2 v9 N
  81.                                                 (TaskHandle_t *)&Led1Task_Handle);, _0 V! G+ w0 s4 Q
  82.         
    ' \* E0 u+ _1 Q' x$ w
  83.     /*Create a binary semaphore*/
    4 \: E) K# U1 e+ n3 h3 D1 k# _
  84.         Binary_Handle = xSemaphoreCreateBinary();
    ; x3 ~0 G) `- b/ F! ?
  85.         if(Binary_Handle !=NULL)+ D2 z$ x! B& h* X
  86.                 f_printf("Create Semph_Binary PASS.\r\n");
      m' y. X7 N: M3 @+ [- R
  87.         
      X9 W5 c; J8 `3 V# k
  88.         if(xReturn == pdPASS)
    ' U' I5 Y% a* Q/ P. Z
  89.     vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);                / ~! q- ?( @8 e1 E7 Z
  90. }* B0 [# W# m# m$ m

  91. 6 s* o- j: t8 G/ C9 a. G
  92. static void KeyTaskCreate(void)- S1 b7 h; ]2 A+ M0 _6 w0 D: w/ j
  93. {$ ?) ^# O1 @! j$ j9 o
  94.   while(1)# w8 j! d$ l7 C; [
  95.         {! X+ F# y* Z9 g; G8 J5 Y% w1 @  K
  96.                 UBaseType_t xReturn = pdPASS;
    ( z2 n3 E9 D; o3 W) F
  97.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    . o* `# K8 h" @( c( D0 z. k# F2 J% b
  98.                 {8 J9 }" a. {) A. K$ B% h
  99.                         f_printf("KEY TASK PASS.\r\n");
    ! I/ l$ o# X- x1 T8 k- F' p' l' _
  100.                         vTaskDelay(100);8 E+ N* b  x) ]; l! U
  101.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    7 w+ ^" O6 c7 S# t
  102.                         {. X6 d3 B5 p. h) W& r
  103.                                 xReturn = xSemaphoreGive(Binary_Handle);
    6 T( c- S& p9 [: F: @" K& @- N5 k
  104.                                 if(xReturn == pdPASS)6 S% s$ h0 W! v4 }. ^
  105.                                         f_printf("GIVE BINARY PASS.\r\n");
    4 {: i' I3 v3 K
  106.                                 else if(xReturn == errQUEUE_FULL)
    1 E  J! a& ?7 o/ a  S4 H; P! W- V
  107.                                         f_printf("QUEUE IS FULL.\r\n");# G- }; n' F1 j5 w9 n
  108.                         }
    % s$ V, ?: a; l/ f
  109.                 }
    4 @2 H$ A: W# Y" u7 m  G: B  z
  110.                 4 _% Z+ h) m, V
  111.     vTaskDelay(100);. H$ t, [. e# P
  112.         }
    ; _; m! ?6 q& D7 d: c/ V: c8 z
  113. , Z$ H3 n& ?5 n3 T" }
  114. }
    : P6 Z+ ?  I+ @9 T; e# f
  115. static void Led1TaskCreate(void)
    6 T( G* ?6 E  m& G! ~0 G
  116. {" }3 ^# y. n% N+ c1 k8 @
  117.   while(1)& }  X+ z& g% Z% |! {! h3 ?
  118.         {
    ( x9 V! m) W" Z/ e' h. u# a
  119.                 UBaseType_t xReturn = pdPASS;
    * I$ y) W" }+ N) j! `1 Y
  120.                 ( D" x3 F0 t/ V9 m* m
  121.                 xReturn = xSemaphoreTake(Binary_Handle, portMAX_DELAY);8 i8 H7 W* W! l, P' A- I& N1 G
  122.                 if(xReturn == pdPASS)
    8 ^* {7 C! v$ l3 O) g0 ~( L
  123.                 {( E9 E8 r! [( C7 E' j+ u
  124.                         f_printf("TAKE BINARY PASS.\r\n");7 M' c' P1 w1 n1 Y. P) y
  125.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);9 P5 x1 s% c. O& a+ ?
  126.                 }
    ) }( M  W1 `- T; `1 X+ c
  127.                 7 R$ \' t+ M" Y  n7 g
  128.           vTaskDelay(100);  U! K" u  i4 L& d
  129.         }, I  C5 t1 y* }2 S
  130. }
    # Q# A" E; a; u3 A& w

  131. ! m$ \( ^8 b7 ~5 ?, S! ~
  132. /* USER CODE END 4 */
复制代码

! a# R# ?0 Q  b4 S计数信号量的用法示例
" v) _! V. a% e; Q2 A: h3 z7 j1.创建好带有printf-stdarg.c的FreeRTOS的工程
" N3 Q9 x; L6 n; W
' f/ G/ ]/ G* r! u, J2.修改main.c文件
! H) v8 \, F, C7 i! ^& t! `4 g
+ J9 B- ~2 w9 l
  1. /* USER CODE BEGIN Includes */$ f- D; R* t. E- s5 D' s4 F

  2. 6 x* k7 s8 M% x- r* F- e
  3. #include "FreeRTOS.h"
    ' J- n! N. ]3 g/ d. F' C; f) Q" `
  4. #include "task.h"
    3 G+ e2 T3 a# m7 k+ N! o) z$ c8 O
  5. #include "queue.h"* w7 F) t0 V( V0 L- \. j7 W
  6. #include "semphr.h"  n+ ?: @* X2 P/ K
  7. #include <stdio.h>6 {5 F- ]) \1 m0 O6 j, J& T
  8. #include <string.h>
    , w/ A( C. [- T9 u# z
  9. 7 p& `3 B% x  T- G5 c* E" t; K
  10. /* USER CODE END Includes */. b. Q- ^. x/ x+ b9 B8 {; g
  11. /* USER CODE BEGIN PV */
    5 a5 \- A" J( r7 d- y5 T6 T3 W/ x
  12. static TaskHandle_t AppTaskCreate_Handle = NULL;
    7 A! ?8 t8 D- S/ e& b% L
  13. static TaskHandle_t KeyTask_Handle = NULL;: P  V0 s9 B+ a% d$ T
  14. static TaskHandle_t Led1_Handle = NULL;1 L/ [, S3 w; U) l
  15. : Y, j3 n% g; A, m  H1 c
  16. SemaphoreHandle_t SemaphCount_Handle = NULL;
    $ l! l, V4 R: j4 U
  17. ; W8 a( W/ q/ {- o+ a* {8 @, a
  18. extern int f_printf(const char *format, ...);
    ' C% n5 K* j9 [) y8 P
  19. * k1 h$ n1 B- {3 J
  20. /* USER CODE END PV */- \+ o3 Q/ L: K; s. [1 F
  21. 5 x: a: U3 {# r7 ^& I: J6 ^
  22. /* USER CODE BEGIN PFP */; x# G- A4 |* x
  23. " C& e. G' A7 c. i8 d4 z, b8 F
  24. static void AppTaskCreate(void);! Y* p* V/ ^4 D% C% a! T
  25. static void KeyTaskCreate(void);" a/ x. ^1 k5 B0 n  V
  26. static void LED1TaskCreate(void);- O6 M6 ]& \0 X6 Y: C9 h
  27. / j: I9 K$ i9 g* e! P# p
  28. /* USER CODE END PFP */
    9 r* `$ ^/ {2 j+ n: T1 ^
  29. 8 j5 _2 @! X* o3 L* y
  30. int main()
    % Q$ P  u% u' h# \
  31. {7 w( r& y1 ?, a* q6 [6 u0 \  e) T; G
  32.   **** W$ }" D5 X! _" i% w! l7 a

  33. ; O( b  d8 N) h  v, H  T5 B
  34.   /* USER CODE BEGIN WHILE */
    7 }0 e! a; t7 {6 {' Y

  35. - {- N/ t" s3 {4 z3 U
  36.   UBaseType_t xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
    0 U# {5 O( O- N  |0 a. p( @8 |
  37.                                     (const char *)"APPTASKCREATE",5 T( }/ P: E& {8 g0 i7 l+ `
  38.                                                                         (uint16_t)    128,2 `4 S& S# U, t9 V2 u! w
  39.                                                                         (void *)      NULL,
    ( P! W& ^' U! ?$ q2 d! n- V
  40.                                                                         (UBaseType_t) 2,
    ( X# \3 F9 ~3 Q5 ~* y, b' }
  41.                                                                         (TaskHandle_t *)&AppTaskCreate_Handle);: `& l( _: Z+ d6 \) O& Y
  42.         if(xReturn ==pdPASS)
    9 y1 d/ N6 E/ w" ^2 K* V
  43.         {& ]6 e5 f1 C6 N* Y
  44.                 f_printf("TASK START.\r\n");
    , k- |) |8 \  o3 `% X# q* s
  45.                 vTaskStartScheduler();
    ! y5 z+ c& V; J9 ^2 I% s) ]
  46.         }8 q1 {( F0 j' Y7 ^7 @3 A
  47.   while (1)3 M' ]+ f. [$ X! A' |- z
  48.   {
    & N9 g" d+ i2 O2 j* \0 ]: {% T$ l
  49.     /* USER CODE END WHILE */. i  X$ {$ d2 @7 _+ \+ [; W
  50. 7 ~/ c* U+ g. T9 D% m* F, `: o
  51.     /* USER CODE BEGIN 3 */; A1 u. f# G+ E" e
  52.   }* j" i- M+ i4 g. a0 v, n! M
  53.   /* USER CODE END 3 */
    ) h, L- a2 c1 P, v  h. I1 q" a7 E
  54. }
    7 o, ^) k. d0 q" ?

  55. 0 K2 H0 l5 T2 B' u/ K1 [5 E6 V& `
  56. /* USER CODE BEGIN 4 */) Z6 f0 A  `2 v! w# x* B) n
  57. static void AppTaskCreate(void)1 `) E( V2 J. F
  58. {# O4 v( T2 \' z, p0 [2 _1 n) f

  59. . ^% J% Q7 W  L, W; n6 I
  60.   UBaseType_t xReturn ;4 H' Z7 r7 ^% z* n+ z& z; f
  61.         xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,' |1 {* V# X  ?; u
  62.                                     (const char *) "KEYTASKCREATE",, C4 `% Q  M6 G1 @; J
  63.                                     (uint16_t)      128,
    * x) ?/ [- e1 @' ^9 Y$ n# e
  64.                                                                         (void *)       NULL,
    ; @- Z+ P8 l3 Y4 q' e$ e
  65.                                                                         (UBaseType_t)   2,
    + v, u+ Y" {4 g
  66.                                                                         (TaskHandle_t*)&KeyTask_Handle);8 M5 {; N2 E, ~
  67.   if(xReturn == pdPASS)
    ! t& Q8 y2 G, d0 `. ]; s
  68.                 f_printf("KEY CREATE PASS.\r\n");  ^* M1 ?! S+ M  A: ?

  69. # a6 ?: Y9 W; s, @) J6 E. _) x
  70.   xReturn = xTaskCreate((TaskFunction_t)LED1TaskCreate,# |- e8 G  z1 L
  71.                                                 (const char *)  "LED1TASKCREATE",
    : O; a& [7 q8 w
  72.                                                 (uint16_t)      128,
      z$ v5 n' @3 U( }# l5 g
  73.                                                 (void *)        NULL,
    # @: X) x6 B0 H
  74.                                                 (UBaseType_t)   1,
    $ r3 q3 I0 c* }' f# q2 k/ O' H
  75.                                                 (TaskHandle_t*)&Led1_Handle);
    6 c, x# P7 w! f6 k" w( b9 H* C& `/ o* t; U

  76. 0 c2 [3 f4 I7 h: g* J% {) e1 Z" I
  77.         SemaphCount_Handle = xSemaphoreCreateCounting(3,0);
    ) @1 r$ w( _( {1 c* Y8 B: T( n3 [
  78.         if(SemaphCount_Handle != NULL)/ p$ R* j& u" P6 k) y
  79.                 f_printf("SEMAPHORE COUNT CREATE PASS.\r\n");
    / f7 |( ]0 ^$ v+ E
  80.         
    / u% y1 M; y( S' T! w
  81.   if(xReturn == pdPASS)
    3 G- h8 I9 K: g' ]
  82.         {
    : k! P' J7 |+ p* a
  83.                 f_printf("LED CREATE PASS.\r\n");        ( P/ `* w9 H# h# S5 P4 t8 ^& i
  84.                 vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);+ F& l8 ?- Z9 |& j: d  h' A+ _, u% w
  85.         }
    ! n9 m2 d" l5 T+ i* r$ ]7 C, W0 \
  86. }
    7 }0 x0 }2 a$ \
  87. : z$ m6 R% {; _2 b
  88. 7 F/ `6 q1 H/ e4 A! F& p' [
  89. static void KeyTaskCreate(void)
    " X9 ~+ m/ v2 N- B: }
  90. {
    4 e2 j( M2 ~- M, x) \1 q4 a
  91.   while(1)6 w1 c0 ?" g) k. F  |
  92.         {
    ( r8 G; H" z) E& _  H! _, H
  93.                 UBaseType_t xReturn = pdPASS;. q3 A* d6 ], P' R& }9 f
  94.     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))3 y$ j7 ~2 V9 j  _+ N% R" d& L! v
  95.                 {
    , g  N& g3 `/ X+ W
  96.                         vTaskDelay(100);1 R, V, y. \3 \! L6 {) S6 G
  97.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))! M  V: k; V. h: ]4 r# _1 I8 p
  98.                         {
    0 ~4 {; V. k0 H# b# W. W
  99.                                 f_printf("KEY PRESS.\r\n");) X5 p2 X! [- |# J  x6 J7 ~
  100.                                 xReturn = xSemaphoreGive(SemaphCount_Handle);! A$ D. X+ z  F  `7 i/ t
  101.                                 if(xReturn == pdPASS)
    ' G0 x! v9 _! Y% c! Y# {
  102.                                         f_printf("GIVE COUNTING PASS.\r\n");5 h& E, g4 S- q8 n5 T
  103.                                 else if(xReturn == errQUEUE_FULL)- c4 d: j6 Q- z7 Y3 u. W
  104.                                         f_printf("QUEUE IS FULL.\r\n");5 D2 j) X4 E: x! L8 J
  105.                         }5 f- b7 m1 F, ]5 d
  106.                 }               
    $ u% I1 |, H2 j5 @) q) u
  107.                 vTaskDelay(10);
    5 v' @# T, }; f
  108.         }, f: q! B# [6 t; @( \
  109. }) w1 v# D! k' A4 L" U
  110. static void LED1TaskCreate(void)/ p' a+ E* T( z
  111. {: y0 |# x2 P- {
  112.         while(1)
    / D& j& w% U7 B: q
  113.         {1 L- ], `2 Z( V6 \9 [
  114.                 UBaseType_t xReturn = pdPASS;- h, f  i$ G0 \) C7 s
  115.                
    ' e; p; u* N+ |: a; Q  B3 G5 s
  116.                 xReturn = xSemaphoreTake(SemaphCount_Handle,portMAX_DELAY);3 F, R" L$ e2 H3 m* v
  117.                 3 v# S8 K- W( v. X! T
  118.                 if(xReturn == pdTRUE)- B7 a. Q' `/ l3 U- w4 @
  119.                 {3 k1 d8 B. y' T7 A6 m8 A
  120.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);2 Y" b' m% n# M; _7 b
  121.                         f_printf("Counting Take PASS.\r\n");1 V9 s: ]/ a& a1 C) ~) C( w
  122.                 }
    . G5 D8 Q1 _. Z
  123.                 else if(xReturn == errQUEUE_EMPTY)
      Q/ {, e, C. ]  I" f7 W- b
  124.                         f_printf("semaphore is empty.\r\n");/ U7 s6 {! Z. B, Q
  125.                 vTaskDelay(2000);
      _$ ], ^7 L1 n
  126.         }/ R- S; ^1 G$ |# ?1 A5 C" u- S4 Y
  127. }* \" ?& X7 C6 B3 p6 }; D
  128. /* USER CODE END 4 */( `8 ~9 _* d* W( P/ r
  129. , f7 C; ]" j; W  U/ w
复制代码

; ?% ~+ z. Q& k9 [1 h
赞 收藏 评论0 发布时间:2021-11-12 01:00

举报

0个回答

所属标签

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