用户中心

资讯 > 嵌入式系统

LINUX2.4forS3C2410的中断问题

2007.02.02阅读 8314

       1、&nbspLINUX中,中断的安装和使用:
       当中断系统硬件产生一个中断信号,LINUX的中断处理系统将根据从硬件获得的中断号调用用户编写的中断处理程序,这个处理程序根据需要可以分为中断上半部和中断下半部(bottom&nbsphalf),一般将需要马上处理的动作安置在上半部中处理CONTROL ENGINEERING China版权所有,这时是关中断运行。可以在稍后处理的动作安置在下半部处理,这时是开中断运行,可以允许其他中断进入。下半部根据情况可以要也可以不要。
A、因此首先要定义一个中断上半部处理程序,原型为:
#include <linux/intrrupt.h>
#include <linux/sched.h>
void&nbspMydev_interrupt_handle(int&nbspirq,void *dev_id,struct&nbsppt_reg *regs)
      

; 其中irq为设备的中断号,这是操作系统传来的,也许你认为这多余CONTROL ENGINEERING China版权所有,因为系统根据中断号来查找哪个函数处理设备请求,本函数只管进行数据处理就是,管它中断号干什么?这就是你只知其一不知其二了:linux允许多个中断号对应一个设备处理程序,这样你的中断处理函数就可以根据中断号来判断你的设备中那个引脚产生的这次请求,是不是灵活性很大?
       *dev_id是设备标识符,据说是为了允许一个中断处理程序服务于几个同类型的设备,大概和第一个参数的作用差不多。下一个*regs参数指向中断发生后保存的各个寄存器内容的内核态堆栈区,我想一般程序员不会动它的。当然,最简单的情况下(也是大多数情况下)这几个参数都可以不用,虽然不用,你的中断处理程序也得按这个形式声明,否则在编译阶段就会遇到麻烦。
       B、下面该定义一个下半部处理程序了:
       void&nbspmydev_bh_interrupt(void)
       必须这么简单,没有参数,没有返回值。
       C、注册下半部。linux系统在一个数组中存储所有的下半部处理程序指针,你必须将你的下半部处理程序的指针插入这个数组中的一个位置控制工程网版权所有,并记住这个位置编号以备在合适的时候告诉系统,这个位置指向的程序就是我需要的。将你的下半部处理程序插入这个数组中的操作叫做“注册下半部”,使用的函数在kernel/softirq.c中的
void&nbspinit_bh(int&nbspnr,&nbspvoid (*routine)(void))
{
&nbspbh_base[nr] =&nbsproutine;
&nbspmb();
}
       参数nr为数组中的位置,有资料说其值最大为31CONTROL ENGINEERING China版权所有,即linux允许最多有32个下半部同时存在。routine为你的下半部处理程序。仔细看void (*routine)(void)和void&nbspmydev_bh_interrupt(void)有什么不同?有经验的程序员很快可以看出这是两个形式完全相同的函数定义。对!*routine是形参,而mydev_bh_interrupt可以作为实参,实参和形参的数据类型必须相同。
       你还可以看出www.cechina.cn,bh_base[]就是存储下半部处理程序指针的那个数组。
       如果参考别人的一些代码,你会发现比如init_bh(TIMER_BH,&nbsptimer_bh)一类的语句,这里的timer_bh肯定是一个中断下半部(望文生义可以知道是时钟中断),让人费解的是TIMER_BH是那个所谓数组中的那个位置?你可以在include/linux/intrrupt.h中找到一个枚举类型的定义:
enum {
&nbspTIMER_BH =&nbsp0,
&nbspTQUEUE_BH,
&nbspDIGI_BH,
&nbspSERIAL_B























版权声明:版权归控制工程网所有,转载请注明出处!

频道推荐

关于我们

控制工程网 & CONTROL ENGINEERING China 全球工业控制、自动化和仪器仪表领域的先锋媒体

CE全球

联系我们

商务及广告合作
任小姐(北京)                 夏小姐(上海)
电话:010-82053688      电话:18616877918
rendongxue@cechina.cn      xiashuxian@cechina.cn
新闻投稿:王小姐

关注我们的微信

关于我们 | 网站地图 | 联系我们
© 2003-2020    经营许可编号:京ICP证120335号
公安机关备案号:110102002318  服务热线:010-82053688