首页 > 其他分享 >4- 信号量& 互斥量

4- 信号量& 互斥量

时间:2023-09-16 16:13:06浏览次数:43  
标签:优先级 解锁 xBinarySemaphore 信号量 互斥 串口

信号量,计数值

问题:  还是那个AB任务互斥调度的问题,B等A执行完毕的过程中,判断标志位会耗费CPU资源

利用信号量,当没有信号的时候,不参与调度

计数信号量(不能用来传输数据)

static SemaphoreData_t xSemCalc;

Xsemcalc=xSemaphoreCreateCounting(10,0);//最大值,初始值

 计算完成后信号量+1

 当任务1计算还没完成的时候,任务2阻塞在xSemaphoreTake (设置了永远等待直到信号量到来)  ,当任务1计算完毕,信号量+1,任务2获取到信号量,打印

#include "semphr.h"

 

二进制信号量实现互斥,(使用串口)

SemaphoreHandle_t xBinarySemaphore;

xBinarySemaphore = xSemaphoreCreateBinary( );

xSemaphoreGive(xBinarySemaphore)    使串口可以使用

谁要用串口就要先获得信号量

 xSemaphoreTake(xBinarySemaphore, portMAX_DELAY)

用完后再释放掉

xSemaphoreGive(xBinarySemaphore)    让其他人可以使用

 

 

 

互斥量

问题:上面的二进制信号量,正常是A用完A解锁,但是异常情况下(比如人编程问题),导致A还没用完就切换出去到C,C执行完毕后把A的信号量解锁了,此时B就有可能拿到信号量去使用串口,就跟A冲突在一起

解决办法: 谁上锁谁解锁(FREERTOS没有实现,只能靠程序员)

问题:优先级反转:

ABC任务优先级递增,A加了锁,B抢占,然后C抢占,C拿不到锁被阻塞,然后B开始运行,  明明C优先级最高,但是得不到执行

解决办法:优先级继承

ABC任务优先级递增,A加了锁,B抢占,然后C抢占,C拿不到锁被阻塞,LOCK的同时使加锁的A继承C的优先级(先执行),A执行后释放锁(又回归原来的优先级),C就可以执行,、

使用条件:使用mutex  自动实现优先级继承解决优先级反转的问题

 

问题:递归上锁

 A执行函数加锁,嵌套的函数又想获得锁,就阻塞了,没办法解锁,形成死锁

解决办法:递归锁 (在锁上后,还可以获得这个锁【同一个】,一一配对解锁就行)

10-1OVER

 使用互斥量实现互斥

static SemaphoreHandle_t xSemUART;
xSemUART = xSemaphoreCreateMutex();

void TaskGenericFunction(void * param)
{
    while (1)
    {
        xSemaphoreTake(xSemUART, portMAX_DELAY);
        printf("%s\r\n", (char *)param);
        xSemaphoreGive(xSemUART);
        vTaskDelay(1);  //与
    }
}

    xTaskCreate(Task1Function, "Task1", 100, NULL, 1, &xHandleTask1);
    xTaskCreate(Task2Function, "Task2", 100, NULL, 1, NULL);

是个特殊的信号量

二级制信号量初始值是0,创建后需要Give -次; 斥量初始值是1,创建后不需要Give 次。

 延时有什么区别vTaskDelay(1)  &

 

标签:优先级,解锁,xBinarySemaphore,信号量,互斥,串口
From: https://www.cnblogs.com/liujinmeng/p/17705927.html

相关文章

  • RTOS学习记录2:同步与互斥
    同步和互斥循环检测某个变量是否已经释放的方式占用较多,效率较低。需要加一些函数,让其进入到blocked(阻塞)状态Task3和Task4同时使用串口打印信息时,没有设定mutex,因此打印出来的内容各有混杂。通过设定USARTFlag来实现互斥+Delay让出优先权。正确性和效率:1.队列FIFO:传送带,流水线......
  • 3 - 任务调度算法 & 同步与互斥 &队列
    之前的都是按照优先级不同允许抢占(不讲道理),不管你在做什么,轮到优先级最高的任务,直接抢占执行怎样才能讲道理呢?稍微等等嘛,等我做完活你再做 1支持抢占,0不支持抢占 同优先级任务是否交替执行,1交替0不交 空闲任务是否礼让其他任务礼让的话,自己的函数逻辑在时间片内只执行......
  • 多任务互斥与同步
    多任务互斥与同步1.互斥和同步概述同步和互斥是用于解决如下两个问题:1)在多任务操作系统中,同时运行的多个任务可能都需要访问/使用同一种资源。2)多个任务之间有依赖关系,某个任务的运行依赖于另一个任务互斥:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不......
  • 25进程/join方法/互斥锁
    代码创建进程"""创建进程的方式有哪些1.鼠标双击桌面一个应用图标2.代码创建创建进程的本质:在内存中申请一块内存空间用于运行相应的程序代码"""#第一种创建进程的方式》》对象#frommultiprocessingimportProcess#importtime###deftask(name)......
  • HarmonyOS/OpenHarmony(Stage模型)应用开发组合手势(三)互斥识别
    互斥识别组合手势对应的GestureMode为Exclusive。互斥识别组合手势中注册的手势将同时进行识别,若有一个手势识别成功,则结束手势识别,其他所有手势识别失败。以在一个Column组件上绑定单击手势和双击手势组合而成的互斥识别组合手势为例,由于单击手势只需要一次点击即可触发而双击手势......
  • C# 信号量 Semaphore
    ///<summary>///信号量,类似于占坑机制,初始设为5个空的坑位,且最大5个位置///</summary>staticreadonlySemaphoresemaphore=newSemaphore(5,5);staticvoidTest(){Task.Run(AAA);BBB();......
  • Go语言中互斥锁的最佳实践
    使用互斥锁是确保多个goroutine之间共享数据安全访问的一种常见方式。以下是互斥锁的最佳实践:仅在必要时使用互斥锁:互斥锁的目的是保护共享资源,但不是所有变量都需要被互斥锁保护。只有在多个goroutine并发访问的数据结构或变量上使用互斥锁,以避免不必要的锁定。小范围锁定:......
  • 初探信号量机制
    什么是信号量机制1965年,荷兰学者EdsgerDijkstra提出了一种经典的实现进程互斥、同步的方法--信号量机制。信号量机制用于解决并发访问共享资源的同步问题。信号量机制的主要目的是确保多个进程在共享资源时不会发生冲突,并且能够正确地同步和通信。信号量机制如今在操作系统......
  • CSSE7610互斥算法分析
    Assignment1:MutualexclusionCSSE7610Answerquestions1to3below.Thisassignmentisworth25%ofyourfinalmark.Itistobecompletedindividually,andyouarerequiredtoreadandunderstandtheSchoolStatementonMisconduct,availableontheSchoo......
  • chatGPT的js信号量实现
    信号量类在JavaScript中,可以使用Promise和async/await来模拟信号量,下面是一个简单的信号量实现:classSemaphore{constructor(maxConcurrency){this.maxConcurrency=maxConcurrency;this.currentConcurrency=0;this.queue=[];}asyncacqu......