正点原子linux阿尔法开发板使用——Linux 并发与竞争

原子操作

原子变量和原子位
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第1张图片
原子操作的API:正点原子linux阿尔法开发板使用——Linux 并发与竞争_第2张图片

正点原子linux阿尔法开发板使用——Linux 并发与竞争_第3张图片

自旋锁

1、自旋锁
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第4张图片自旋锁是轻量级的。
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第5张图片
自旋锁的定义:
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第6张图片自旋锁的API
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第7张图片自旋锁禁止抢占:
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第8张图片
线程与中断:
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第9张图片

自旋锁注意事项

正点原子linux阿尔法开发板使用——Linux 并发与竞争_第10张图片

信号量

正点原子linux阿尔法开发板使用——Linux 并发与竞争_第11张图片正点原子linux阿尔法开发板使用——Linux 并发与竞争_第12张图片

互斥体

正点原子linux阿尔法开发板使用——Linux 并发与竞争_第13张图片

正点原子linux阿尔法开发板使用——Linux 并发与竞争_第14张图片

Linux 并发与竞争实验

原子操作:
在结构体中添加lock原子变量。
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第15张图片
在open函数操作:
锁定驱动
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第16张图片释放驱动
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第17张图片
应用程序模拟应用占用驱动25S

应用程序跑25s,在这25s之内无法再次打开该GPIO。
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第18张图片
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第19张图片

自旋锁

结构体内添加新成员:
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第20张图片正点原子linux阿尔法开发板使用——Linux 并发与竞争_第21张图片
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第22张图片

正点原子linux阿尔法开发板使用——Linux 并发与竞争_第23张图片

spinlock是为了保护变量“state”

考虑到驱动的可移植性,推荐使用如下函数。

spin_lock_irqsave(&dev->lock, flags); 
	if (dev->state)
	{
		dev->state--;/*驱动可以使用*/
	}
	spin_lock_irqsave(&dev->lock, irqflag); 

信号量

包含头文件:

 #include 

初始化信号量
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第24张图片

获取信号量:
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第25张图片释放信号量:

正点原子linux阿尔法开发板使用——Linux 并发与竞争_第26张图片

信号量在休眠的时候会自动唤醒 进行下次实验。

互斥体

结构体中添加互斥体:
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第27张图片互斥体初始化:

正点原子linux阿尔法开发板使用——Linux 并发与竞争_第28张图片
上锁互斥体:
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第29张图片
解锁互斥体:
正点原子linux阿尔法开发板使用——Linux 并发与竞争_第30张图片

你可能感兴趣的:(#,嵌入式驱动linux,驱动开发,linux)