當有三個函數為 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 函數去使用,如此也會產生大問題。