【发布时间】:2012-03-27 19:57:20
【问题描述】:
我首先在寻找调试技巧。如果有人可以指出要更改的一行代码或要设置的一个外围配置位来解决问题,那就太好了。但这不是我所希望的。我正在寻找更多关于如何调试它。
谷歌搜索“msleep hang linux kernel site:stackoverflow.com”得到 13 个答案,但没有一个是重点,所以我想我可以放心提问。
我为嵌入式 TI AM1808 ARM 处理器(Sitara/DaVinci?)重建了 ARM Linux 内核。我看到所有启动日志到登录:提示从串口出来,但是尝试登录没有响应,甚至没有回显我输入的内容。
经过大量调试后,我到达了内核并在第 828 行和第 830 行之间添加了调试代码(是的,内核版本是 2.6.37)。这是在调用 'sbin/init' 之前的内核模式:
http://lxr.linux.no/linux+v2.6.37/init/main.c#L815
就在第 830 行之前,我添加了一个永久循环 printk,我看到了结果。我让它运行了大约几个小时,它计数到大约 200 万。采样线:
dbg:init/main.c:1202: 2088430
所以它吐出 6000 万字节没有问题。
但是,如果我在循环中添加 msleep(1000),它只会打印一次,即 msleep() 不会返回。
详情: 在调度程序的第 4073 行添加条件 printk,条件是在上述永久测试循环开始时设置的标志,表明 schedule() 挂起时不再调用:
http://lxr.linux.no/linux+v2.6.37/kernel/sched.c#L4064
.config/'Device Drivers' 下的唯一选择是: 块设备 I2C 支持 SPI 支持
使用 uboot/TFTP 加载内核及其 ramdisk。 我不相信它会尝试使用以太网。 由于所有这些都发生在 '/sbin/init' 之前,因此应该很少发生。
更多详情: 我有一块非常相似的主板,它的 CPU 相同。我可以运行相同的 uImage 和相同的 ramdisk,它在那里工作正常。我可以登录并做通常的事情。
我已经运行内存测试(总共 64 MB,将内核限制为 32M 并测试其他 32M;它是单芯片 DDR2),没有发现任何问题。 一块板子使用 UART0,另一块板子使用 UART2,但启动日志来自两者,所以应该不是问题。
非常感谢任何调试技巧。 我没有合适的 JTAG,所以我不能使用它。
【问题讨论】:
-
会不会是调度器依赖于某个硬件定时器?哪个可能坏了?还是使用不同的 io 地址?
-
据我所知,一切都应该在芯片上(我想它值得仔细检查)所以他们应该看到除了串行端口之外的相同环境(所有 3 个都应该处于活动状态,只需选择哪个处于活动状态.) 我想我会寻找时间滴答 IRQ 并在那里添加一个 printk(如果我能找到它:)