雖然是 Keil C 裡的8051 的寫法...版主還是把他歸納成USB DIY 之一類...
想必這幾年來,USB Controller 內含8051 的程式也都不小了吧。
其實,版主這一兩年已經很少用 Keil C 寫 8051 的程式了...
當初也是以自學方式學會Keil C 的...當初同事都還是用組語寫程式...
(當初也不是所謂的 Keil C 的uVision 環境,那時還叫做 Franklin C呢!)
很辛苦的學會後,卻又因緣際會的參與MP3 晶片開發,當初開發團隊用的開發平台就是 Keil C。
套一句兵家之書所云:用兵之法,無恃其不來,恃吾有以待之;無恃其不攻 ,恃吾有 所不可攻也...
所以,有些技術領域的東西,誰都很難料得到哪天您會用得到呢?!
------
標準的8051 基本上他有 8 bit Data bus 及16 bit Address bus 。
所以,他的程式記憶體與資料記憶體的定址能力就是 64KBytes (2**16)。
以前來說:兩者各64KBytes 是綽綽有餘的....但現在來說,可能就有點辛苦了。
所以,大家就想擴充這方面的需求....
以資料記憶體空間來說:是比較容易一點的,因為我們程式要Access 記憶體的那個位址的話,
是可以事先利用純I/O 當高位元的地址線...也就是另一種切data Bank 的方式。
譬如,您可以拿 P1.0 當 A16 用。依此類推....
這一部份想必大家在使用上應該沒有多大問題...
但是若是 程式記憶體的擴充方式,就比較難了,因為這個方式會牽涉到組譯程式與開發平台的應用。
要如何作到我們寫的程式會自動的切換不同的 程式記憶體空間呢?!....
當然最好的方式就是組譯程式幫我們處理掉,讓我們寫起程式來一樣方便?!
所以,Keil C 就提供了這樣子的功能...(這點大家可能都不清楚喔...)
大家都沒有留意要原廠的使用說明書....可見大家還都不夠用功...
---------
在此我們就利用KEIL C原廠的資料來說明:
首先我們發現,Keil C 會幫我們處理這一部份,但也是有代價的,
就是每一次程式跑到跨Bank 時,就會多50 個Cycles 及多兩個 Bytes 的Stack 空間。
(如下圖紅色標示處)
至於,ROM Code如何切 Bank 方式,Keil C 共提供了四種方式...
說真的,版主只用過第四種(mode 4) ,但看過或研究過他的資料後,
其實,Mode 4 在使用上會比較簡單而易懂...其他的版主就覺得不怎麼容易接線。
注意喔,不同的Mode 的切Bank 方式也都跟8051 外部接線息息相關喔。
這一點您們就要去研究Keil C 的範例了喔。下面一張圖就是 Mode 4的接線圖。
重點就是8051 在Access 程式碼時,所連帶的控制訊號線為ALE ,所以,
這條ALE線就是拿來latch 外部控制信號線的 ....至於程式定址線,就得犧牲一些I/O 線了。
下圖所示的就是 P3.3 當A16 ;P1.5 當A17 ,所以程式碼的定址能力就可以達到256 Kbytes 了。
但是要注意的是:這種定址方式對於8051 來說也不知道的說!
因為畢竟8051的定址能力還是只有 A0~A15 (64Kbytes的 ...)。
所以,圖的下方就標示出他切Bank 的方式。
但是,硬體電路的方式還是得靠組譯程式才有辦法發揮功效的,否則也是白搭的。
所以,當您選擇利用這種方式來切 ROM Code Bank 時。開發程式就必須加入一段控制程式:
L51_Bank.A51---不好意思,就是組合語言...您說學組合語言重不重要?! 呵...
這個程式其實蠻容易懂的....但一定要看得懂。因為,您下回切Bank 的I/O 控制線會改變,
這時您就要修改這個程式碼了。
(L51_Bank.A51 是Keil C 原廠就有附的範例程式,自己在Keil 的安裝目錄中找一下吧!)
這麼簡單嗎?!還沒完...除了硬體與軟體程式的配合外,還要IDE(uVision) 開發環境的配合,
從下圖,大家就可以看到除了L51_bank.A51 程式外,還有Code Banking 的設定...
....
這樣子就結束了嗎?!還沒有...因為當您組譯完成後,您就得到 一段一段程式的Hex 檔 ,
在另外利用 Hex 轉BIN 檔方式,轉成一段一段的 Binary 檔....
最後就可以利用Banklink.exe 這支工具程式把這些一段一段的Binary 檔銜接起來。
就完成了.......
-----------------------------
如此一來,原來平凡無奇的8051也可以寫到幾百KBytes 的 程式碼了。
我想應該就有許多應用作不完了吧。而且現在這些Flash ROM 都已經很便宜了。
所以,大家可以盡量的使用....
至於在系統開發上,可能一般的ICE (模擬器或仿真器)已經不敷使用...
說真的,程式碼這麼大了。要用ICE來一步一步的單步執行,可以抓到問題....天都亮了...
所以,這時候,您就可以試著使用 ROM Emulator 了....
http://chamberplus.myweb.hinet.net/products.htm
而且這種ROM Emulator 也要夠大容量也才夠用吧。
----
下回有機會再帶大家實際把這些開發平台,架起來說明一下....
謝謝....
(PS:看來雖然已經兩三年沒用了,還是寶刀未老....還是要說是:薑是老的辣呢?!)