2007年5月8日 星期二

8051 Code Banking

雖然是 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:看來雖然已經兩三年沒用了,還是寶刀未老....還是要說是:薑是老的辣呢?!)

 


 

15 則留言:

  1. keil在安裝後於中放的文件(特別是.pdf)裡有些資料都沒更新,版大是用uV2的IDE介面如果轉用uV3的話bank-number可以到64個,只是小弟很難想像有人會在8051上寫到64個bank的code。

    回覆刪除
  2. 賈老師的真老公2007年5月18日 晚上7:43

       
        關於uV3 的IDE... 版主那天有看到...只是如您所說:要寫到 64Bank  的Code ...很辛苦的呢!

    [-(  .... [-( .....  大概寫完這麼大的一個程式,大概需要天天寫...寫個一兩年跑不掉吧...
    然後東西開始賣時,又要調適一下程式.....大概,可能要得要換工作了...  :"> ... I-) ...

    回覆刪除
  3. 咦...我想我這篇文章已經算是交代的很清楚了...
    至於...W77E532 ...沒用過...您可能要K一下他的Datasheet 或是相關的
    Application Note...
    至於,Keil C 的東西... 我想我再怎麼用力講...也不一定能講到您要的東西。
    像上述文章內容,也是版主自己摸一摸把他摸出來的。
    有些工程師是都等著別人把開發環境弄得清清楚楚的...
    然後就每天例行公事的上班寫程式...
    我個人覺得:工程成長最大動力,應該就是如何去建立這樣的開發平台...
    寫程式天天都有機會寫...但要建立一個開發平台,可不是天天都有的機會。
    好的資深工程師與一位普通工程師最大差別在哪?!...
    您想一下...
    要好好把握這個機會。...好好加油。
     

    回覆刪除
  4. Dear 大大,
    不好意思,想請問一下硬體接線問題,手冊上的接線法已經了解了,不過若是用I2C 的EEPROM該怎麼辦呢? 
    小弟對硬體一概不通,麻煩大大指點了,謝謝!
     

    回覆刪除
    回覆
    1. 我想您應該不是問那種所謂的 24Cxx或是 93Cxx 這種 EEPROM 吧?!
      您應該要問的是:25Pxx 這種 Serial EEPROM 吧!
      一般要MCU支援這種Serial EEPROM 的 ,MCU 內部都會特殊的支持所謂那種
      Cache SRAM 吧...您想一想:什麼是8 /16/32 bits MCU ?!
      他可不是喊好聽的...也不是他的SRAM Data Bus 是8/16/32 bits吧!
      他指的是他所謂fetch Code 的Bus 的架構...
      所以啦...一般這種MCU他的內部應該就會有Serial 轉Parallel 介面。
      先把外部的Serial ROM  Code 轉到內部Papallel Cache bank,
      等著MCU CORE 來以其Access Bus 來Pre-fetch 執行碼的!
      所以,您應該很容易發現:這種Serial EEPROM 所支援的速度會比一般傳統的
      parallel EPROM 的Access 速度快到八倍以上的。
      大致上,他們的原理是如此這般的...
      當然啊,這一部份還是有他一定的技術『眉角』的地方的啦!  :>

      刪除
  5. 謝謝版主大大。原來是這樣子呀!
    被大大說中了,因為我的簡易型燒錄器只能燒AT24C256, AT24Cxx系列,
    原本想自己做code banking的實驗,把code燒進AT24C256 ,外面接一個serial to 24 bit i/o expander chip,再接入8051 P0/p2 ,這樣不可行嗎? 硬體果然不是我的世界.....
    :D

    回覆刪除
    回覆
    1. 不好意思...我最近才發現...回覆必須在相對應的回應欄中,
      他才會通知當事人...請見上面的回應留言!
      謝謝!

      刪除
  6. Dear 大大,
    您好,小弟最近在研究code bank的用法,用Keil C寫了一個小程式,想將它載入到Vertex5的FPGA上,然後用Keil C進Debug Mode,不過對於Debug Mode的一些設定,我找不到相關的資料,不曉得大大您有沒有用過,是否可以指點一下!教我如何使用,謝謝!
     
    另外您文章中提到" 當您組譯完成後,您就得到 一段一段程式的Hex檔,在另外利用 Hex 轉BIN 檔方式,轉成一段一段的 Binary 檔,最後就可以利用Banklink.exe 這支工具程式把這些一段一段的Binary 檔銜接起來。 " 這段的意思我不太懂,可以麻煩您教我嗎?謝謝!^^"
     
    我的e-mail是nochange5@hotmail.com!謝謝您,希望您能幫忙小弟,感謝!
     
    Best Regards,
    Mark Lee

    回覆刪除
    回覆
    1. 不好意思...我最近才發現...回覆必須在相對應的回應欄中,
      他才會通知當事人...請見上面的回應留言!
      謝謝!
       

      刪除
  7. 賈老師的真老公2008年12月23日 晚上7:34

    :)) :)) 很好...我可以一次回答兩個問題...
    To: Eric
               如果您是一般8051 ,而且是用24Cxx 的,我是覺得您應該沒機會用這種方式完成跨Banking 的方式,因為只要看兩個規格,您就掛點了...第一: 24Cxx 支持的Clock rate 為400KHz...這還算是Bit的呢...所以啊...當您轉成8 bit Parallel的速度來看...也只有 50KHz...我相信您的8051應該不會跑這麼慢吧....以24Cxx 的規格來說 ...他們只能拿來存一般Data,或是當存Boot Code 用...就是一開機,把整個24Cxx的程式先載到Cache...再跑起來,之後就沒這一棵IC的事了... :)) ...
    不過,偷偷的告訴您...版主用我常用的那顆USB Controller ,卻是可以利用25Pxx 做到 程式碼無限擴充功能。...改天再以另文說明!
    ------------------------------------
       for 網球小子:
           我不是很清楚您的意思?!...您是說您是將整個8051 Core 放進Vortex 5 裡?!然後希望還可以利用Keil C 的Debug mode ?!....您的Debug Mode 是希望支持Single Step?!Break point ?!...這一點真的就真的比較挑戰了。因為我們也真的不知道Keil C 的debug mode 的內部是如何跟我們Target Board上的 8051 作溝通的(注意,這裡的8051可不是一般市面上的8051喔...他可以支持Hold PC (Program counter )值的囉....所以,一般以我們以前的經驗,就是拿ROM 模擬器來下載ROM 是比較單純的作法....也比較容易Debug ...直接用LA 看8051 在Prefetch ROM Code 的動作...要不然您以為版主的ROM 模擬器是賣給誰的啊?! :)) . :)) ...這樣的環境建立...一般只花IC designer 一兩天就可以打通整個8051 開發環境了...
        ----最重要的是:以IC設計者來說就可專心作IC 設計開發了...剩下的那些寫8051 Code 的...就開始可以交給歹命的 系統工程師了.... :))      .....要不然的話...那您鐵定會比系統工程師還可憐了....
    -----
         第二您所問的Banklink ...很簡單...因為Keil C 不會直接組譯成 *.bin (binary )..而是組譯成 ***.H00/***.H01/***.H02....依此類推...就看您切成多少Bank....之後用HexBIN2 轉成:
    ***.B00/***.B01/***.B02...依此類推,最後呢...就是Banklink 上場,把整個 B00/B01/B02...
    串成整個 Binary擺進ROM (或是我的ROM 模擬器即可!)簡單吧 :)) ...
     

    回覆刪除
  8. 謝謝大大的指教!小弟找到一個有關 code banking 用keil uVision 的 debugger 偵錯方法!
    使用 keil monitor-51 driver debugger 可以做到,不過試了很久,也看了很多的資料!
    我連一個最基本的程式,都進不去debugger mode!
    陷入一個困境,不知大大對 monitor-51 有沒有研究,是否可以教一下小弟完整的使用過程!謝謝!
    我的環境是:
    software:keil uVision2
    hardware: xilinx vertex5
    IC:DW-8051
    我的e-mail是nochange5@hotmail.com!麻煩大大指點小弟,謝謝!感激不盡!
    Best Regards,
    Mark Lee

    回覆刪除
    回覆
    1. 小子大哥啊...
            IC 是DW8051 ...喔...Sy-non-sys?? (只會唸不會拼的)IP 的8051 (4T) 的!
            我不是跟您說過了嗎?!...就用簡單的ROM 模擬器外加printf (UART) debug就好了...兩天就搞定了嗎?! ...
            這一種純粹是系統應用開發端的思維...您搞設計的就不要這麼辛苦的燃燒生命了吧...真的...就聽我一次建議吧...饒了您我與您周遭的人吧!
            否則啊...就算您搞懂了monitor-51 ...以後也沒有人會感謝您的!...
      更何況您還是要跨 Banking 寫程式的耶。...一樣是透過UART 的printf  的
      debug 方式,您就讓寫韌體搞系統的人來作吧!...

      刪除
  9. 請問一下,我在網路上搜尋都沒找到Banklink.exe這支程式。可以請你提供一下下載地點或是可以打包寄給我嗎?我的信箱 edmondmails@gmail.com 萬分感謝..

    回覆刪除
  10. 版主大大:
    請問您提到的banklink.exe這個工具是free的嗎?到哪個網站可以找到呢?因為拜讀大大的文章後 , 試著去找尋這個tool , 但是卻找不到 , 懇請大大幫忙告知 , 謝謝您!!
    我的e-mail: freeman_6_10@hotmail.com , 謝謝您!!
    Jared Huang

    回覆刪除
    回覆
    1. 不好意思...我查了一下...那支工具程式Banklink.exe 不是網路上的東西。
      我想要這種程式應該不難吧..應該就是把Binary File 連接起來而已吧!
      ...好吧...我找一下,就寄給您吧!

      刪除