close

最近工作上處理的一個問題是跟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!
否則, 遇到邏輯之外的問題, 就會一籌莫展了.
該來訂個讀書計畫了...


arrow
arrow
    全站熱搜

    陳晉茂 發表在 痞客邦 留言(2) 人氣()