2013-03-29 48 views
2

好的,我一直試圖通過我自己很久解決這個問題,現在我放棄了。我搜遍了所有的網站,直到我無法忍受,我需要幫助!如何在Microchip的C18上使用更大的堆棧大小?

我讀了整個「C18編譯器用戶指南」,它說C18支持使用大小超過256字節的堆棧。但是我做了他們所要求的所有內容,更改了鏈接器腳本並使用了多銀行堆棧模型編譯器選項(-ls),並且在堆棧的第一個銀行被填充後仍然有訪問變量的問題。

我調試了一個簡單的代碼,它簡單地調用一個函數遞歸。該函數有5個浮點參數和5個浮點局部變量,每個調用在堆棧中使用大約42個字節(參數5 * 4 +局部變量5 * 4 +保存舊SFR2值2字節)。第6次調用後,堆棧值將被覆蓋。

在搜索網頁時,我發現很多人給出了關於如何創建和使用大數組(大於256字節)的具體說明。其中一個步驟建議使用指針來訪問數組的元素。我覺得我的問題與這個「使用指針訪問不同銀行中的變量」有關,但我不明白我可以如何將所有局部變量全部更改爲函數調用中的指針。這沒有意義。

爲了真誠,恐怕我只是在做一些非常愚蠢的事情(因爲我找不到任何人討論這個問題)。所有與增加堆棧大小相關的主題都是使用靜態變量建議的。我用這種方法解決了我的問題,但我仍然想知道C18如何支持更大的堆棧大小。

下面是我用來試圖理解這個問題的測試代碼。在調試過程中,我注意到FSR1寄存器被正確更新爲指向下一個存儲區中下一個函數參數和變量應該放置的地址。但是,當局部變量被寫入時,它們會進入堆棧的頂部(即使在調試模式下,MPLAB IDE所指示的變量地址,只有地址的低位字節纔會將數據移動到堆棧,是正確的)。因此,我非常確定問題是編譯器生成的代碼不使用16位地址來使用堆棧。不過,我不知道如何解決它。

關於這個主題的任何討論將不勝感激:) 謝謝!

float testFunction1(float p1, float p2, float p3, float p4, float p5) 
{ 
float v1, v2, v3, v4, v5; 

v1 = p1 + p2; 
v2 = p2 + p3; 
v3 = p3 + p4; 
v4 = p4 + p5; 
v5 = p5 + p1; 

v1 = testFunction1(v1, v2, v3, v4, v5); 
} 

void main() 
{ 
float v1, v2, v3, v4, v5; 

v1 = 0x11ABCDEF; 
v2 = 0xAABBCCDD; 
v3 = 0xABCABCAB; 
v4 = 0xFFEEDDCC; 
v5 = 0x11223344; 

v1 = testFunction1(v1, v2, v3, v4, v5); 
} 
+0

你能顯示鏈接腳本嗎? – mjh2007

+0

哦!我放棄嘗試時忘了這個問題!我現在沒有在這裏,但我會明天嘗試分享它!謝謝! – john1034

回答

0

要啓用多銀行堆棧代碼模型,請在C18編譯器的命令行中使用 - Lmodel開關。

+0

有一種方法可以通過MPLABX IDE執行此操作? – john1034