codewarrior的prm文件

【轉自:http://61ic.com/code/redirect.php?fid=254&tid=43984&goto=nextnewset 】

通過項目模板建立的新項目中都有一個名字爲project.prm的文件。一個標準的prm文件起始內容如下:
例4.1 prm 文件內容實例

/**************************************************************************************************************************************/
                                 /* This is a linker parameter file for the AW32 */
NAMES END          /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */


SEGMENTS            /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
    ROM = READ_ONLY 0x8000 TO 0xFFAF;
    Z_RAM = READ_WRITE 0x0070 TO 0x00FF;
    RAM = READ_WRITE 0x0100 TO 0x086F;
    ROM1 = READ_ONLY 0xFFC0 TO 0xFFCB;
END


PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */
    DEFAULT_RAM INTO RAM;
    DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;
    _DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;
END


STACKSIZE 0x50


VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */
/**************************************************************************************************************************************/

prm 文件組成結構
按所含的信息prm 文件有五個組成部分構成:
       "NAMES-END"部分用以指定在連接時加入除本項目文件列表之外的額外的目標代碼模塊文件,這些文件都是事先經C 編譯器或彙編器編譯好的機器碼目標文件而不是源代碼文件。不過這種用法比較少見,因爲我們可以在圖1-8 所示項目文件列表的?Libs?一欄中添加這些目標代碼文件來實現同樣的任務,而且由項目列表管理這些模塊文件比較直觀方便。
       "SEGMENTS-END"部分定義和劃分芯片所有可用的內存資源,包括程序空間和數據空間。一般我們將程序空間定義成"ROM",把數據空間劃分成第0 頁的?Z_RAM?和普通區域的?RAM?,但實際上這些名字都不是系統保留的關鍵詞,可以由用戶隨意修改。用戶也可以把內存空間按地址和屬性隨意分割成大小不同的塊,每塊可以自由命名。關於內存劃分的具體方法在後面詳解。
      "PLACEMENT - END"部分將指派源程序中所定義的各種段,例如數據段DATA_SEG、CONST_SEG 和代碼段CODE_SEG 被具體放置到哪一個內存塊中。它是將源程序中的定義描述和實際物理內存掛鉤的橋樑。
      "STACKSIZE"定義系統堆棧長度,其後給出的長度字節數可以根據實際應用需要進行修改。堆棧的實際定位取決於RAM 內存的劃分和使用情況。在常見的RAM 線性劃分變量連續分配的情況下,堆棧將緊挨在用戶所定義的所有變量區域的高端。但如果你將RAM 區分成幾個不同的塊,請確保其
中至少有一個塊能容納已經定義的堆棧長度。
       "VECTOR"定義所有矢量入口地址。模板在生成prm 文件時已經定義了復位矢量的入口地址。對於各類中斷矢量用戶必須自己按矢量編號和中斷服務函數名相關聯,請參考3.4.2 中代碼範例。如果中斷函數的定義是用"interrupt"加上矢量號,則無需在這裏重複定義。
     prm 文件中可以添加註釋,語法和C語言相同,可以是"/*?*/"或"//"。


4.2 內存劃分的具體方式
由"SEGMENTS"開始到"END"爲止,中間可以添加任意多行內存劃分的定義,每一行用分號";"結尾。定義行的語法型式爲:
[塊名] = [屬性] [起始地址 ] TO [結束地址];
其中,
         "塊名"的定義和C 語言變量定義相同,是以英文字母開頭的一個字符串。
         "屬性"可以有三種不同的類型。對於只讀的Flash-ROM 區屬性一定是"READ_ONLY",對於可讀寫的RAM 區屬性可以是"READ_WRITE",也可以是"NO_INIT"。它們兩者的關鍵區別是ANSI-C 的初始化代碼會把定位在"READ_WRITE"塊中的所有全局和靜態變量自動清零,而"NO_INIT"塊中的變量將不會被自動清零。對於單片機系統,變量在復位時不被自動清零這一特性有時是很關鍵的。
         起始地址和結束地址決定了一內存塊的物理位置,用16進製表示。
