wangdq92 发表于 2016-11-14 21:16:22

FET6410有CAN数据上传,开机后执行命令up link set can0 up type can bit……死机

FET6410(Linux3.0.1)有CAN数据上传时,在开机shell执行命令up link set can0 up type can bitrate 500000会死机。如果CAN 没有数据上来,再执行命令就不会死机。打印信息如下:Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = cbf2c000
*pgd=5bf20831, *pte=00000000, *ppte=00000000
Internal error: Oops: 17 [#1]
Modules linked in:
CPU: 0    Tainted: G      W    (3.0.1 #441)
PC is at __queue_work+0xc/0x34c
LR is at queue_work_on+0x34/0x3c
pc : [<c0068358>]    lr : [<c00686fc>]    psr: 60000193
sp : cbf2b820ip : cbf2b848fp : cbf2b844
r10: 00000000r9 : cc407c60r8 : 00000000
r7 : 00000075r6 : 00000075r5 : 60000193r4 : 00000000
r3 : 00000001r2 : cc4f2450r1 : 00000000r0 : 00000000
Flags: nZCvIRQs offFIQs onMode SVC_32ISA ARMSegment user
Control: 00c5387dTable: 5bf2c008DAC: 00000015
Process up (pid: 85, stack limit = 0xcbf2a268)
Stack: (0xcbf2b820 to 0xcbf2c000)

wangdq92 发表于 2017-1-16 16:27:04

该问题已经解决!由于Can驱动的问题,导致抛出的一个空指针异常的oops信息。
Linux3.0.1驱动中/drivers/net/can/mcp251x.c
mcp251x_open()函数中

先进行中断函数申请注册
request_irq(spi->irq, mcp251x_can_irq, IRQF_DISABLED | IRQF_TRIGGER_LOW ,DEVICE_NAME, priv);

然后再进行工作队列的初始化:
priv->wq = create_freezable_workqueue("mcp251x_wq");
INIT_WORK(&priv->irq_work,can_irq_work);

此时如果在申请中断完成后,马上来了一个中断,就会跳到中断处理函数里面执行硬中断(而中断处理函数里面恰恰有对工作队列的操作,此时工作队列还没有初始化完成,就会出现工作队列空指针)

解决办法:
先初始化工作队列再申请中断函数。
亲测已经不会出现该问题了。
页: [1]
查看完整版本: FET6410有CAN数据上传,开机后执行命令up link set can0 up type can bit……死机