codewarrior自動生成的工程中堆疊指標的初始化機制
開啟codewarrior中的乙個新建工程,在start12.c檔案中可以看到語句
「init_sp_from_startup_desc()」,
這是系統自動生成對堆疊指標的初始化語句。這條語句是個巨集函式,具體為
#define init_sp_from_startup_desc() __asm lds #__seg_end_sstack;
其中__seg_end_sstack是由編譯器根據配置檔案自動生成的,從而達到按照使用者要求配置堆疊指標的目的。
幾種不同的堆疊的記憶體分布及配置方法
1.ram區的開始是堆疊區,隨後是資料區,示意圖如下。
___________________
|堆疊區 |資料區 |未使用區|
|_____|______|______||sp
這時堆疊區的大小由prm檔案中stacksize引數指定,而sp的具體值由編譯器根據指定的堆疊區大小計算得出。
這個記憶體分布是新建工程的預設配置,是由prm檔案中placement區語句:
「sstack, default_ram into ram;」
決定的。當把語句換成:
「default_ram, sstack into ram;」
時,ram區的分布會變為開始是資料區,隨後才是堆疊區。
而且,當不指定sstack在記憶體中分布時,即語句變為:
「default_ram into ram;」
時,ram區的分布也會變為開始是資料區,隨後才是堆疊區
示意圖如下:
___________________
|資料區 |堆疊區 |未使用區|
|_____|______|______||sp
2.堆疊區在ram區任意位置,示意圖如下。
___________________________
|資料區 |未使用區 |堆疊區| 未使用區|
|_____|_______|_____|_______||sp
實現這種分布有兩種方法,
第一種:利用prm檔案
這時sp的值由prm檔案中stacktop引數指定(自動生成的工程中沒有此引數,需要使用者自己新增),堆疊區的大小也需要在prm檔案中自己指定,例子如下:
segments
my_stk = no_init 0xb00 to 0xbff;
my_ram = read_write 0xa00 to 0xaff;
my_rom = read_only 0x800 to 0x9ff;
endplacement
default_rom into my_rom;
default_ram into my_ram;
sstack into my_stk;
endstacktop 0xb7e
本例中堆疊區大小為從0xb7e到0xb00,sp的值為0xb7e。
注:在並不關注堆疊區的位置而僅僅關注堆疊區大小的情況下,codewarrior推薦用stacksize的方式定義堆疊,即此時不推薦用stacktop的方式。
第二種,在start12.c檔案中自己指定
在函式_startup的開始用語句:
__asm lds #var;(var為自己指定的sp的值)
來指定sp的值,堆疊區的大小由prm檔案中stacksize引數指定。
在CodeWarrior中指定堆疊大小及堆疊指標
codewarrior自動生成的工程中堆疊指標的初始化機制 開啟codewarrior中的乙個新建工程,在start12.c檔案中可以看到語句 init sp from startup desc 這是系統自動生成對堆疊指標的初始化語句。這條語句是個巨集函式,具體為 define init sp fr...
在 FlexGrid 控制項中指定最右側顯示的列
flexgrid 控制項提供了指定左側顯示列的功能。因專案的需要,要求能夠指定最右側顯示的列。實現方法 獲取 客戶區寬度,然後通過每列的寬度計算出水平滾動條的位置。但是有乙個麻煩,就是垂直滾動條的問題。首先要能判斷是否有垂直滾動條,然後有垂直滾動條時,需要減出垂直滾動條的寬度,但是控制項沒有提供這方...
easyui 選中指定行
var rowindex 1 定義全域性變數,選中行索引 function pagination true,分頁 pagesize 15,預設選擇的分頁是每頁5行資料 pagelist 15,20,25,30 可以選擇的分頁集合 rownumbers true,行數 onloadsuccess fu...