同步、互斥、阻塞

发布者:平凡梦想最新更新时间:2024-07-31 来源: cnblogs关键字:互斥  阻塞 手机看文章 扫描二维码
随时随地手机看文章

实现

使驱动程序只能同时被一个应用程序操作。

   

幕后:m+1

①把变量m加载到寄存器

②执行寄存器运算,并把运算结果保存到

③把运算结果写回内存

 

单任务系统

当应用程序open某个驱动时,只需使用一个全局变量标记,再有其他应用程序打开这个驱动时,则直接退出(打开失败)。

   

多任务系统

  1. 由于修改变量的值,并不是一步到位的,而是需要使用多个指令,才能完成最终的操作;

 

当app1执行完①(未真正修改到存储于内存的变量),cpu紧接着执行app2部分的指令,将导致两个app读到的f_open值是一样的(设初次打开),那么将导致驱动在同一时间内,并不是被唯一的app操作!

 

在多任务系统中,实现使驱动程序只能同时被一个应用程序操作的方法:原子操作、信号量

1. 原子操作

原子操作指的是在执行过程中不会被别的代码路径所中断的操作。

常用原子操作函数举例:

atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0

atomic_read(atomic_t *v); //返回原子变量的值

void atomic_inc(atomic_t *v); //原子变量增加1

void atomic_dec(atomic_t *v); //原子变量减少1

int atomic_dec_and_test(atomic_t *v); //自减操作后测试其是否为0,为0则返回true,否则返回false。

   

2. 信号量

信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码。

当获取不到信号量时,进程进入休眠等待状态。

   

定义信号量

struct semaphore sem;

初始化信号量

void sema_init (struct semaphore *sem, int val);

void init_MUTEX(struct semaphore *sem);//初始化为0

   

static DECLARE_MUTEX(button_lock); //定义互斥锁

   

获得信号量

void down(struct semaphore * sem);

int down_interruptible(struct semaphore * sem);

int down_trylock(struct semaphore * sem);

释放信号量

void up(struct semaphore * sem);

   

3. 阻塞

阻塞操作

是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。

被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。

   

非阻塞操作


关键字:互斥  阻塞 引用地址:同步、互斥、阻塞

上一篇:异步通知
下一篇:SDRAM调试总结

推荐阅读最新更新时间:2026-03-13 06:44

