三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

信号量与互斥体对zynqMP的ps_led的互斥访问

信号量与互斥体对zynqMP的ps_led的互斥访问

信号量

1信号量简介

2信号量与自旋锁区别:

  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)添加互斥体

  1. 初始化

(3)修改open函数:打开互斥锁(mutex_lock_interruptible函数如果获取互斥体失败,只会进入休眠,并不会返回非零值。如果是被打断了则会返回非零值)

(4)修改release函数

4.实验结果

实验现象与信号量实验一样。

← 返回列表