(1)問:當我在編譯一個PIC的程序時得到這樣的報錯:
::Can't find space for psect rbss_0 in segment BANK0 (error)
這究竟是什么意思?
答:它說明你已經(jīng)用完了RAM bank0的空間,而且空間還不夠(由rbss_0名稱得出)。在不同的情況下,這樣的報錯也可能是提到class COMBANK的。出現(xiàn)這種報錯,你可能需要做的是,要移動一些變量到bank1,2或3。
你可以在一些全局變量的聲明前加上一個前綴限定符,像bank1,例如:
bank1 int fred;
當然,你應(yīng)該把會經(jīng)常訪問的變量歸為一組,并且放置到同一個bank。你不能夠?qū)植孔兞?、函?shù)的參數(shù)來使用bank限定。對于位變量使用bank限定也是可以的。但是,對指針使用bank限定一定要當心,例如:
bank2 char * p;
這是一個指向bank2內(nèi)char型數(shù)據(jù)的指針,這個指針本身(p)還是在bank0里的。
下面這個聲明:
bank2 char * bank1 p;
這是一個指向bank2內(nèi)char型數(shù)據(jù)的指針,但指針本身是位于bank1里的。
(2)問:為什么編譯器不會自動地開始使用bank1、2、3呢?
答:因為你可以把各自獨立編譯的目標文件鏈接到一起,在鏈接之前是不太可能知道所有的東西是否在存儲空間里放得下,到鏈接時再來重新分配變量到其他bank已經(jīng)為時太晚了。如果代碼產(chǎn)生器是用不假定某一個變量位于哪個bank的方式來產(chǎn)生代碼,那么它將不得不在每一個RAM訪問之前和之后,都要產(chǎn)生設(shè)置和重設(shè) bank選擇位的指令,這將是一個完全不能接受的編譯結(jié)果。
即使是嘗試對bank0是否溢出做最好的猜測,對于一個將被編譯的模塊來說也是近乎不可能的——函數(shù)調(diào)用圖的一點點微小的變化就可能很大程度地改變變量分配的需求。
基于這些原因,我們總結(jié)出,除了要求用戶指定bank之外暫時沒有可行的替代方案。(譯者注:這里基本都是針對PICC STD版本而言的,對于PRO版本,因為編譯模式根本改變,前面提到的(1)(2)問題都得到了解決。)
(3)問:我讀了手冊還是不能確切地知道什么東西去了哪里。你能告訴我究竟RAM是怎么來組織的嗎?
答:Bank0是給非const變量使用的,它們有:
1) 局部變量;
2) 靜態(tài)或者全局的變量,沒有用限定符指定到其他bank的;
3) 中斷寄存器保護;
4) 臨時位置(它們將盡可能地被放置到common RAM)。
明確地用bankx限定的東西(不包括局部變量和函數(shù)參數(shù))會被放到相應(yīng)的bank。局部變量(例如:函數(shù)內(nèi)部的不是靜態(tài)的變量)是不能夠被分配到其他bank去的。
-
RAM
+關(guān)注
關(guān)注
8文章
1367瀏覽量
114533 -
編譯器
+關(guān)注
關(guān)注
1文章
1618瀏覽量
49052
發(fā)布評論請先 登錄
相關(guān)推薦
評論