F28335 學習系列一
——FLASH 搬移到 RAM 運行實現方法
本人學習 28335 有一段時間了,每次都有這樣的感覺:“講解 F28335 的資料太少了!”。特別是在使用 F28335 遇到困難時,往往要調動百度, google 等各大搜尋引擎,方能尋覓點零星的資料。店面上出售的 TI C2000 系列 DSP 中文資料以 2407 和 2812 為多,全部講解的28335 的中文資料沒有(不知道是不是我沒有發現,有的同志,麻煩您給我留個言啊)。我現手上有一本參考書:<<TMS32x28xxx 原理與開發>>,電子工業出版社,這裡面講到了28335 的幾個模組,剛開始學習的同志可以借鑒下。
學習的方法主要有 2 種,理論學習和實踐學習。在正式講述本節內容之前我先強調下,我寫這些文字沒有很複雜的理論知識介紹,也沒有很詳細的原理講述,我傳遞的只是一種方法,能夠幫你解決問題的方法。當然,我不是強調理論知識不重要,因為這裡如果理論也介
紹,方法也介紹,恐怕每個方面都講不清楚,而且看起來也比較費勁,理論知識總讓我想起一串串複雜的公式。本節就是教會你怎樣將 F28335 在 FLASH 裡面啟動並執行程式搬移到 RAM裡面運行。
使用過 TI DSP 或正在使用的人都知道,DSP 程式可以放在 RAM 裡面運行,也可以放在 FLASH 裡面運行。兩者有一定的區別:
(1)前者程式運行時,串連著模擬器,後者脫離模擬器;
(2)前者斷電程式丟失,後者不會;
(3)前者程式運行速度快,後者慢;
(4)二者空間大小可能不一樣(取決於晶片型號);
(5)前者沒有燒寫次數的限制,而後者有;
所以在 RAM 裡面運行適合項目的初期調試,方便快捷,當最終程式全部調試完後,做成產品銷售時,將程式燒寫到 FLASH 裡面(特殊場合,比如在做高壓的實驗時,可以考慮將程式燒寫到 FLASH 裡面調試)。
在上面 5 點當中,第 3 點我加了強調,在一個實際的項目裡面,程式的運行速度是很受關注的,我曾對 F28335 在 FLASH 裡運行程式和在 RAM 裡面運行程式做過對比,相同的代碼在 FLASH 和 RAM 裡面已耗用時間如下表:
表 1 FLASH 和 RAM 裡程式運行區別表
一段程式碼已耗用時間
RAM 裡運行 5us
FLASH 裡運行 25us
從上表可以看出,RAM 裡面運行程式比 FLASH 裡面運行程式快近 5 倍(只對 F28335,其它晶片不一定適用),所以尋找一種可以提高程式在 FLASH 裡運行速度的方法,對提高程式總體效能很有協助。
通過很多前輩們的努力,終於尋找到一種方法:將程式燒寫到 FLASH 裡面,上電時將程式搬移到 RAM 裡面運行。這即滿足了掉電程式不丟失,又滿足了程式運行速度高的要求,可謂一箭雙鵰。
本人在遇到這個問題以後,對這種方法高度興趣,想嘗試一下,找了很多資料(包括理論和實踐),摸索了一天一點頭緒都沒有,用 TI FLASH 常式也能夠燒進去,但程式執行不對。開始有點灰心了,但又不死心。繼續研究了一天,發現 TI 給的常式和網上一些熱心網友們給的常式都是將指定的代碼搬移到 FLASH 裡面,可以通過:
#pragma CODE_SECTION(函數名, "儲存空間入口地址");陳述式完成,感覺很簡單,但就是調試不出來。最後,突然想起來,可不可以不這樣做,找一個能夠將所有程式均搬移到 RAM 裡面的方法。
……
中間省略符號就是本人奮鬥的過程,開始之前就講了,寫這些文字是將一種方法分享給大家,至於研究奮鬥的過程就不詳細描述,不然恐怕說幾十頁紙都講不清楚。接下來就一步步教大家如何建立一個能夠將 FLASH 裡面程式上電時搬移到 RAM 裡面啟動並執行工程。
1、 建立一個工程;(怎麼建立省略)
2、 將工程裡面源檔案(source)的“DSP2833x_SysCtrl.c”、“DSP2833x_usDelay.asm”和“DSP2833x_CodeStartBranch.asm”檔案(如果用的是 TI 提供的檔案就是這四個 文 件 ) 分 別 替 換 成 “ DSP28xxx_SysCtrl.c ”、“ DSP28xxx_usDelay.asm ” 和“DSP28xxx_CodeStartBranch.asm” 。 另外,在將“DSP28xxx_SectionCopy_nonBIOS.asm”檔案添加到工程裡面; 備 注 : “ DSP28xxx_SysCtrl.c ” 、 “ DSP28xxx_usDelay.asm ” 、“DSP28xxx_CodeStartBranch.asm”和“DSP28xxx_SectionCopy_nonBIOS.asm”
我已經放在附件裡面上傳了。
3、 添加 CMD:“DSP2833x_Headers_nonBIOS.cmd”和“F2833x_nonBIOS_flash.cmd”。
如果工程裡面已經有了 CMD,要換成這 2 個。
備忘:“DSP2833x_Headers_nonBIOS.cmd”和“F2833x_nonBIOS_flash.cmd”也
已經放在附件裡。
4、 編譯燒寫。
大功告成了,各位可以試試,做個對比,看下不用這種方法和用這種方法程式分別執行的時間,差別很驚人哦!如果按照以上教你的步驟還是不行,可以給我留言!當然,能夠成功燒寫也可以留言哈!
就此擱筆!願君安好!^_^
作者:程林
日期:2010-11-3