4- 信号量& 互斥量
信号量,计数值
问题: 还是那个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) &

4- 信号量& 互斥量的更多相关文章
- OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)
一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...
- 【转】【Linux】 临界区,互斥量,信号量,事件的区别
原文地址:http://blog.itpub.net/10697500/viewspace-612045/ Linux中 四种进程或线程同步互斥的控制方法1.临界区:通过对多线程的串行化来访问公共资源 ...
- [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程
一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http ...
- Linux驱动学习笔记(6)信号量(semaphore)与互斥量(mutex)【转】
转自:http://blog.chinaunix.net/uid-24943863-id-3193530.html 并发导致竟态,从而导致对共享数据的非控制访问,产生非预期结果,我们要避免竟态的发生. ...
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...
- linux 线程的同步 一 (互斥量和信号量)
互斥量(Mutex) 互斥量表现互斥现象的数据结构,也被当作二元信号灯.一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源. ...
- FreeRTOS的信号量和互斥量
1. 理解如下,言简意赅的说,信号量解决同步,互斥量解决竞争. 信号量用于同步,主要任务间和中断间同步:互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁. 互斥量具有优先级继承,信 ...
- 信号量和互斥量C语言示例理解线程同步
Table of Contents 1. 线程同步 1.1. 用信号量进行同步 1.2. 用互斥量进行同步 2. 参考资料 线程同步 了解线程信号量的基础知识,对深入理解python的线程会大有帮助. ...
- CPP-基础:windows api 多线程---互斥量、信号量、临界值、事件区别
http://blog.csdn.net/wangsifu2009/article/details/6728155 四种进程或线程同步互斥的控制方法:1.临界区:通过对多线程的串行化来访问公共资源或一 ...
- 1.linux系统基础笔记(互斥量、信号量)
操作系统是很多人每天必须打交道的东西,因为在你打开电脑的一刹那,随着bios自检结束,你的windows系统已经开始运行了.如果问大家操作系统是什么?可能有的人会说操作系统就是windows,就是那些 ...
随机推荐
- el-tree只展示前三个节点数据
后端也返回了第四等级,但是不想让他展示,可以这样解决只展示前三等级 // 获取room树 getRoomTreeList() { getRoomTree().then((res) => { // ...
- ROS之交叉编译配置
参考资料: https://zhuanlan.zhihu.com/p/183819313 https://www.guyuehome.com/33759 1.原理 所谓的交叉编译,其实我们可以从编译原 ...
- 教你用JavaScript实现粘性导航
案例介绍 欢迎来的我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个粘性导航.移动页面导航仍在页面上方.通过实战我们将学会scrollY属性.offse ...
- 双层nn逻辑回归BP过程的另外一种解释
双层nn逻辑回归 吴恩达的双层nn逻辑回归的一些符号说明比较复杂导致视频难以理解,这里简单做一个说明 注意:阅读下面内容需要具备基本的矩阵求导知识 下面是手推过程,有空在进行修改
- Kubernetes 1.26.0实战:在本地配置k8s集群
阶段一:开发环境及版本 以下环境均来自官网: 本地宿主机环境:Windows 10 21H2 64位 虚拟机软件:VMware workstation 15.5 pro 虚拟机镜像版本:ubuntu- ...
- NC23051 华华和月月种树
题目链接 题目 题目描述 华华看书了解到,一起玩养成类的游戏有助于两人培养感情.所以他决定和月月一起种一棵树.因为华华现在也是信息学高手了,所以他们种的树是信息学意义下的. 华华和月月一起维护了一棵动 ...
- jq 完成复选框的全选和全不选,并组装成数组发送到后台
jQuery 代码实现,HTML dom节点对应js的id 即可 <script> $(function() { //复选框全选和全不选 $("#selectAll") ...
- python第五章pta习题总结
四.编程部分 1.sorted函数: sorted(iterable, cmp=None, key=None, reverse=False) #iterable:可迭代的对象 #cmp:比较规则 #k ...
- 跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA)
跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA) 介绍:首先在 Ziya-LLaMA-13B-V1基线模型的基础上加入中医教材.中医各 ...
- C++的strcat实现
#include <iostream> #pragma warning(disable:4996); using namespace std; char* t = (char*)mallo ...