4.中断分层设计

Linux是如何来处理中断嵌套的:

所谓的中断嵌套就是,当一种中断正在执行的时候,又产生了另外中断。可以是同类型的,也可以是不同类型的。

首先先来分析第一种类型:慢速中断:是指在进行中断处理的时候,中断的总开关是不关闭的。允许其他类型中断产生。

快速中断:当中断产生的时候,控制位的IF为被置1,别的中断被禁止发生。这样就会产生我们不想看到的情况:中断丢失。

这就是中断分层技术解决的问题:

所谓的中断分层就是,把一个中断分为了上部分和下部分。上部分是硬件相关的,必须要执行的。下部分是检查,处理工作的。可以先不做。这样就缩短了中断工作的时间。尽量避免了中断丢失的问题。

Work在工作队列里有多个,并不是所有的work都会得到工作,得有daemon线程来调度。

最重要的是func,一项工作就是一个函数的执行。就是func的执行。

Queue.c:

#include <linux/init.h>

#include <linux/module.h>

struct workqueue_struct *my_wq;

struct work_struct *work1;

struct work_struct *work2;

MODULE_LICENSE("GPL");

void work1_func(struct work_struct *work)

{

printk("this is work1->\n");

}

void work2_func(struct work_struct *work)

{

printk("this is work2->\n");

}

int init_que(void)

{

//1. 创建工作队列

my_wq = create_workqueue("my_que");

//2. 创建工作

work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);

INIT_WORK(work1, work1_func);

//3. 挂载(提交)工作

queue_work(my_wq,work1);

//2. 创建工作

work2 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);

INIT_WORK(work2, work2_func);

//3. 挂载(提交)工作

queue_work(my_wq,work2);

return 0;

}

void clean_que()

{

}

module_init(init_que);

module_exit(clean_que);

这是视频的代码,在编译的时候会报错误:

error: implicit declaration of function ‘kmalloc‘

解决的方法就是加个头文件:<linux/slab.h>就可以了。编译通过:

生成queue.ko驱动文件。

make -C /home/samba/linux-ok6410 M=/home/module/queue modules ARCH=arm CROSS_COMPILE=arm-linux-

make[1]: Entering directory `/home/samba/linux-ok6410‘

CC [M] /home/module/queue/queue.o

/home/module/queue/queue.c:44: warning: function declaration isn‘t a prototype

Building modules, stage 2.

MODPOST 1 modules

CC /home/module/queue/queue.mod.o

LD [M] /home/module/queue/queue.ko

make[1]: Leaving directory `/home/samba/linux-ok6410‘

接下来是拷贝到开发板运行,看结果:

Insmod queue.ko输出:

This is work1->

This is work2->

但是在很多情况下,驱动并不需要自己建立工作队列,只需定义工作,然后提交工作到内核已经定义好的工作队列keventd_wq中。

1.提交工作到默认队列:schedule_work中。

就是修改init_que函数的代码为:

int init_que(void)

{

//2. 创建工作

work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);

INIT_WORK(work1, work1_func);

//3. 挂载(提交)工作

schedule_work(work1);

//2. 创建工作

work2 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);

INIT_WORK(work2, work2_func);

//3. 挂载(提交)工作

schedule_work(work2);

return 0;

}

修改完后执行make,生成.ko文件,拷贝到开发板。输出同样的效果:

[[email protected]]# insmod queue1.ko

this is work1->

this is work2->

接下来是今天最重要的事情,就是把工作队列用到按键的驱动程序里面去,用到按键中断处理程序当中去。接下来就是对前面的驱动程序进行改造。把他改成分成的中断处理的方式:

Nnnkey.c:

#include <linux/module.h>        /* For module specific items */

#include <linux/fs.h>            /* For file operations */

#include <linux/ioport.h>        /* For io-port access */

#include <linux/io.h>            /* For inb/outb/... */

#include <linux/init.h>

#include <linux/miscdevice.h>

#include <linux/interrupt.h>

#include <linux/slab.h>

#define GPNCON 0x7f008830

struct work_struct *work1;

void work1_func(struct work_struct *work)

{

printk("<0>key down!\n");

}

irqreturn_t key_int(int irq, void *dev_id)

