記一次解決問(wèn)題的掉坑過(guò)程
這兩天在調(diào)試一個(gè)音頻ADC 芯片,也是之前的項(xiàng)目,但是一直調(diào)不出來(lái),我發(fā)現(xiàn)我總是在這樣的問(wèn)題上糾結(jié)很久,以前踩過(guò)的坑后面照樣會(huì)踩,只不過(guò)踩完會(huì)迅速把腳拉出來(lái)繼續(xù)前進(jìn),我經(jīng)常聽到有人說(shuō)「做嵌入式真的太容易了,來(lái)來(lái)去去就那點(diǎn)東西」。
不是小瞧,做嵌入式真的就來(lái)來(lái)去去那點(diǎn)東西,我們前幾天調(diào)試一個(gè)屏幕,剛開始也是怎么點(diǎn)也點(diǎn)不亮,屏幕的分辨率是1920*1200,但是我們把這個(gè)分辨率軟件設(shè)置好燒錄開機(jī)后,內(nèi)核崩潰了。
調(diào)試驅(qū)動(dòng)不像寫應(yīng)用程序,如果應(yīng)用程序崩潰了,系統(tǒng)還是活的,系統(tǒng)活著,就可以繼續(xù)搞事情,繼續(xù)看系統(tǒng)拋出來(lái)的信息調(diào)試。驅(qū)動(dòng)不一樣,驅(qū)動(dòng)是內(nèi)核的一部分,而且是內(nèi)核的很大一部分,如果驅(qū)動(dòng)異常了,很大可能性會(huì)影響到內(nèi)核。
提個(gè)題外話「為什么內(nèi)核下面那么多用不著的驅(qū)動(dòng)代碼不直接刪除掉?」
再提個(gè)問(wèn)題「為什么明明可以在內(nèi)核里面找到答案,大家還是習(xí)慣百度?google?」
應(yīng)用是人身體上的衣服,是帽子,是鞋子,但是驅(qū)動(dòng)不一樣,它是人身上的手,是腳,是鼻子,是耳朵。
——轉(zhuǎn)回來(lái)
針對(duì)上面的問(wèn)題,我們就查呀查,最后發(fā)現(xiàn)MTK 的代碼里面有問(wèn)題。
—— 這個(gè)問(wèn)題出現(xiàn)的情況是
如果我們軟件設(shè)置1920*1080的分辨率的話,內(nèi)核是不會(huì)崩潰的,但是我們寫入1920*1200的分辨率的話,內(nèi)核就崩潰了。
我們想「是不是因?yàn)樵龃罅朔直媛剩悄J(rèn)的buff 空間沒(méi)有那么大,這樣使用的虛擬內(nèi)存就越界了,然后就崩潰了?」
然后我們就找這部分的信息,你們知道,內(nèi)核代碼是一些非常困難的代碼,閱讀代碼的時(shí)候,有時(shí)候要猜測(cè)它的行為,閱讀一份完全陌生的代碼,而且你還不知道它的行為意圖,這是很困難的。
— — 然后怎么辦?
然后我們就正向分析了,找到崩潰的位置,然后注釋它,對(duì),你看的沒(méi)有錯(cuò),我們注釋了看不懂的那段代碼,就是這個(gè)操作讓我們的系統(tǒng)正常開機(jī),而且能夠正常顯示畫面。
然后復(fù)盤的時(shí)候,我們咨詢了MTK 的技術(shù)開發(fā),他們給出的解釋是「出問(wèn)題的這段代碼只是為了在eng 版本調(diào)試」,這還沒(méi)有完,我們雖然知道這樣修改可以,但是還是看不懂它的這個(gè)函數(shù)有什么調(diào)試的意義所在。
韋老師好像有一個(gè)名言,說(shuō)20%的時(shí)候在寫代碼,80%的時(shí)間在調(diào)試代碼。調(diào)試要花費(fèi)的功夫確實(shí)比寫代碼多,搞嵌入式,因?yàn)樯婕坝布绻幸粋€(gè)東西被卡住了,那時(shí)候的感覺(jué),那個(gè)焦急的心都快孳出來(lái)了,所以搞技術(shù),沒(méi)有一個(gè)好的心態(tài)是不行的,畢竟它不是砍樹,也不是真的搬水泥或者搬磚。

