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