리눅스 커널에서 인터럽트 처리를 배우고 있고 IRQ2에서 더미 irq 처리기를 등록하기 위해 아래 코드를 시도했습니다. 아래 IRQ 처리기가 등록되지 않았습니다.
[ 2203.989585] Trying to free already-free IRQ 2
커널 로그에서의 printk이다 : 나는 음의 반환 값과
free_irq()
을 위해 노력하고 정리 기능에서 발생하는 다음과 같이 커널의 메시지를보고 있어요 그러나 등록하기되지 않는 것 같다
다음
Here with registering IRQ handler on IRQ2 for flowTest...retval_irqreg= -22
이 네 가지 기능
1 the bottom half
2. handler
3. init function
4. cleanup function
나는 schedulin 아니에요을 가지고 내 코드의 관련 부분입니다 : 어떤은 등록있어되지 않았 음을 시사한다 g 아래쪽에 있지만 아직 아래쪽에 있습니다. 나는 커널 3.5.0-17에서 일하고있다.
//Bottom half for the irq handler
static void bh_flowTest()
{
printk(KERN_INFO "Inside bottom half for flowTest.\n");
}
// IRQ handler function
static irqreturn_t flow_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
{
printk(KERN_INFO "This is flowTest IRQ handler.\n");
//static struct tq_struct task = {NULL, 0, bh_flowTest, NULL};
/* Schedule bottom half to run */
//queue_task(&task, &tq_immediate);
// mark_bh(IMMEDIATE_BH);
return IRQ_HANDLED;
}
static int flow_init(void)
{
printk(KERN_ALERT "Here with flowTest module ... loading...\n");
int result=0;
dev_t dev=0;
result = alloc_chrdev_region(&dev, minor_num,
num_devices,"mod_flowtest"); // allocate major number dynamically.
i=MAJOR(dev);
printk(KERN_ALERT "Major allocated = %d",i);
cdev_init(&ms_flow_cd,&flow_fops);
cdev_add(&ms_flow_cd,dev,1);
//Registering interrupt handler on IRQ2 since IRQ2 is free as per /proc/interrupts
int retval_irqreg;
retval_irqreg=request_irq(2,(irq_handler_t)flow_irq_handler, /* our handler. It has been typecasted to remove warnings of incompatible pointer type , and enum irqreturn_t. Try removing the cast and see the warnings */
IRQF_SHARED,
"test_flow_irq_handler", NULL);
printk(KERN_ALERT "Here with registering IRQ handler on IRQ2 for flowTest...retval_irqreg= %d\n",retval_irqreg);
return 0;
}
static void flow_terminate(void)
{
dev_t devno=MKDEV(i,0); // wrap major/minor numbers in a dev_t structure , to pass for deassigning.
printk(KERN_ALERT "Going out... exiting...\n");
unregister_chrdev_region(devno,num_devices); //remove entry from the /proc/devices
free_irq(2, NULL);
}
몇 가지 기본적인 실수가 있다고 생각하지만 누군가 제게 그것을 가르쳐 줄 수 있다면 ..!
어떤 하드웨어를 사용하려고합니까? ** 2 ** ** 유효한 IRQ 번호는 무엇입니까? ... – TheCodeArtist
현재 하드웨어 (장치)를 특정하지 않습니다. 처리기 등록을 보려고합니다.아래의 메시지는 "이미 무료 IRQ 2를 시도하는 중입니다"라고 제안했기 때문에 x86 하드웨어 32 비트에 대해서는 IRQ2가있는 것 같습니다. 나는 바보 같은 짓을하지 않는 것이 좋겠다. –
"이미 free-free IRQ 2를 시도하고있다"는 메시지는 현재 드라이버가 irq 번호 2에 등록한 인터럽트 핸들러가 없다는 것을 의미합니다. 유효한 IRQ가 존재 함을 의미하지는 않습니다. – TheCodeArtist