{

//1.检测是否发生了按键中断

//2.清除已经发生的按键中断

//前面的都是硬件相关的工作,必须在中断里面执行

//下面是硬件无关的工作,我们把它提到中断以外的work1_func函数去处理。

//3.打印按键值

schedule_work(work1);

return 0;

}

void key_hw_init()

{

unsigned int *gpio_config;

unsigned short data;

gpio_config = ioremap(GPNCON,4);

data = readw(gpio_config);

data &= ~0b11;

data |= 0b10;

writew(data,gpio_config);

}

int key_open(struct inode *node, struct file *filp)

{

return 0;

}

struct file_operations key_fops =

{

.open = key_open,

};

struct miscdevice key_miscdevice =

{

.minor = 200,

.name = "OK6410key",

.fops = &key_fops,

};

static int key_init()

{

misc_register(&key_miscdevice);

//硬件初始化

key_hw_init();

//注册中断处理程序

request_irq(IRQ_EINT(0),key_int, IRQF_TRIGGER_FALLING,"OK6410key",0);

//2. 创建工作

work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);

INIT_WORK(work1, work1_func);

return 0;

}

static void key_exit()

{

misc_deregister(&key_miscdevice);

}

module_init(key_init);

module_exit(key_exit);

Makefile:

obj-m := nnnkey.o

KDIR := /home/samba/linux-ok6410

all :

make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

clean :

rm *.order *.symvers *.ko *.o *.mod.c

编译的结果是:

[[email protected] queue]# make

make -C /home/samba/linux-ok6410 M=/home/module/queue modules ARCH=arm CROSS_COMPILE=arm-linux-

make[1]: Entering directory `/home/samba/linux-ok6410‘

CC [M] /home/module/queue/nnnkey.o

/home/module/queue/nnnkey.c:28: warning: function declaration isn‘t a prototype

/home/module/queue/nnnkey.c:53: warning: function declaration isn‘t a prototype

/home/module/queue/nnnkey.c:67: warning: function declaration isn‘t a prototype

Building modules, stage 2.

MODPOST 1 modules

CC /home/module/queue/nnnkey.mod.o

LD [M] /home/module/queue/nnnkey.ko

make[1]: Leaving directory `/home/samba/linux-ok6410‘

时间: 2024-08-06 07:36:17

4.中断分层设计的相关文章

应用层的容错与分层设计

针对在项目中碰到的一些容错设计问题,团队最近进行了一次技术沙龙,讨论了以下话题. 为什么需要应用层的容错设计? 一个完整的系统在内部是由很多小服务构成,服务之间以及服务与资源之间会存在远程调用. 每个系统的可用性不可能达到100% 各种网络及硬件问题,如网络拥堵.网络中断.硬件故障…… 远程服务平均响应速度变慢 服务器平均响应速度如果慢下来,慢慢消耗掉系统所有资源,进而导致整个系统不可用.因此在分布式系统中,除了远程服务本身需要有容错设计之外,在应用层的远程调用的环节,需要有良好的容错设计. 应

RSF 分布式 RPC 服务框架的分层设计

RSF 是个什么东西? 一个高可用.高性能.轻量级的分布式服务框架.支持容灾.负载均衡.集群.一个典型的应用场景是,将同一个服务部署在多个Server上提供 request.response 消息通知.使用RSF可以点对点调用,也可以分布式调用.部署方式上:可以搭配注册中心,也可以独立使用. 渊源 RSF 的核心思想参考了淘宝HSF.Dubbo 等优秀框架.功能上大体相似,但是实现逻辑完全不同.因此没有什么历史包袱.总的来说对比淘宝HSF少了历史包袱,相比Dubbo更加轻量化.而且还支持了虚拟机

robot framework 使用四:分层设计和截图以及注意事项

再说一下眼下的主要环境信息和版本号: 操作系统:win7 64位 python版本号:2.7.6 RIDE版本号:1.2.3 selenium2library:1.5.0 selenium:2.40.0 pip:1.5.4 setuptools:0.6c11 decorator:3.4.0 robotframework:2.8.4 wx:2.8-unicode wx:3.0 IEDiverServer:2.41.0 注意:除操作系统外,各软件都是32位的版本号. 如今说下怎样用ride分层測试案