下面舉幾個例子來進一步說明:
例4.2 劃分Flash-ROM 區,定義512 字節EEPROM 模擬區
SEGMENTS
EEPROM = READ_ONLY 0x8000 TO 0x81FF;
ROM = READ_ONLY 0x8200 TO 0xFFAF;
Z_RAM = READ_WRITE 0x0070 TO 0x00FF;
RAM = READ_WRITE 0x0100 TO 0x086F;
END
例4.3 劃分RAM 區,定義16 字節非自動清零的數據保留區
SEGMENTS
ROM = READ_ONLY 0x8000 TO 0xFFAF;
Z_RAM = READ_WRITE 0x0070 TO 0x00FF;
RAM_KEEP = NO_INIT 0x0100 TO 0x010F;
RAM = READ_WRITE 0x0110 TO 0x086F;
END


用"SEGMENTS"只是從單片機的物理內存這一角度對其進行空間劃分。源程序本身並不知道物理內存被分割和屬性定義的這些細節。它們兩者之間必須通過下面的"PLACEMENT"建立聯繫。
4.3 程序段和數據段的放置
"PLACEMENT - END"內所描述的信息是告訴連接器源程序中所定義的各類段應該被具體放置到哪一個內存塊中去。其語法型式爲:
[段名1], [段名2],... [段名n] INTO [內存塊名];
其中
          段名就是在源程序中用"#pragma"聲明的數據段、常數段或代碼段的名字。如果用缺省名"DEFAULT " , 則默認的數據段名爲?DEFAULT_RAM?,代碼段和常數段名爲"DEFAULT_ROM"。若程序中定義的段名沒有在PLACEMENT 中提及,則將被視同爲DEFAULT。幾個相同性質但不同名字的段可以被放置到同一個內存塊中,相互之間用逗號","分隔。

    INTO 是系統保留的關鍵詞,在這裏爲"放入"的意思。
         內存塊名就是前面介紹的用"SEGMENTS"劃分好的不同的內存塊名字。利用這樣直觀的定位描述文本可以方便靈活的將你的數據或代碼定位到芯片內存任意可能的位置,實現某些特殊目的的應用。下面舉幾個例子,注意各種段名、PLACEMENT 和SEGMENTS 之間的對應關係。
例4.4 定義並保留512 字節Flash 字節作爲EEPROM 模擬
//prm 文件SEGMENTS 定義:
SEGMENTS
EEPROM = READ_ONLY 0x8000 TO 0x81FF;
ROM = READ_ONLY 0x8200 TO 0xFFAF;
Z_RAM = READ_WRITE 0x0070 TO 0x00FF;
RAM = READ_WRITE 0x0100 TO 0x086F;
END
//prm 文件PLACEMENT 定義:
PLACEMENT
DEFAULT_RAM INTO RAM;
DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;
_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;
EE_DATA INTO EEPROM;
END
//源程序編寫:
#pragma CONST_SEG EE_DATA
const byte eeDataBuff[512]="123456";


例4.5 將不同的代碼段分別放置於不同的程序區
//prm 文件SEGMENTS 定義:
SEGMENTS
BOOT_SECTOR = READ_ONLY 0x8000 TO 0x87FF; //2KB 作爲加載引導專用區
ROM = READ_ONLY 0x8800 TO 0xFFAF;
Z_RAM = READ_WRITE 0x0070 TO 0x00FF;
RAM = READ_WRITE 0x0100 TO 0x086F;
END
//prm 文件PLACEMENT 定義:
PLACEMENT
DEFAULT_RAM INTO RAM;
DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;
_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;
BOOT_LOADER INTO BOOT_SECTOR;
END
//源程序編寫:
#pragma CODE_SEG BOOT_LOADER //定義專用的加載引導代碼段
void CodeLoader(void)
{
...
}
#pragma CODE_SEG DEFAULT //普通代碼段
void main(void)
{
...
}


例4.6 定義非自動清零的數據段
//prm 文件SEGMENTS 定義:
SEGMENTS
ROM = READ_ONLY 0x8000 TO 0xFFAF;
Z_RAM = READ_WRITE 0x0070 TO 0x00FF;
RAM_KEEP = NO_INIT 0x0100 TO 0x011F; //32 字節非自動清零數據段
RAM = READ_WRITE 0x0120 TO 0x086F;
END
//prm 文件PLACEMENT 定義:
PLACEMENT
DEFAULT_RAM INTO RAM;
DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;
_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;
DATA_PERSISTENT INTO RAM_KEEP;
END
//源程序編寫:
#pragma DATA_SEG DATA_PERSISTENT //定義復位時非自定清零數據段
byte sysState;
word pulseCounter;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章