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

基于STM32和FreeRTOS的二值信号量实现任务同步

[复制链接]
STMCU小助手 发布时间:2022-11-30 15:00
引言在嵌入式开发中,只要你使用实时操作系统,那么使用信号量可以说必不可少。我们常使用信号量进行同步或互斥。
: ^% ^8 |1 L; J( v$ m0 }
; ]6 n  k0 Y9 E3 W6 z
信号量介绍
; d7 t3 M" ~+ W& e3 M3 R* F信号量(semaphore)是一种用于提供不同进程之间或者一个给定的不同线程间同步手段的原语。信号量多用于任务间的同步与互斥。信号量在FreeRTOS中分为三种:计数型信号量、二值信号量和互斥信号量。# q4 s% o, n# e3 j3 g; N' K$ t9 \
1.同步:处理竞争就是同步,安排进程执行的先后顺序就是同步,每个进程都有一定的个先后执行顺序。' |6 M9 ~) F5 Q0 C9 ~
2.互斥:互斥访问不可共享的临界资源,同时会引发两个新的控制问题(互斥可以说是特殊的同步)。
) y/ R7 p2 ]" W( n; V1 Q, S, b- J
3.竞争:当并发进程竞争使用同一个资源的时候,我们就称为竞争进程。
: p2 J* ]+ o3 y- |) R( A
3 ~) k4 \/ |' p+ D9 t5 Y9 D
二值信号量顾名思义就是信号量取值只有0和1的信号量,但他与互斥信号量不同,他没有优先级继承机制,也不是获取和释放均只能在同一个任务里进行。在实现任务间同步中,使用的非常广泛。6 @  Y& C0 ^( ^: F+ X
* Z) ]* f9 }1 Z( I$ d6 ?
准备9 T7 F8 c3 _# t! e- t. z) X
硬件
" ^! C4 o0 n" H. l. G- f; |1.STM32F103开发板0 B. }8 b" W! i$ Q
2.LED灯  G. d* P1 K) g, V+ W
% v% _) q" l1 G, i9 Z4 S; y
软件5 y. z( t7 U* i& s6 X+ g+ E
1.Keil 5) r' `3 j7 n1 }& d7 W* l6 @
2.STM32CubeMX
# h, G; n! [; y5 Q" G5 n
3.串口调试助手
' w, ^4 P" A: Y* w' m5 k8 E1 F# M+ `  W. F- d
功能设计+ s( _* y+ q, p8 B# X+ \
需求设计# V% B+ M9 U; S# x
设置两个任务和一个信号量。
; W: [7 T/ e# b* L; ^$ q8 y任务1运行时会令LED1闪烁,并串口发送01,当运行4次任务1后,任务1会释放二值信号量。; {- q- d3 r& _/ n
任务2首先获取二值信号量,如果获取失败任务进行调度。当获取到信号量时,任务2会执行LED2闪烁,并串口发送02。: s$ A8 `4 T$ }& [. ?1 ?
实现任务1 每运行四次,任务2运行一次。7 d  d( K: T: d* j1 ]3 W. \
; o, z, `7 l2 q6 t
软件实现, F+ _6 O) s6 u; K
1.信号量定义# I, B7 k+ {( s+ _4 \- @8 [: t
下面的程序目的是创建了一个二值信号量。' c- w2 Y  A& E6 {, x/ T2 v
  1. #include "Semaphore.h"SemaphoreHandle_t LED_Semaphore;void initSemaphore(void){5 R" W* G$ m! ?! L5 x  w
  2.          LED_Semaphore =xSemaphoreCreateBinary();2 I/ T$ J. y) ~
  3.          configASSERT(LED_Semaphore          != NULL);}
复制代码
  [& ~) U' D" P9 i, @
