IAR切BANK--BANK说明
一、為什么要用到BANK?
C51單片機的最大尋址范圍為2^16=64K,為了突破64K代碼的限制,就需要采用C51的切BANK。
二、切BANK的原理
代碼地址空間的上半部 ,以重疊BANK0的物理地址空間 , 硬件設計了 n個存儲 器頁面來存儲程序代碼 。在任一時刻 BANK0~n中 , 只能有一個 BANK 處于激 活狀態。當BANKi處于激活狀態時,其物理地址空間為BankBase Addr ~ 0xFFFF。 只有 當BANK處于激活狀態時, BANK 中的程序代碼才可以運行 。
邏輯地址范圍都是相對的,更像是bank的編號,映射到可尋址的物理地址空間去!
為了尋址任意BANK中的過程代碼,C51編譯器為過程調用生成了如下的BANK地址:
Base地址是可變的,但為了譯碼方便,一般選為8000H。當某過程調用任一不在同一BANK中的其它過程時,BANK地址中的Bank-Number被送到切換BANK的譯碼電路,而16位的偏移地址被送往地址總線,從而實現不同BANK中的過程調用。
三、ROOT BANK的使用
下半部分的代碼沒有做BANK處理,它被稱為ROOT BANK。只是因為C51編譯器僅對過程調用產生BANK地址,而對于調用之外的所有其它部分如CONST等不產生BANK地址,ROOT BANK即用來存放這部分代碼。除此之外,ROOT BANK一般還用來存放下列代碼:C51的庫函數、所有的變量初始化數據、中斷服務程序代碼、CATARTED代碼。編譯器總是以NON BANK方式對這一類代碼進行操作。
而對于其它代碼來說,既可以放在BANK中,也可以放在ROOT BANK,但為了提高系統的運行效率,對經常調用的公共程序模塊,應盡可能放在ROOT BANK中,以減少BANK的切換,而對于匯編語言編寫的程序塊,如果將其放在BANK中,則需要人工在匯編程序中添加對BANK切換的操作,非常繁瑣,因此用匯編語言編寫的程序模塊一般也放在ROOTBANK中。
公共區域常常包括那些必須一直需要訪問的進程和數據常量,如中斷進程、中斷和復位向量、字符串常量和塊切換進程。因此,公用代碼空間的起始位置通常為代碼塊的0X0000。
四、BANK函數的使用
任一個C程序模塊,在編譯時都要生成一個CODE段,而Linker不可能把一個模塊的CODE分配到多個BANK中。只要不超出BANK的空間,linker可以把多個程序模塊的代碼放入一個BANK中,將每個程序模塊最小化,便可以充分利用BANK的空間資源。
在BANK模式中,當編譯器不知道調用與被調用是否在同一個BANK時,就會按照BANK調用方式產生程序代碼。函數默認采用__banked_func,如果非BANK的函數,則需要人工加上__near_func字段。
五、其它
1.????當調用與被調用過程在同一個源代碼程序模塊時,編譯器可知道它們在同一個物理BANK中,這時編譯器使用NON BANK方式產生函數調用代碼。
2.????當過程被說明為static類型時,編譯器認為所有對static過程的調用均在本程序模塊中,編譯器產生NON BANK的調用方式。
3.????對于被說明為interrupt的中斷過程,編譯器總是產生NON BANK的調用方式對其調用,因為中斷過程總是要放在ROOT BANK中。
4.????根據BANK的分配情況,使用non-banked編譯條件對源程序中的過程進行說明,人為地控制編譯器產生NON BANK方式的調用。
?
總結
以上是生活随笔為你收集整理的IAR切BANK--BANK说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React Router路由详解
- 下一篇: 【预测模型】基于蝙蝠算法优化最小二乘支持