2017-08-26 45 views
0

我定義了一個自動字符數組如下:XC8:無法定義自動數組

char buffer[100]; 

當我編譯,編譯器返回以下錯誤:

error: (1250) could not find space (100 bytes) for variable _buffer 

但是,當我將其更改爲:

static char buffer[100]; 

程序編譯成功。

注1:

我的目標設備16f1829。

注2:

編譯器版本是1.30。

+0

C中的自動數組是一個堆棧局部變量。微控制器的編譯器可能知道可用的堆棧大小。檢查配置的堆棧大小。可能你可以通過編譯器設置來改變它。驗證您的項目的啓動代碼是否爲該堆棧分配了該大小。 – harper

回答

0

所有PIC16的RAM存儲體都是每個存儲體80字節的可用RAM。這在數據表中的3.2.4節公共RAM中有描述。

您看到的問題與堆棧的大小無關,而是與堆棧上可分配的每個項目的大小無關。

在XC8上,自動變量不能單獨大於一個內存塊,這意味着可能的最大自動變量將是80個字節。

對此進行了詳細的XC8編譯用戶指南在節5.5.2.2.3描述如下:

不同於與非自動變量,它是有效的使用已編譯堆內訪問自動變量增強型中檔設備的線性內存。對於包括PIC18和增強型中檔PIC MCU在內的所有器件,編譯堆棧的每個組件必須完全適合目標器件的一個數據存儲器組(但是,您可以有多個組件,每個組件分配給不同的存儲器)。這將堆棧內的對象的大小限制爲分配給它的銀行的最大可用空間。堆棧中的自動變量越多;空間對大型物體的限制性越大。回想一下,中檔設備上的SFR通常存在於每個數據庫中,因此每個銀行可用的GPR的最大數量通常小於這些設備的銀行規模。