一:内核中断
linux内核中的看门狗中断跟之前的裸板的中断差不多,在编写驱动之前,需要线把内核自带的watch dog模块裁剪掉,要不然会出现错误;在Device Drivers /Watchdog Timer Support /S3C2410 Watchdo
在内核中,我们处理一个中断,必须先注册一个中断号,注册中断的函数是:
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
{
return request_threaded_irq(irq, handler, NULL, flags, name, dev);
}
irq是要申请的硬件中断号。
handler 是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev参数将被传递给它。
flags 是中断处理的属性,若 设置了IRQF_DISABLED ,则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程 序不屏蔽;若设置了IRQF_SHARED ,则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM,表示对系统熵有贡献,对系统获取随机数有好处。
name设置中断名称,通常是设备驱动程序的名称 在cat /proc/interrupts中可以看到此名称。
dev在中断共享时会用到,一般设置为这个设备的设备结构体或者为NULL
request_irq()返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。
在开发板上通过cat /proc/interrupts查看中断有没有注册成功:
下面代码实现是按键(key1)控制dog,dog控制灯,按键第一次按下灯闪,再次按下灯灭
#include
#include
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("bunfly");
irqreturn_t do_irq(int irq, void *data);
void led_on();
void led_off();
void wt_on();
void wt_off();
unsigned long gpio_virt;
unsigned long *gpm4con, *gpm4dat;
unsigned long wt_virt;
unsigned long *wtcon, *wtdat, *wtcnt, *wtclrint;
struct clk *wtclk;
int et_irq = ;
int bunfly_init()
{
int ret = ;
et_irq = gpio_to_irq(EXYNOS4_GPX3());//EXINT()获取外部中断号
ret = request_irq(et_irq, do_irq, IRQ_TYPE_EDGE_FALLING, "key 1", );//注册按键中断
if(ret < ) { //中断号 //处理函数
printk("request_irq error\n");
return ;
}
wtclk = clk_get(NULL, "watchdog");//设置时钟频率
clk_enable(wtclk);
ret = request_irq(IRQ_WDT, do_irq, IRQF_SHARED, "wangcai", );//注册watchdog中断
if(ret < ) {
printk("request_irq\n");
return ;
}
gpio_virt = ioremap(0x11000000, SZ_4K);//led的物理地址到虚拟地址
gpm4con = gpio_virt + 0x02e0;
gpm4dat = gpio_virt + 0x02e4;
wt_virt = ioremap(0x10060000, SZ_4K);//dog的物理地址到虚拟地址
wtcon = wt_virt + 0x00;
wtdat = wt_virt + 0x04;
wtcnt = wt_virt + 0x08;
wtclrint = wt_virt + 0x0c;
return ;
}
void bunfly_exit()
{
printk("this is bunfly_exit\n");
}
module_init(bunfly_init);
module_exit(bunfly_exit);
irqreturn_t do_irq(int irq, void *data)
{
if(irq == et_irq) {//判断是否为按键中断
static int flags = ;
printk("key 1 down\n");
if(flags) {
wt_on();
flags = ;
}
else {
wt_off();
led_off();
flags = ;
}
}
if(irq == IRQ_WDT) {//判断是否为狗中断
*wtclrint = ;//清中断
static int flags = ;
if(flags) {
led_on();
flags = ;
}
else {
led_off();
flags = ;
}
}
return IRQ_HANDLED;//处理完成
}
void led_on()
{
*gpm4con &= ~0xffff;
*gpm4con |= 0x1111;
*gpm4dat = 0x0;
}
void led_off()
{
*gpm4con &= ~0xffff;
*gpm4con |= 0x1111;
*gpm4dat = 0xf;
}
void wt_on()
{
*wtdat = 0x8000;
*wtcnt = 0x8000;
*wtcon = ( << ) | ( << ) | ( << ) | ( << );
}
void wt_off()
{
*wtcon = ;
}
Linux 内核中断内幕
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html#resources Linux 内核中断内幕 ...
Linux内核中断和异常分析(中)
在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线.所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,上次讲到单片机的时候,我就讲到了单片机 ...
Linux编程之《看门狗进程》
Intro 当我们编写服务器代码时,为了让自己的服务器在意外崩溃时能够及时的重启,软件看门狗就显示出它的作用了,该看门狗进程是通过fork一个子进程(业务进程),父进程一旦捕获到了子进程的结束信号就重 ...
Linux 下如何使用看门狗
Linux内核有集成WD的选项.将其使能后,系统里就会有watchdog的设备驱动:/dev/watchdog.这样,在应用程序里只需打开这个设备使用即可:#include
Linux内核中断学习
1.内核中断概述 (1)在OS环境下编写中断处理函数与之前在裸机中编写中断处理函数的方式是不一样的,在Linux内核中提供了一套用来管理硬件中断资源的软件体系架构. (2)在操作系统中,中断号与gpi ...
linux内核--中断处理程序
一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码.中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断 ...
Linux内核中断和异常分析(上)
中断,通常被定义为一个事件.打个比方,你烧热水,水沸腾了,这时候你要去关掉烧热水的电磁炉,然后再去办之前手中停不下来的事情.那么热水沸腾就是打断你正常工作的一个信号机制.当然,还有其它的情况,我们以后 ...
Linux内核中断和异常分析(下)
这节,我们继续上,中(以前的日志有)篇目进行分析,结合一个真实的驱动案例来描述linux内核中驱动的中断机制,首先我们先了解一下linux内核中提供的中断接口. 这个接口我们需要包含一个头文件:#in ...
Tiny4412中断之看门狗
一:看门狗(WDT watch dog timer) 看门狗其实是一个计数器,它的作用就是防止程序陷入死循环或者程序运行跑飞:看门狗是一个硬件,它的工作原理是,初始化给他一个值,它会过一段时间减一,直 ...
随机推荐
[HTML] IE=edge,chrome=1的META标签详解
文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. meta信息中常有这么一句:
rsync-3.0.6-64
http://rsync.samba.org/ 用的是rsync-3.0.6-12.el6.x86_64 Rsync version 3.1.1 released June 22nd, 2014 Rs ...
PHP.4-DIV+CSS标准网页布局准备工作(下)
DIV+CSS标准网页布局准备工作 区块属性(区块模型) 属 性 描 述 Margin(注) 是定义区块外边界与上级元素距离的属性,用1到4个值来设置元素的边界,每个值都是长度.百分比或者auto,百 ...
WebSocket刨根问底(二)
上篇文章[WebSocket刨根问底(一)]中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket ...
css预处理器:Sass LASS Stylus
语法 Sass h1 { color: #0982C1; } h1 color: #0982c1 LESS h1 { color: #0982C1; } Stylus /* style.styl */ ...
vs+qt 运行过程出现cannot run rc.exe
刚开始,我按照网上的一堆教程在qt creator中设置了各种东西,设置完以后,运行时出现cannot run rc.exe,根据百度,将C:\Program Files (x86)\Windows ...
Python之异常处理和socket套接字连接7
一.异常处理 1)异常处理的使用意义 什么是异常处理 异常是程序发生错误的信号,即程序一旦出错就会立刻产生一个异常,如果该异常没有被处理 那么异常就抛出来,程序的运行也随之终止 异常分为三部分: 异常 ...
你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...
bzoj 1053
代码: //本题要求不超过n的因子最多的最小的数,我们知道因子的个数可以有素因子的指数得出,题目限制n是2e9,我们可以排除掉一些情况然后暴力 //对于一个数必然是因子越小他的因子数越多,所以枚举最小 ...