jjww 发表于 2003-6-14 09:48:56

关于一个中断处理的问题, 急! 3x!

我用的是FreeBSD4.8,我的COM口有特殊用途,工作原理是根据Modem Status Register的高4 bits状态变化,反映我的特殊背板使用情况。背板和COM口的MSR高4 bits代表的引脚物理相连. 按理说,我捕获COM的第4级别中断就可以了。我在IER里设置了允许Change ModemStatus Interrupt,通过读IER,确实设置了相应的位。                              
但是当背板发生变化,导致MSR寄存器高4 bits变化时,并没有引发中断。
MSR寄存器的高4 bits,我通过inb读出来也确实变化了.
我的中断ISR也加入了IDT里. 我不知道是否还需要什么别的特殊设置?

jjww 发表于 2003-6-14 13:13:44

sigh, 我知道我错了,dragonfly提醒我在底层中断是不能print的,我没重视这个问题,后来我在com口对应的软中断里(类似于linux的Bottom Halves)加入print语句就打印出来了。

Dragonfly 发表于 2003-6-14 22:07:58

so u solve u problem now? if so, post some details and code piece (of course without u produce info)

jjww 发表于 2003-6-15 09:22:20

关于FreeBSD的硬中断和软中断之间还有些问题没有搞清楚,我正在问别人...
等我搞清楚了,我再贴吧..... :roll:

jjww 发表于 2003-6-15 10:52:47

http://63.249.85.132/kern_code_walk.htm
该网址对FreeBSD中断处理流程讲的比较清楚了,别的必须看code理解....
汗!以前只是看了一遍,当时由于看FreeBSD5.x版和4.x版差别比较大,没有认真看。
就COM口,而言,我需要捕获MSR的改变引起的中断。因此,我先在kernel启动阶段,发现COM口会attach这个硬件(sioattach),我设置中断级别,使其缺省就支持第4级别的中断类型。别的,其实FreeBSD已经都做了,如果我们要针对MSR引起的中断做我们自己的处理,根据自己的实际情况,将要处理的中断分为两个部分,必须马上处理的,和可以滞后处理的。在相应的ISR里的一段code
if (modem_status != com->last_modem_status) {
....
}
我们要做的事情就在这个if里,添加自己的code,包括设置软中断pending...
FreeBSD通过softtty()设置COM口的软pending标志,在硬中断处理完后,会检查相应的bit,看是否需要软中断处理。而软中断控制路径是在内核发现硬件,attach他们的时候,如果需要,通过register_swi注册相应的软中断路径。
汗...其实上面的那个网址写的更好,更全面,更深入....
提一句,FreeBSD在I386体系中,建立名为nexus的伪根设备,所有的硬件、总线都依附在下面,成一个树状结构,好比我的COM口,需要irq,port,IDT的一个表项,这些,都是通过向它的父级isa申请,isa再向它的父级申请。
DRIVER_MODULE(sio, isa, sio_isa_driver, sio_devclass, 0, 0);
最终通过nexus_xxx实现真正的分配。比如注册中断,最终在nexus_setup_intr函数里,通过调用inthand_add函数添加,再间接调用icu_setup函数update IDT内容。

lxg8906 发表于 2003-6-22 23:20:04

A quick question to Dragonfly:

1. "dragonfly提醒我在底层中断是不能print的,我没重视这个问题,后来我在com口对应的软中断里(类似于linux的Bottom Halves)加入print语句就打印出来了"
Come back to Linux.

Are you telling us that we can not use "printk" in "底层中断" (top half)?   My understanding is that the top half should be able to run as soon as possible, so it should not wait for locks whatever, to avoid deadlock.As printk asks for the console_lock first, so it should not appear in the top half.   Is it true?

Thanks a million!

Dragonfly 发表于 2003-6-22 23:25:38

yes, u can not use printk in top half. a top half can wait a lock, but that lock can not be locked for a long time. so usually here we only wait some spinlocks that can be fast released.
for the console lock, i need check how it is used.

in LDD2 i remember that there is a list that what intr can not do. check it out.
页: [1]
查看完整版本: 关于一个中断处理的问题, 急! 3x!