Keil C51 Code Banking

Posted by: 邱小新 at 上午9:50 in

當有三個函數為 A2() 位於 common 區,A0() 位於 bank0,A1() 位於 bank1,而且三個函數同時寫在 AA.c 裏,只是利用 CODE(?PR?A2?AA) bank0(?PR?A0?RAM) bank1(?PR?A1?RAM) 來分開,並且在 A2() 函數裏會呼叫 A1() 及 A0() 函數時,必須把 AA.c 放在 common 區裏,不可以放在 bank0 or bank1 這樣會造成 compiler 誤判,沒有呼叫 bank_switch 來切換 A1()/A2(),而造成不可預期的錯誤。

雜記

  1. 在 bank0 的函數可以互相呼叫 bank1 函數,沒有限制喔。
  2. 將 keil C51 內建 printf 移到 bank 裏時,最好避免一起把 code constants 一起移到 bank 裏去,不然就會發生最下面紅字警告的問題。

Common Area

common code area 主要是給所有的 bank 使用的函數或是固定資料。下面是一些會放在 common area 的函數及資料。
  1. Reset and Interrupt Vectors 重置及中斷指標
    主要是給硬體中斷時直接存取使用,所以必須放在 common area。

  2. Interrupt Functions 中斷函數
    主要是給硬體中斷時直接存取使用,所以必須放在 common area。

  3. Bank Switch Code 切換區塊函數
    這樣一定要放 common area,不然怎麼做切換啊。

  4. Library Functions 程式庫函數
    因為無法預知那個區塊會用到,所以都放在 common area。

  5. Code Constants 程式區資料變數
    這個不知為啥都放在 common area,可以經由參數設定放置在 bank 裏。

Code Constants 移至 bank 裏

code constants 主要就是經由宣告成 code 的變數,如字串,表格等。另外包含在 printf 裏面的字串也會放在 code constants,所以常常發現沒有宣告 code 變數,卻出現 ?CO?MYCODE 在 prog_name.m51 裏。
  1. 假設專案名稱為 prog,原始碼檔案為 test.c,晶片為 winbond W79E632。
  2. 在 prog.m51 裏的 C O D E M E M O R Y 區塊裏放置 common area 的資料描述。
  3. 在 test.c 裏的 code constants 會被統一放置在 ?CO?TEST 裏。
  4. Project --> Options for Target 'W79E632' --> BL51 Misc。
  5. 在 Misc controls 裏填入 BANK0(?CO?TEST (0x8000)) 即可,0x8000 是指定放在 bank0 的位址,也可以不填,由 keil 自動調配。
  6. 如果有多個 code constants,則使用逗號來分別,如 BANK0(?CO?TSUMU58EJ_CONF , ?CO?MODE_CONF, ?CO?MSTAR)。

要非常注意 code constants 移到 bank0 裏時,只能給 bank0 的函數使用,如果 bank1 函數要使用同樣的資料,會造成找到錯誤的資料而發生不可預期的問題。還有也要檢查 bank0 函數使用時,有無呼叫到 bank1 的函數,該函數是否把 code constants 當成參數傳到 bank1 函數去使用,如此也會產生大問題。

2 意見

不好意思請教一下:如果我有2個獨立的副程式,但我希望副程式1放在ROM ADDRESS 的0x500,副程式2放在ROM ADDRESS 的0x800,當然我可以確定程式不會大於所設定的範圍,如果要利用C來寫,那該如何設定...謝謝您。

你好,我用C51有幾個外部暫存器位址為0x80~0x8f,我設定xdata P0OE = 0x80;等等的,用反組譯拉出來看位址都是錯的,位址看到的是0x000c.請問要怎麼設才對,謝謝你。

張貼留言