liunx驱动----信号量的实现
使用信号量必须包含 <asm/semaphore.h> 头文件.其中相关结构体 struct semaphore
可以通过以下几种方式来声明或者初始化。
1.void sema_init(struct semaphore *sem, int val)
代码如下:val为设置信号量的初始值
static inline void sema_init(struct semaphore *sem, int val)
{
atomic_set(&sem->count, val);//设置型号量的初始值。
sem->sleepers = ;
init_waitqueue_head(&sem->wait);
}
2.DECLARE_MUTEX(name)
#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
将一个信号量初始化为1
3.DECLARE_MUTEX_LOCKED(name)
#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
将一个信号量初始化为0
注意:1表示信号量打开,可以访问。0表示锁定。
在运行的过程中初始化信号量:
static inline void init_MUTEX(struct semaphore *sem)
static inline void init_MUTEX_LOCKED(struct semaphore *sem)
down函数作用是减小信号量的值。
static inline void down(struct semaphore * sem)//减小信号量的值,在必要的时候一直等待。
static inline int down_interruptible (struct semaphore * sem)//与down效果一样,只是说操作是可以中断的。
static inline int down_trylock(struct semaphore *sem)//函数中没有调用might_sleep(); 所以不会休眠,调用时会立即返回
liunx驱动----信号量的实现的更多相关文章
- liunx驱动----异步通知
查询:消耗资源 中断:read 一直要去读 poll :指定起始时间 异步通知 signal 测试程序 include <stdio.h> include <signal.h> ...
- liunx驱动之字符设备的注册
上一篇文章学习了如何编写linux驱动,通过能否正常加载模块进行验证是否成功,有做过liunx应用开发的小伙伴都知道驱动会在'/dev'目录下以文件的形式展现出来,所以只是能加载驱动模块不能算是完成驱 ...
- liunx驱动----USB驱动
现象:把usb设备接入电脑 1.Windows发现设备 2.跳出一个对话框提示安装驱动程序 问1:既然没有驱动程序,为什么了够知道是什么驱动了?? 答1:Windows里面已经有了usb总线驱动程序, ...
- liunx驱动----按键中断
liunx 中断 先设置异常入口 异常向量 void __init trap_init(void) 构造了异常向量 vector_irq+offset 按下按键: cpu自动进入异常模式 ...
- liunx驱动----点亮LED
自动挂接根文件系统(直接从NFS启动) 修改uboot命令行 把 bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 ...
- liunx驱动----构造和运行模块
以hello world模块为例 #include <linux/init.h> #include <linux/module.h> //在执行 insmod hlello 的 ...
- liunx驱动----系统滴答时钟的使用
2019-3-12系统滴答定时器中断使用 定义一个timer 其实就是使用系统的滴答定时器产生一个中断. 初始化timer init_timer函数 实现如下 void fastcall ini ...
- Android深度探索-卷1第七章心得体会
创建LED驱动的设备文件 第一步:使用cdev_init函数初始化cdev 第二步:指定设备号.直接在代码指定或动态分配 第三步:使用cdev_add函数将字符设备添加到内核中的字符设备数组中 第四步 ...
- Linux 驱动——Button驱动6(mutex、NBLOCK、O_NONBLOCK)互斥信号量、阻塞、非阻塞
button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...
随机推荐
- 2018百度之星B轮 degree
degree Accepts: 1581 Submissions: 3494 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/1 ...
- window.location.href 兼容性问题 (ie 浏览器下设置失效)
window.location.href 兼容性问题 (ie 下设置失效) window.location.href = "../index.html" (ie 浏览器失效) wi ...
- [CSP-S模拟测试]:电压机制(图论+树上差分)
题目描述 科学家在“无限神机”($Infinity\ Machine$)找到一个奇怪的机制,这个机制有$N$个元件,有$M$条电线连接这些元件,所有元件都是连通的.两个元件之间可能有多条电线连接.科学 ...
- hibernate一对一单项关联映射
一.主键关联 1.两个实体对象的主键一样,以表明它们之间的一一对应关系: 2.不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值. Pe ...
- mysql-8.0解压缩版安装配置完整过程
https://www.cnblogs.com/xiongzaiqiren/p/8970203.html
- 用Jquery选择器计算table中的某一列某一行的合计
核心算法: $('#tableId tr').each(function() { $(this).find('td:eq(columnIndex)').each(function() { totalA ...
- easyhook源码分析一
easyhook简要说明: easyhook是一个开源的hook库(http://easyhook.github.io/),其支持托管代码(.NET)和非托管代码(C/C++)hook,这里只分析了其 ...
- web开发中会话跟踪的方法
1. 什么是会话 会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程. 2. 什么是会话跟踪 对同一个用户对服务器的连续的请求和接受响应的监视.(将用户与同一用户发出的不同请求之间关联, ...
- c++ 事件回调 java
#pragma once #ifdef __cplusplus extern "C" { #endif typedef void(*sig_t)(int); int FirstEl ...
- 【HBase】五、HBase的Java接口
HBase是Hadoop中的一个重要组件,自然也是基于Java语言开发的,因此HBase有很好的Java接口供程序员调用,通过一个例子来演示java如何使用HBase数据库. 要想在HBase ...