當有三個函數為 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(),而造成不可預期的錯誤。
雜記
- 在 bank0 的函數可以互相呼叫 bank1 函數,沒有限制喔。
- 將 keil C51 內建 printf 移到 bank 裏時,最好避免一起把 code constants 一起移到 bank 裏去,不然就會發生最下面紅字警告的問題。
Common Area
common code area 主要是給所有的 bank 使用的函數或是固定資料。下面是一些會放在 common area 的函數及資料。- Reset and Interrupt Vectors 重置及中斷指標
主要是給硬體中斷時直接存取使用,所以必須放在 common area。 - Interrupt Functions 中斷函數
主要是給硬體中斷時直接存取使用,所以必須放在 common area。 - Bank Switch Code 切換區塊函數
這樣一定要放 common area,不然怎麼做切換啊。 - Library Functions 程式庫函數
因為無法預知那個區塊會用到,所以都放在 common area。 - Code Constants 程式區資料變數
這個不知為啥都放在 common area,可以經由參數設定放置在 bank 裏。
Code Constants 移至 bank 裏
code constants 主要就是經由宣告成 code 的變數,如字串,表格等。另外包含在 printf 裏面的字串也會放在 code constants,所以常常發現沒有宣告 code 變數,卻出現 ?CO?MYCODE 在 prog_name.m51 裏。- 假設專案名稱為 prog,原始碼檔案為 test.c,晶片為 winbond W79E632。
- 在 prog.m51 裏的 C O D E M E M O R Y 區塊裏放置 common area 的資料描述。
- 在 test.c 裏的 code constants 會被統一放置在 ?CO?TEST 裏。
- Project --> Options for Target 'W79E632' --> BL51 Misc。
- 在 Misc controls 裏填入 BANK0(?CO?TEST (0x8000)) 即可,0x8000 是指定放在 bank0 的位址,也可以不填,由 keil 自動調配。
- 如果有多個 code constants,則使用逗號來分別,如 BANK0(?CO?TSUMU58EJ_CONF , ?CO?MODE_CONF, ?CO?MSTAR)。
要非常注意 code constants 移到 bank0 裏時,只能給 bank0 的函數使用,如果 bank1 函數要使用同樣的資料,會造成找到錯誤的資料而發生不可預期的問題。還有也要檢查 bank0 函數使用時,有無呼叫到 bank1 的函數,該函數是否把 code constants 當成參數傳到 bank1 函數去使用,如此也會產生大問題。
不好意思請教一下:如果我有2個獨立的副程式,但我希望副程式1放在ROM ADDRESS 的0x500,副程式2放在ROM ADDRESS 的0x800,當然我可以確定程式不會大於所設定的範圍,如果要利用C來寫,那該如何設定...謝謝您。
你好,我用C51有幾個外部暫存器位址為0x80~0x8f,我設定xdata P0OE = 0x80;等等的,用反組譯拉出來看位址都是錯的,位址看到的是0x000c.請問要怎麼設才對,謝謝你。