永磁电机属于同步电机为什么
永磁电机确实属于同步电机的一种类型。首先我们了解永磁电机一些基本的概念和原理。 永磁电机概述 永磁电机(Permanent Magnet Motor, PMM)是一种利用永磁体产生磁场的电机。它与传统的电磁电机(Electromagnetic Motor)不同,后者依赖于电流通过线圈产生磁场。永磁电机因其高效率、高功率密度、低维护成本和良好的控制性能而被广泛应用于各种领域,如工业自动化、电动汽车、风力发电等。 同步电机定义 同步电机(Synchronous Motor)是一种交流电机,其转子转速与输入电源的频率成正比,与电机的极数成反比。这种电机的转子通常由导体构成,当它在定子产生的旋转磁场中旋转时,会在转子导体中感应出电流,
[嵌入式]
同步电机比异步电机节能为什么
同步电机和异步电机是两种常见的电动机类型,它们在工业和日常生活中都有广泛的应用。在讨论同步电机是否比异步电机节能之前,我们首先需要了解这两种电机的基本原理和特点。 同步电机的基本原理和特点 同步电机是一种转子转速与定子磁场同步的电动机。它的工作原理是利用定子绕组产生的旋转磁场,通过电磁感应在转子上产生电流,从而产生电磁力,驱动转子旋转。同步电机的主要特点如下: 1.1 高效率:同步电机的效率通常比异步电机高,因为它的转子与定子磁场同步,减少了能量损失。 1.2 稳定性好:同步电机的转速与电网频率和极对数有关,不受负载变化的影响,具有较好的稳定性。 1.3 功率因数高:同步电机的功率因数通常较高,可以减少无功功率的损耗,提高电网
[嵌入式]
OK6410A 开发板 (八) 73 linux-5.11 OK6410A linux 内核同步机制 互斥锁的实现
解决的问题是什么 所有异常原因 限制是什么 加锁函数会引起睡眠,所以不能... 实现 / https://elixir.bootlin.com/linux/v4.0/source/kernel/locking/mutex.c#L95 /* 我们将互斥锁/解锁逻辑分为单独的fastpath和slowpath函数,以减少fastpath上的寄存器压力。 我们还将fastpath放在内核映像的第一位,以确保CPU将分支预测为默认的untaken。 */ __visible void __sched __mutex_lock_slowpath(atomic_t *lock_count); /* 为此任务专门锁定互斥锁。 如果互
[单片机]
ucos-ii示例3:互斥型信号量测试
环境: 主机:WIN8 开发环境:MDK4.72 ucgui版本:3.90 ucos版本:ucos-ii mcu: stm32f103VE 说明: 本示例新建一个互斥型信号量,通过此信号量每次只能有1个任务使用资源函数resource 注意: 1.互斥型信号量的创建不能在内核初始化之前 2.互斥型信号量的请求和释放函数只能在同一个任务中执行,如果一个任务请求了信号量,另一个任务释放信号量的操作会失败 3.为了应对信号量导致的不同任务之间的优先级反转,互斥型信号量的创建需要设置一个优先级,且这个优先级必须是尚未使用的,否则会创建失败 效果图: 源码: #define TASK_STK_SIZE 512 /***
[单片机]
ucos-ii示例3:<font color='red'>互斥</font>型信号量测试
MSP430异步通信(发送)不阻塞CPU,含注释
需要硬件:USB转TTL TTL插电脑 ,再杜邦线连接430 现象:串口助手显示01 02 03 04 05 06 07 08 直接上代码 /************************* 发送数据帧的程序 利用发送中断,发送过程不阻塞CPU继续执行后续代码 Author:七禾页8 site:创客基地 缺点:必须整帧地发送数据。 需要将一次发送的数据都先整理完毕才能启动发送, 且必须等待上一帧发完才能启动下一帧的发送, 不能在程序中随时地按字节发送数据 **************************/ #include msp430x14x.h #define uint unsigned int #d
[单片机]
MSP430异步通信(发送)不<font color='red'>阻塞</font>CPU,含注释
stm32中非阻塞式多按键状态检测函数
最近做的项目中,关于按键检测调用比较多,因此我也做个适当用法总结。按键状态检测的原理,一般都是通过读相应IO口位是否置位来判断是否按下,并且用延时来消抖以及区分长短按。根据延时的用法,也可以区分为阻塞式和非阻塞式。阻塞式即在延时过程中一直等待到计数值,CPU一直被占用无法去执行别的过程,一般这样是不太合理的设计。所以我们都采用非阻塞式,即用轮询的方式去判断是否延时时间到达,其具体代码如下图: 具体思路就是在第一次检测到按下的情况下,给计时变量赋定时器的计数值,等到大于设定长按时间值后,赋长按状态值给按键状态位。等到松手后,若判断大于消抖时间后赋值短按,然后计时变量初始化,最后返回状态值。 但是这样的写法始终存在一个BUG,
[单片机]
stm32中非<font color='red'>阻塞</font>式多按键状态检测函数
C51非阻塞延时流水灯
#include reg52.h unsigned char counter=0; void delay()interrupt 1 using 1 { TL0|=0x00; TH0=0x4C; counter++; } main() { unsigned char i=1; TMOD=1; TR0=1; EA=1; ET0=1; TH0=0x4C; TL0=0x00; while(1) { if(counter==10) { counter=0; P1=~i; i =1; if(i==0) i=1; } } } 采用T0方式1定时,11.0592Mhz晶振,延时50ms。
[单片机]
C51非<font color='red'>阻塞</font>延时流水灯
液相色谱仪管路阻塞的原因与解决办法
广大实验人员在使用高效液相 色谱仪 的过程中,管路的堵塞是常发生的故障之一。 下文为您介绍液相色谱管路堵塞的原因与解决方法。   液相色谱管路阻塞的原因:1.没有很好过滤流动相;2.样品中有微粒;3.泵或进样器垫圈产生碎片;4.预柱、护柱和分析柱中漏出填料;5,毛刺和锉屑进入;6.流动相中的结晶盐;7.微生物 8.系统中进入了其它颗粒性物质。   液相色谱管路阻塞解决方法:   系统中管路阻塞的现象很少见,常见的是烧结过滤片(玻璃砂芯)阻塞。用烧结过滤器或过滤片(孔径2-10um)能去掉阻塞管路的微粒(如0.25mm管径)。用系统分段法检查阻塞的管路,从后向前分别松开接头检查,找到阻塞管路后,应立即拆下来疏导或换新。   
[测试测量]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved