单片机
返回首页

同步、互斥、阻塞

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调试总结

相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章