您的位置:首页 > 其它

中断函数中不能调用ioremap()!!!!!!!

2012-12-26 16:11 204 查看
在开发板上实验,《ARM嵌入式Linux设备驱动实例开发》第二章按键的例子,每当按下键盘时,都会导致Oops错误。

retry start

sleep

into isr 18

kernel BUG at mm/vmalloc.c:171!

Unable to handle kernel NULL pointer dereference at virtual address 00000000

pgd = c0004000

[00000000] *pgd=00000000

Internal error: Oops: 817 [#1]

Modules linked in: button

CPU: 0 Not tainted (2.6.22.1 #3)

PC is at __bug+0x20/0x2c

LR is at 0xc030dafc

pc : [<c0031b54>] lr : [<c030dafc>] psr: 60000093

sp : c0303e18 ip : c030dafc fp : c0303e24

r10: e0000000 r9 : 41129200 r8 : 00000001

r7 : 00000012 r6 : 00000001 r5 : 00056000 r4 : 00001000

错误原因:中断处理函数isr_button中,使用了ioremap。

在网上找的一个帖子,老外的。

You're not allowed to call any type of blocking function from within

an interrupt handler.

ioremap is a potentially blocking function, so it
cannot
be called

from an interrupt handler.

Normally, you would do all of the memory mapping, memory allocation

stuff outside of the interrupt handler and the interrupt handler would

just copy stuff around.

Why do you think you need it from within the interrupt handler?

Perhaps you could describe what you're trying to do, and I
can suggest

a "traditional" method of dealing with that situation.

把中断函数里的ioremap语句移到初始化函数里,就正确了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