Linux中断分层技术

一.中断嵌套  当系统正在执行某中断处理函数时,又产生了一个新的中断,这就叫做中断嵌套.当中断为慢速中断时,新的中断会取代当前中断,即当前中断没有执行完就结束 了:当中断为快速中断时,新的终端就不会产生.这两种情况都是我们不愿意看到的情况,所以就有了今天的题目——中断分层. 二.中断分层 中断分层是将中断处理函数分为上下两个部分.上半部是与硬件相关的,下半部是与硬件无关的.与硬件无关的内容我们就可以将它分离出中断处理函数,交给内核在系统空闲的时候处理,这样就缩短了中断处理的时间,从而减小了中断丢

中断分层技术

1.Linux中断嵌套( 不同OS对中断的处理方式使不一样的) 慢速中断: 在中断处理的时候,中断的总开关是没有关闭的,允许其他中断的产生. 快速中断:总中断是关闭的. 当一个中断在执行的时候,其他中断出现,会忽略掉. 综上,所以会存在中断丢失. 假如一个中断程序的处理时间为10s,如果在7s的时候有一个中断处理程序出现,那么它就会被忽略而丢失掉,那么能不能提前完成这10s的中断处理程序呢,让它在7s之前结束,那么这样就极大的缩短了又一中断出现而被忽略的可能性. 那么怎么来缩短它呢?仔细分析中断

分层设计的好处

转自:http://www.cnblogs.com/fufuxi869/p/6044189.html 把各个功能按调用流程进行了模块化,模块化带来的好处就是可以随意组合,举例说明:如果要注册一个用户,流程为显示界面并通过界面接收用户的输入,接着进行业务逻辑处理,在处理业务逻辑又访问数据库,如果我们将这些步骤全部按流水帐的方式放在一个方法中编写,这也是可以的,但这其中的坏处就是,当界面要修改时,由于代码全在一个方法内,可能会碰坏业务逻辑和数据库访问的码,同样,当修改业务逻辑或数据库访问的代码时,也

嵌入式软件架构设计之分层设计

在实际的项目开发中,项目往往是并行开发的,也就是说硬件设计,底层软件设计,应用软件设计是同步进行的.比如说在开发板上调试模块驱动,在其他平台上调试应用再移植到目前这个平台等.这里又涉及到如何提高嵌入式应用软件的可移植性的问题,这个问题在下一篇博文中专门讲解,敬请期待.要想开发的应用程序在不同的嵌入式平台上具有高效率的可移植性,像Android sdk一样,统一的接口规范是必须的. 本文所要提到的嵌入式,其实更偏向于单片机.因为经典的linux+arm配置属于资源比较丰富,高配的嵌入式系统,其操作

中断分层处理-工作队列

4.中断分层处理a.中断嵌套中断嵌套指的是当一种中断产生的时候,又发现了另一种类型的中断.b.中断分层方式假如一个中断处理程序需要10秒钟,中断处理程序运行到第七秒的时候,出现了另外一种类型的中断,但是另外一种类型的中断丢失掉了,那么如何解决呢?一种方法是将中断处理的时间尽量缩短,减少丢失中断的可能.那么如何缩短处理的时间呢?中断处理的工作分为两种,一种与硬件相关,另一种是程序做的工作,包括中断检测,中断处理(可以将这部分工作放到其他部分来工作),这个就叫中断分层技术.另一种是a.1软中断 a.

ABP分层设计

ABP分层设计 一.为什么要分层 分层架构是所有架构的鼻祖,分层的作用就是隔离,不过,我们有时候有个误解,就是把层和程序集对应起来,就比如简单三层架构中,在你的解决方案中,一般会有三个程序集项目:XXUI.dll.XXBLL.dll 和 XXDAL.dll,然后把这三个程序集看成一个层,这没什么不可以,但当项目复杂的时候,如果还按照这种方式的话,你的程序集中的文件夹会越来越多,程序集也会越来越大.当你的视野跳出这个程序集的概念后,你会发现,层不只是和程序集对应,也和解决方案文件夹,或者是整个解决