在CodeWarrior中指定堆疊大小及堆疊指標

2021-07-04 12:47:40 字數 1678 閱讀 3610

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...