標題: IAR for stm8 中指定編譯的起始地址 [打印本頁]
作者: shaonv 時間: 2015-1-1 19:14
標題: IAR for stm8 中指定編譯的起始地址
已經用STVD+cosmic完成了IAP功能,但想試著在STM8上跑上官的UCOS,不得不用IAR編譯,但編譯后代碼的生成地址怎么再從0X9000開始生成呢,找遍全網,也沒有發現三言兩語直接的表白,又對IAR環境不熟,看過了IAR下的工程設置的全部選項,都沒有發現怎么修改這個地址,IAR的這個地址的修改,并不象KEIL及STVD下那么直接,它必須通過IAR的根目錄下有個CONFIG的文件夾,里面有各種單片機的*.icf的文件,我看著有兩處0x8000改為0x9000,然后編譯文件,呵呵,果然有效,在STVP下,發現HEX文件就是從0x9000開始生成代碼了。找的好辛苦,又不太懂英文看幫助,唉,只能受此罪!
ICF修改的是以下三項:
define region NearFuncCode = [from 0x9000 to 0xFFFF];
define region FarFuncCode = [from 0x9000 to 0xFFFF];
define region HugeFuncCode = [from 0x9000 to 0xFFFF];
以下是摘抄的有關ICF文件部分
IAR中xcl及icf文件詳解
鏈接器和鏈接器的配置
2.1 EWARM 4.xx的鏈接器XLINK及其配置文件.xcl
XLINK鏈接器可以把IAR匯編器或編譯器所產生的可重定位的UBROF目標文件轉換成針對目標處理器的機器碼。XLINK一般通過外部鏈接器命令文件(*.xcl)來配置,當然也可以在命令行中直接在xlink命令之后輸入鏈接選項,或者也可以在XLINK_ENVPAR環境變量中設置鏈接選項。下面介紹XCL文件中常用的鏈接選項,以便在版本遷移之前,確切地了解XCL文件的含義。
2.2 XLINK選項
下面介紹幾個XCL文件中常見的鏈接器配置選項。更詳細的內容請查閱XLINK的參考手冊:IAR Linker and Library Tools Reference Guide。
-D -Dsymbol=value
作用:
使用-D選項可以定義一些純粹的符號,一般用于聲明常數。
參數:
symbol是未在其它地方定義過的外部符號,value是symbol所代表的值。例如:
就定義了2個標識了ROM起始和結束地址的符號,這樣以后關于ROM地址的配置都可以直接使用這2個符號,使得配置文件的可讀性增強。
-Z -Z [@] [(SPLIT-)type] segments [=|#] range [, range] …
作用:
使用-Z命令的目的是規定segments在存儲空間中占據的位置和區間。如果鏈接器發現某個segment沒有使用-Z,-b或者-P中的任何一個命令進行定義,則會報錯。
參數:
@ 使用@參數,表示為segments分配空間時不考慮任何已經被使用的地址空間。這適用于當某些segments的地址空間需要發生重疊的情形。
type 參數type規定了segments的存儲類型,默認為UNTYPED。表1列舉了IAR的ARM C/C++編譯器所支持的segments類型。
-Q -Q segment = initializer_segment
作用:
自動設置segment的拷貝初始化。鏈接器會產生一個新的initializer_segment(如CODE_ID),其內容與segment(如CODE_I)完全一致。相關的符號表和調試信息都會和segment相關聯(如CODE_I)。initializer_segment的內容(通常在ROM中)必須在初始化階段被復制到segment(通常在RAM中)。
-c -cprocessor
作用:
規定目標處理器的類型。如-carm。
.3 EWARM 5.xx的鏈接器ILINK及其配置文件.icf
EWARM 5.xx中的鏈接器稱為ILINK。ILINK可以從ELF/DWARF格式的目標文件中提取代碼和數據,并生成可執行映像。在EWARM 4.xx中,基本的代碼和數據鏈接單元是segment,而對于ELF/DWARF格式而言,基本鏈接單元是section。ILINK根據ILINK Configuration File(*.icf)來分配這些sections。由于XLINK與ILINK是兩個完全不同的鏈接器,所以XCL和ICF也是兩種完全不同的配置文件。下面簡要介紹ICF文件的格式和內容,以協助用戶完成版本遷移。
2.4 ICF格式淺析
sections在地址空間中的存放是由ILINK鏈接器來實現的,而ILINK鏈接器是按照用戶在ICF文件中的規定來放置sections的,所以理解ICF文件的內容尤其重要。
一個標準的ICF文件可包括下面這些內容:
1. 可編址的存儲空間(memory)
2. 不同的存儲器地址區域(region)
3. 不同的地址塊(block)
4. Section的初始化與否
5. Section在存儲空間中的放置
下面介紹了幾條ICF文件中常見的指令,詳細內容請參考ILINK相關說明文檔(EWARM_DevelopmentGuide.pdf):
define [ exported ] symbol name = expr;
作用:
指定某個符號的值。
參數:
exported 導出該symbol,使其對可執行鏡像可用
name 符號名
expr 符號值
舉例:
define symbol RAM_START_ADDRESS = 0x40000000;
define symbol RAM_END_ADDRESS = 0x4000FFFF;
define memory name with size = expr [, unit-size];
作用:
定義一個可編址的存儲地址空間(memory)。
參數:
name memory的名稱
expr 地址空間的大小
unit-size expr的單位,可以是位(unitbitsize),缺省是字節(unitbytesize)
舉例:
define memory MEM with size = 4G;
define region name = region-expr;
作用:
定義一個存儲地址區域(region)。一個區域可由一個或多個范圍組成,每個范圍內地址必須連續,但幾個范圍之間不必是連續的。
參數:
name region的名稱
region-expr memory:[from expr { to expr | size expr}],可以定義起止范圍,也可以定義起始地址和region的大小
舉例:
define region ROM = MEM:[from 0x0 size 0x10000];
define region ROM = MEM:[from 0x0 to 0xFFFF];
define block name[ with param, param... ]
{
extended-selectors
};
作用:
定義一個地址塊(block);它可以是個空塊,比如棧、堆;也可以包含一系列sections。
參數:
name block的名稱
param 可以是: size = expr (塊的大。
maximum size = expr (塊大小的上限)
alignment = expr (最小對齊字節數)
fixed order (按照固定順序放置sections)
extended-selector [ first | last ] { section-selector | block name | overlay name }
first 最先存放
last 最后存放
section-selector [ section-attribute ][ section sectionname ][object filename ]
section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ]
sectionname section的名稱
filename 目標文件的名稱
即可以按照section的屬性,名稱及其所在目標文件的名稱這三個過濾條件中,任意選取一個條件,或選取多個條件進行組合,來圈定所要求的sections。
name block或overlay的名稱
舉例:
define block HEAP with size = 0x1000, alignment = 4 { };
define block MYBLOCK1 = { section mysection1, section mysection2, readwrite };
define block MYBLOCK2 = { readonly object myfile2.o };
initialize { by copy | manually } [ with param, param... ]
{
section-selectors
};
作用:
初始化sections。
參數:
by copy 在程序啟動時自動執行初始化。
manually 在程序啟動時不自動執行初始化。
param 可以是: packing = { none | compress1 | compress2 | auto }
copy routine = functionname
packing表示是否壓縮數據,缺省是auto。
functionname表示是否使用自己的拷貝函數來取代缺省函數。
section-selector 同上
舉例:
initialize by copy { rw };
do not initialize
{
section-selectors
};
作用:
規定在程序啟動時不需要初始化的sections。一般用于__no_init聲明的變量段(.noinit)。
參數:
section-selector 同上
舉例:
do not initialize { .noinit };
place at { address memory[: expr] | start of region_expr | end of region_expr }
{
extended-selectors
};
作用:
把一系列sections和blocks放置在某個具體的地址,或者一個region的開始或者結束處。
參數:
memory memory的名稱
expr 地址值,該地址必須在memory所定義的范圍內
region_expr region的名稱
extended-selector 同上
舉例:
place at start of ROM { section .cstart }; place at end of ROM { section .checksum }; place at address MEM:0x0 { section .intvec };
place in region-expr
{
extended-selectors
};
作用:
把一系列sections和blocks放置在某個region中。sections和blocks將按任意順序放置。
參數:
region-expr region的名稱
extended-selector 同上
舉例:
place in ROM { readonly }; place in RAM { readwrite };
place in RAM { block HEAP, block CSTACK, block IRQ_STACK }; place in ROM { section .text object myfile.o }; place in ROM { readonly object myfile.o }; place in ROM { readonly data object myfile.o };
IAR中ICF文件分析與應用
sections在地址空間中的存放是由ILINK鏈接器來實現的,而ILINK鏈接器是按照用戶在ICF文件中的規定來放置sections的,所以理 解ICF文件的內容尤其重要。
一個標準的ICF文件可包括下面這些內容:
1. 可編址的存儲空間(memory)
2. 不同的存儲器地址區域(region)
3. 不同的地址塊(block)
4. Section的初始化與否
5. Section在存儲空間中的放置
下 面介紹了幾條ICF文件中常見的指令,詳細內容請參考ILINK相關說明文檔(EWARM_DevelopmentGuide.pdf):
1. define [ exported ] symbol name = expr;
作用: 指定某個符號的值。
參數: exported 導出該symbol,使其對可執行鏡像可用
name --符號名
expr --符號值
舉例:
define symbol RAM_START_ADDRESS = 0x40000000;
define symbol RAM_END_ADDRESS = 0x4000FFFF;
2. define memory name with size = expr [, unit-size];
作用: 定義一個可編址的存儲地址空間(memory)。
參數: name --memory的名稱
expr --地址空間的大小
unit-size --expr的單位,可以是位(unitbitsize),缺省是字節(unitbytesize)
舉例:
define memory MEM with size = 4G;
3. define region name = region-expr;
作用: 定義一個存儲地址區域(region)。一個區域可由一個或多個范圍組成,每個范圍內地址必須連續,但幾個范圍之間不必是連續的。
參數: name region的名稱
region-expr memory:[from expr { to expr | size expr}],可以定義起止范圍,也可以定義起始地址和region的大小
舉例:
define region ROM = MEM:[from 0x0 size 0x10000];
define region ROM = MEM:[from 0x0 to 0xFFFF];
4. define block name[ with param, param... ]
{
extended-selectors
};
作用: 定義一個地址塊(block);它可以是個空塊,比如棧、堆;也可以包含一系列sections。
參數: name block的名稱
param 可以是: size = expr (塊的大。
maximum size = expr (塊大小的上限)
alignment = expr (最小對齊字節數)
fixed order (按照固定順序放置sections)
extended-selector [ first | last ] { section-selector | block name | overlay name }
first 最先存放
last 最后存放
section-selector [ section-attribute ][ section sectionname ][object filename ]
section-attribute [ readonly [ code | data ] | readwrite [ code | data ] | zeroinit ]
sectionname section的名稱
filename 目標文件的名稱
即可以按照section的屬性,名稱及其所在目標文件的名稱這三個過濾條件中,任意選取一個條件,或選取多個條件進行組合,來圈定所要求的 sections。
name block或overlay的名稱
舉例:
define block HEAP with size = 0x1000, alignment = 4 { };
define block MYBLOCK1 = { section mysection1, section mysection2, readwrite };
define block MYBLOCK2 = { readonly object myfile2.o };
5. initialize { by copy | manually } [ with param, param... ]
{
section-selectors
};
作用: 初始化sections。
參數: by copy 在程序啟動時自動執行初始化。
manually 在程序啟動時不自動執行初始化。
param 可以是: packing = { none | compress1 | compress2 | auto }
copy routine = functionname
packing表示是否壓縮數據,缺省是auto。
functionname表示是否使用自己的拷貝函數來取代缺省函數。
section-selector 同上
舉例:
initialize by copy { rw };
6. do not initialize
{
section-selectors
};
作用: 規定在程序啟動時不需要初始化的sections。一般用于__no_init聲明的變量段(.noinit)。
參數: section-selector 同上
舉例:
do not initialize { .noinit };
7. place at { address memory[: expr] | start of region_expr | end of region_expr }
{
extended-selectors
};
作用: 把一系列sections和blocks放置在某個具體的地址,或者一個region的開始或者結束處。
參數: memory memory的名稱
expr 地址值,該地址必須在memory所定義的范圍內
region_expr region的名稱
extended-selector 同上
舉例:
place at start of ROM { section .cstart }; place at end of ROM { section .checksum }; place at address MEM:0x0 { section .intvec };
8. place in region-expr
{
extended-selectors
};
作用: 把一系列sections和blocks放置在某個region中。sections和blocks將按任意順序放置。
參數: region-expr region的名稱
extended-selector 同上
舉例:
place in ROM { readonly };
place in RAM { readwrite };
place in RAM { block HEAP, block CSTACK, block IRQ_STACK };
place in ROM { section .text object myfile.o };
place in ROM { readonly object myfile.o };
place in ROM { readonly data object myfile.o };
IAR的ICF文件中宏給程序使用
如果想定在rom空間
icf中:
place at address mem:0x08090000 { readonly section .test };
C:中:
#pragma location = ".test"
const u32 uiData[512];// const 切不可省略
如果想定在ram空間
icf中:
place at address mem:0x08090000 { readwrite section .test };
C:中:
#pragma location = ".test"
u32 uiData[512];
可發現uiData的值為0x08090000
該法可方便通過ICF指定某變量的地址。
程序也可以。寫法類似.vector
如果用block的方。類似
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
C中:
#pragma language="extended"
#pragma segment="CSTACK"
ptr = __sfe( "CSTACK" );可得到CSTACK的高端地址+1
__sfe: Returns last address of segment.
從事電子技術工作這么多年一直想寫點東西,但以限于本人文筆與技術水平一直沒寫。今天有空寫點請多多指教。
define symbol NVNC_Start = 0x08000000; // 中斷起始地址
define symbol NVNC_size_cstack = 0x400; //中斷堆棧尺寸
define symbol PROEG_size_heap = 0x400;//程序堆棧尺寸
define symbol USB_SRAM_start = 0x40006000; //USB 專用SRAM起始與結束地址
define symbol USB_SRAM_end = 0x400063FF;
define symbol SyS_SRAM_start = 0x20000000; //定議RAM起始與結束地址
define symbol SyS_SRAM_end = 0x2000FFFF; // 64K
define symbol SyS_Flash_start = 0x08000800 ; //定議FLASH起始與結束地址
define symbol SyS_Flash_end = 0x0801FFFF; //512K
//define symbol SyS_Flash_P1 = (SyS_Flash_start+(0x800*0));
define memory mem with size = 4G;
define region USB_RAM = mem:[from USB_SRAM_start to USB_SRAM_end];
define region RAM_region = mem:[from SyS_SRAM_start to SyS_SRAM_end];
define region ROM_region = mem:[from SyS_Flash_start to SyS_Flash_end];
define region SysT_RAM = mem:[from 0x0801F800 to 0x0801FFFF];
define block CSTACK with alignment = 8, size = NVNC_size_cstack { };
define block HEAP with alignment = 8, size = PROEG_size_heap { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:NVNC_Start { readonly section .intvec };
place in RAM_region { readwrite,block CSTACK, block HEAP }; // 堆棧指針存放
place in ROM_region { readonly }; // 沒有定議的C文件存放在此
//定議相關文件存儲空間
以上文件只參考IAR目錄下的:《EWARM_DevelopmentGuide.ENU.pdf》
以上有錯或本人理解不對請指出。
IAR的ICF文件中宏給程序使用
如果想定在rom空間
icf中:
place at address mem:0x08090000 { readonly section .test };
C:中:
#pragma location = ".test"
const u32 uiData[512];// const 切不可省略
如果想定在ram空間
icf中:
place at address mem:0x08090000 { readwrite section .test };
C:中:
#pragma location = ".test"
u32 uiData[512];
可發現uiData的值為0x08090000
該法可方便通過ICF指定某變量的地址。
程序也可以。寫法類似.vector
如果用block的方。類似
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
C中:
#pragma language="extended"
#pragma segment="CSTACK"
ptr = __sfe( "CSTACK" );可得到CSTACK的高端地址+1
__sfe: Returns last address of segment.
作者: touren 時間: 2015-1-2 15:12
樓主強大,記錄了
作者: hclin 時間: 2015-7-26 01:51
Very very good, nice job !!!
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
日本免费一级
|
黄色成人毛片
|
成人爽a毛片一区二区免费
亚洲午夜在线观看
|
亚洲天堂一区二区三区
|
国产一区二区三区久久
|
黄色一级录像
|
一区|
国产一区福利
|
97超碰资源站
|
四虎地址|
在线天堂视频
|
日韩免费
|
国产美女91呻吟求
|
欧美8888
|
国产精品美女在线
|
亚洲区在线|
欧美成人黄色
|
欧美成人小视频
|
国产二区精品
|
欧美日在线|
igao在线观看
|
天天综合影院
|
天天爽夜夜爽夜夜爽精品视频
|
男女啪啪无遮挡
|
久久日韩精品
|
天堂中文在线视频
|
亚洲一区二区欧美
|
欧美成人精品一区二区三区
|
日韩在线小视频
|
国产一区二区三区在线视频
|
天天干天天操天天爽
|
一区在线播放
|
一区二区三区不卡视频
|
日韩国产精品一区二区
|
欧美精品久久久久
|
亚洲美女网站
|
欧美在线小视频
|
亚洲激情在线视频
|
三级黄色片网站
|
精品综合网
|
91一区二区|