嵌入式爱好者

查看: 4443|回复: 1

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

[复制链接]

3

主题

10

帖子

36

积分

i.MX6UL通行证i.MX6Q通行证AM335x通行证

扫一扫,手机访问本帖
发表于 2016-11-14 21:16:22 | 显示全部楼层 |阅读模式
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
[00000000] *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 : cbf2b820  ip : cbf2b848  fp : cbf2b844
r10: 00000000  r9 : cc407c60  r8 : 00000000
r7 : 00000075  r6 : 00000075  r5 : 60000193  r4 : 00000000
r3 : 00000001  r2 : cc4f2450  r1 : 00000000  r0 : 00000000
Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 00c5387d  Table: 5bf2c008  DAC: 00000015
Process up (pid: 85, stack limit = 0xcbf2a268)
Stack: (0xcbf2b820 to 0xcbf2c000)
回复

使用道具 举报

3

主题

10

帖子

36

积分

i.MX6UL通行证i.MX6Q通行证AM335x通行证

 楼主| 发表于 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);

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

解决办法:
先初始化工作队列再申请中断函数。
亲测已经不会出现该问题了。
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-20 20:35

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表