最近工作上處理的一個問題是跟download有關的. 看不懂可以直接跳到最後一段...
我將File System make 成一個 binary 檔案, 然後將此binary檔透過我的 bootloader 來進行 download 的工作.
Download 的 tool 是另一個 team 所寫. 以我所make出的bin檔為input, 透過 USB 將 file system 的 image 傳給 bootloader, 進而將image寫入FLASH 記憶體中.
Download一切順利, 無奈如果我所make出的file system的virtual address超出某一範圍, download完畢之後download 的 application 就不能顯示出 "Download Complete"
照邏輯來推論, 是因為此application沒有收到我所寫到USB的Ack.
但trace下去的結果, 我明明已經送了啊! 為什麼會失敗?
當時我想: 一定是hardware或是application的問題吧, 而且也太玄了吧, 跟我的file system image的address 有啥關係???
經過一番折騰, 發現我在寫入FLASH時會先去進行erase的動作, 在erase的動作裏, 只要我mark掉一個expression, download就會complete了.
當我有了這個發現, 我覺得這又是一個懸案, 不知為何就解決的問題...
我那個expression可有可無啊, 為何mark掉會有如此神奇的影響? 跟送Ack到USB更是八竿子打不著啊!!!
最後發現, 我那個expression中有個array, 這個array我宣告得太小了, allocate的memory有限. 但做運算時卻超出了這個範圍.
一但超過範圍它就access到其他的memory. 不巧在某個範圍踩到地雷, 觸碰到了stack的memory. 也影響了送Ack到USB.
自己雖然是個Computer Science 碩士. 不過學藝不精. 只會套套邏輯, 寫寫程式. 混口飯吃.
一些基礎的本質學能可能當初就沒好好學吧, 也有部分早就還給老師了. 甚為慚愧.
想成為一個真正的高手, 我覺得不是說光會寫程式就好, 要對組合語言, 語言結構, 作業系統都有深刻的了解.
必須真正了解事情運作的道理--From the ground up!
否則, 遇到邏輯之外的問題, 就會一籌莫展了.
該來訂個讀書計畫了...

關於這種懸案我也碰過不少..
我的經驗告訴我,絕對沒有什麼見鬼的事,如果你認為他該怎麼樣,他偏
偏不怎麼樣,或是本來會死掉,加了一行 printf 就不死,那一定一定百
分之兩百是有哪個地方寫爛了。
所以當怪事開始發生的時候,一定要多看多懷疑,有時候自己看沒用,最
好多找幾個同事一起看比較容易發現錯誤。
不過,我覺得這跟學校教的東西也沒關係,經驗的累積可以減少這樣的事
情發生吧,至少發生的時候也可以縮短尋找的時間...
所言極是, 果然是個用心的engineer...
只可惜在台灣經驗累積夠的人就不再繼續走這條路了