7 L! O, ]0 M6 J3 U4 M+ O
2.任务1) q6 G) z* |( `  M$ \
主要是每次执行一次闪烁和串口发送01,当执行第四次的时候,释放信号量。' C# p  d# ^, [7 |& o
  1. void LED1ToggleTesk(void const * argument){5 a8 d! ?. r6 ]* u$ A( [  U! \4 O# L
  2.         BaseType_t xReturn=pdTRUE;
    1 z" S% p3 x' G7 @0 x+ ]
  3.         int ledtime1=4;0 F( d( f' w4 d* G3 h1 M1 u9 ^3 p
  4.   for(;;)
    5 h8 e# u2 n5 M7 A
  5.   {, C/ N; x$ `2 H5 g( p8 v: q
  6.                 usart_send[0]=0x1;
    ( H7 Y7 Y9 x$ ^% x/ [
  7.                 ledtime1--;* Z9 v* u/ o8 U9 b5 t$ a
  8.                 if(ledtime1==0){
      g5 E$ }! R5 Y
  9.                 xSemaphoreGive(LED_Semaphore);
    9 r* B8 `" S1 ]' X9 x! ~: M
  10.                 ledtime1=4;                8 I/ b/ O5 S, J# X
  11.                 }0 S4 P' t2 ]3 X1 J
  12.           HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);        5 k6 k" ^2 g" }' S
  13.         HAL_UART_Transmit(&huart3,usart_send,1,portMAX_DELAY);
    7 n; s( U. Y/ P. X* u% X
  14.     vTaskDelay(1000);
    7 P$ N6 V1 H( b: u
  15.   }}
复制代码
0 ]( w8 Q3 X: I; p8 P* I4 s) G1 X
3 J9 V' f4 Y. \/ P
3.任务2
+ n  O8 E/ L' U  j+ p! L, R任务2主要执行的是,当获取的信号量时,LED2翻转,并串口发送02。/ U4 w3 H; {. `: G: Z4 f' \3 ~
  1. void LED2ToggleTesk(void const *argument){
      \, m" g1 p3 @( M) ^% `1 c  d! x! J0 O
  2.         BaseType_t xReturn=pdTRUE;
    & w) Z" \& F: F) n; Z
  3.         for(;;)
    $ Y6 i: r7 o7 {- \% K
  4.         {
    - `, x+ y/ }) A+ l" J
  5.                 usart_send[0]=0x2;
    ) g3 R, C; r7 X0 m1 l9 x+ q# A
  6.                 xReturn =xSemaphoreTake(LED_Semaphore,0);+ e8 w% M* A* v# X7 p$ P! q
  7.           if(xReturn==pdTRUE)
    0 y" Z$ h) c$ ^
  8.                 {
    3 _' j$ J' A: g; u$ H' s/ M- M2 w
  9.       HAL_UART_Transmit(&huart3,usart_send,1,portMAX_DELAY);. b: @$ Z* W- N: }; @9 X' t0 g# O! z
  10.         HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
    8 d, E0 p0 _8 ?& {0 j/ t
  11.                 }3 ]. u! B) T" q! b) B: L' j3 j
  12.                 vTaskDelay(1000);; D1 X& n  y6 M% F8 a' L8 j$ Z2 g2 A
  13.         }  }% R$ x; r+ K& p
  14.         }
复制代码

% h) U9 O, O$ m; |% {/ z& R
2 N( c3 z5 `+ L0 u' q

; e0 ^2 w7 b! p% Y现象7 \( }, I! L6 |
实现的现象是LED1始终在翻转,串口始终发送01,当执行四次上述现象的时候。LED2翻转并串口发送02.
/ D! I0 A7 `9 Z
' G1 c0 W" E+ Q) L+ t4 m! M# F  d3 L# u0 G/ K- s& p$ U! |2 S6 U

1 {2 R  j/ T5 P$ S7 p 640.png , Q9 `" i% y6 V& L* T
5 u2 G5 M" S2 Y% s6 E" Z$ [
& u1 `. p4 S6 J2 I' H9 a0 w
转载自: 跋扈洋5 n5 L% f6 N  m7 ~' S1 m0 N+ D; @/ _

" z; k( C4 S+ y- E

: N5 ?$ n, r; |& E* ^9 f4 }9 W+ x$ {6 [: |: v" [9 U3 Z, Q5 _

3 i* D# I2 N7 D+ R# T. j
赞 收藏 评论0 发布时间:2022-11-30 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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