我首先在尋找調試技巧。如果有人能夠指出需要更改的一行代碼或者需要設置一個外設配置位來解決問題,那就太棒了。但那不是我所希望的;我正在尋找更多關於如何去調試它。如何調試ARM Linux內核(msleep())鎖定?
使用谷歌搜索「msleep hang linux kernel site:stackoverflow.com」得到13個答案,但沒有一點是關鍵的,所以我認爲我很安全。
我重建了嵌入式TI AM1808 ARM處理器(Sitara/DaVinci?)的ARM Linux內核。我看到所有的啓動日誌都出現在從串口出來的login:提示符上,但嘗試登錄時沒有得到任何響應,甚至沒有回覆我輸入的內容。
經過大量調試後,我到達了內核,並在第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上是那些獲得設定在上述的永久測試循環的開始的標誌狀態示出了當它掛起時間表()不再稱爲:
http://lxr.linux.no/linux+v2.6.37/kernel/sched.c#L4064
下的.config唯一的選擇/ '設備驅動程序' 是: 塊設備 支持I2C SPI支持
內核和內存盤是loade d使用uboot/TFTP。 我不相信它會嘗試使用以太網。因爲所有這些發生在'/ sbin/init'之前,所以很少發生。
更多詳細信息: 我有一個非常相似的主板與相同的CPU。我可以運行相同的uImage和相同的ramdisk,並且在那裏可以正常工作。我可以登錄並執行通常的操作。
我已經運行內存測試(總共64 MB,限制內核爲32M,測試其他32M;它是一個單芯片DDR2),並沒有發現問題。 一個電路板使用UART0,另一個使用UART2,但引導日誌從兩者中出來,所以它不應該成爲問題。
任何調試技巧,非常感謝。 我沒有合適的JTAG,所以我不能使用它。
它可能是調度程序依賴於某些硬件計時器?這可能是壞的?或使用不同的io地址? – 2012-03-10 21:27:45
據我所知,一切都應該在芯片上(我猜它的值得雙重檢查),所以他們應該看到除了串口之外的完全相同的環境(所有3個應該是活動的,只要選擇哪一個是活動的。)我想我會尋找時間滴答IRQ並在那裏添加一個printk(如果我能找到它:) – user1261470 2012-03-11 05:32:56