信号量与互斥体对zynqMP的ps_led的互斥访问
信号量
1信号量简介
2信号量与自旋锁区别:
- 当线程满了以后,自旋锁会一直循环等待,而信号量会引起休眠与阻塞(阻塞态)。
- 信号量适用于占用资源比较久的场合,而自旋锁的临界区不能耗时太久(注意一个进程从运行态变成休眠态也是需要消耗资源的,这个消耗可能比一个进程在外面循环等待的消耗还要久,所以信号量不适合共享资源持有时间短的)。
·3信号量API函数
dowm函数就是对应原子操作P,up函数对应原子操作V。
4信号量实验(gpioled.c为基础)
(1)在结构体中加入信号量
(2)初始化:规定过一个信号量val它的值<=1,称为二值信号量(实现对资源的互斥访问),否则称为计数形信号量。
(3)修改open函数:就是获取信号量(dowm_interruptible函数如果获取信号量失败,只会进入休眠,并不会返回非零值。如果是被打断了则会返回非零值)
(4)修改release函数:调用up代码
5实验结果
当第二个应用程序去访问这个led设备的时候,它并没有报错,并没有显示打开文件失败,反而是进入了一个休眠状态,等待信号量可用的时候,它才会被唤醒,并且去执行自己的操作。
6. dowm_interruptible与dowm区别
Ctrl+c是中断的一种,如图如果使用的dowm函数,第二个应用程序去访问这个led设备的时候,进入了休眠状态,这个时候Ctrl+c结束不了进程。
互斥体
1.互斥体简介
注:互斥体 = 互斥锁 = 二值信号量,是专门用于信号互斥访问。
注:特点12与信号量一样,特点3和自旋锁一样。
2.互斥体API函数(only one task can hold the mutex at a time)
3.互斥体实验
(1)添加互斥体
- 初始化
(3)修改open函数:打开互斥锁(mutex_lock_interruptible函数如果获取互斥体失败,只会进入休眠,并不会返回非零值。如果是被打断了则会返回非零值)
(4)修改release函数
4.实验结果
实验现象与信号量实验一样。
