久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6844|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

IAR for stm8 中指定編譯的起始地址

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:71477 發(fā)表于 2015-1-1 19:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
已經(jīng)用STVD+cosmic完成了IAP功能,但想試著在STM8上跑上官的UCOS,不得不用IAR編譯,但編譯后代碼的生成地址怎么再?gòu)?X9000開(kāi)始生成呢,找遍全網(wǎng),也沒(méi)有發(fā)現(xiàn)三言?xún)烧Z(yǔ)直接的表白,又對(duì)IAR環(huán)境不熟,看過(guò)了IAR下的工程設(shè)置的全部選項(xiàng),都沒(méi)有發(fā)現(xiàn)怎么修改這個(gè)地址,IAR的這個(gè)地址的修改,并不象KEIL及STVD下那么直接,它必須通過(guò)IAR的根目錄下有個(gè)CONFIG的文件夾,里面有各種單片機(jī)的*.icf的文件,我看著有兩處0x8000改為0x9000,然后編譯文件,呵呵,果然有效,在STVP下,發(fā)現(xiàn)HEX文件就是從0x9000開(kāi)始生成代碼了。找的好辛苦,又不太懂英文看幫助,唉,只能受此罪!
ICF修改的是以下三項(xiàng):
define region NearFuncCode = [from 0x9000 to 0xFFFF];
define region FarFuncCode = [from 0x9000 to 0xFFFF];
define region HugeFuncCode = [from 0x9000 to 0xFFFF];
以下是摘抄的有關(guān)ICF文件部分


IARxclicf文件詳解
鏈接器和鏈接器的配置
2.1 EWARM 4.xx的鏈接器XLINK及其配置文件.xcl
XLINK鏈接器可以把IAR匯編器或編譯器所產(chǎn)生的可重定位的UBROF目標(biāo)文件轉(zhuǎn)換成針對(duì)目標(biāo)處理器的機(jī)器碼。XLINK一般通過(guò)外部鏈接器命令文件(*.xcl)來(lái)配置,當(dāng)然也可以在命令行中直接在xlink命令之后輸入鏈接選項(xiàng),或者也可以在XLINK_ENVPAR環(huán)境變量中設(shè)置鏈接選項(xiàng)。下面介紹XCL文件中常用的鏈接選項(xiàng),以便在版本遷移之前,確切地了解XCL文件的含義。
2.2 XLINK選項(xiàng)
下面介紹幾個(gè)XCL文件中常見(jiàn)的鏈接器配置選項(xiàng)。更詳細(xì)的內(nèi)容請(qǐng)查閱XLINK的參考手冊(cè):IAR Linker and Library Tools Reference Guide
-D -Dsymbol=value
作用:
使用-D選項(xiàng)可以定義一些純粹的符號(hào),一般用于聲明常數(shù)。
參數(shù):
symbol是未在其它地方定義過(guò)的外部符號(hào),valuesymbol所代表的值。例如:
就定義了2個(gè)標(biāo)識(shí)了ROM起始和結(jié)束地址的符號(hào),這樣以后關(guān)于ROM地址的配置都可以直接使用這2個(gè)符號(hào),使得配置文件的可讀性增強(qiáng)。
-Z -Z [@] [(SPLIT-)type] segments [=|#] range [, range] …
作用:
使用-Z命令的目的是規(guī)定segments在存儲(chǔ)空間中占據(jù)的位置和區(qū)間。如果鏈接器發(fā)現(xiàn)某個(gè)segment沒(méi)有使用-Z-b或者-P中的任何一個(gè)命令進(jìn)行定義,則會(huì)報(bào)錯(cuò)。
參數(shù):
@ 使用@參數(shù),表示為segments分配空間時(shí)不考慮任何已經(jīng)被使用的地址空間。這適用于當(dāng)某些segments的地址空間需要發(fā)生重疊的情形。
type 參數(shù)type規(guī)定了segments的存儲(chǔ)類(lèi)型,默認(rèn)為UNTYPED。表1列舉了IARARM C/C++編譯器所支持的segments類(lèi)型。
-Q -Q segment = initializer_segment
作用:
自動(dòng)設(shè)置segment的拷貝初始化。鏈接器會(huì)產(chǎn)生一個(gè)新的initializer_segment(如CODE_ID),其內(nèi)容與segment(如CODE_I)完全一致。相關(guān)的符號(hào)表和調(diào)試信息都會(huì)和segment相關(guān)聯(lián)(如CODE_I)。initializer_segment的內(nèi)容(通常在ROM中)必須在初始化階段被復(fù)制到segment(通常在RAM中)。
-c -cprocessor
作用:
規(guī)定目標(biāo)處理器的類(lèi)型。如-carm
.3 EWARM 5.xx的鏈接器ILINK及其配置文件.icf
EWARM 5.xx中的鏈接器稱(chēng)為ILINKILINK可以從ELF/DWARF格式的目標(biāo)文件中提取代碼和數(shù)據(jù),并生成可執(zhí)行映像。在EWARM 4.xx中,基本的代碼和數(shù)據(jù)鏈接單元是segment,而對(duì)于ELF/DWARF格式而言,基本鏈接單元是sectionILINK根據(jù)ILINK Configuration File*.icf)來(lái)分配這些sections。由于XLINKILINK是兩個(gè)完全不同的鏈接器,所以XCLICF也是兩種完全不同的配置文件。下面簡(jiǎn)要介紹ICF文件的格式和內(nèi)容,以協(xié)助用戶(hù)完成版本遷移。
2.4 ICF格式淺析
sections在地址空間中的存放是由ILINK鏈接器來(lái)實(shí)現(xiàn)的,而ILINK鏈接器是按照用戶(hù)在ICF文件中的規(guī)定來(lái)放置sections的,所以理解ICF文件的內(nèi)容尤其重要。
一個(gè)標(biāo)準(zhǔn)的ICF文件可包括下面這些內(nèi)容:
1.       可編址的存儲(chǔ)空間(memory
2.       不同的存儲(chǔ)器地址區(qū)域(region
3.       不同的地址塊(block
4.       Section的初始化與否
5.       Section在存儲(chǔ)空間中的放置
下面介紹了幾條ICF文件中常見(jiàn)的指令,詳細(xì)內(nèi)容請(qǐng)參考ILINK相關(guān)說(shuō)明文檔(EWARM_DevelopmentGuide.pdf):
define [ exported ] symbol name = expr;
作用:
指定某個(gè)符號(hào)的值。
參數(shù):
exported 導(dǎo)出該symbol,使其對(duì)可執(zhí)行鏡像可用
name 符號(hào)名
expr 符號(hào)值
舉例:
define symbol RAM_START_ADDRESS = 0x40000000;
define symbol RAM_END_ADDRESS = 0x4000FFFF;
define memory name with size = expr [, unit-size];
作用:
定義一個(gè)可編址的存儲(chǔ)地址空間(memory)。
參數(shù):
name memory的名稱(chēng)
expr 地址空間的大小
unit-size expr的單位,可以是位(unitbitsize),缺省是字節(jié)(unitbytesize
舉例:
define memory MEM with size = 4G;
define region name = region-expr;
作用:
定義一個(gè)存儲(chǔ)地址區(qū)域(region)。一個(gè)區(qū)域可由一個(gè)或多個(gè)范圍組成,每個(gè)范圍內(nèi)地址必須連續(xù),但幾個(gè)范圍之間不必是連續(xù)的。
參數(shù):
name region的名稱(chēng)
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
};
作用:
定義一個(gè)地址塊(block);它可以是個(gè)空塊,比如棧、堆;也可以包含一系列sections
參數(shù):
name block的名稱(chēng)
param 可以是: size = expr (塊的大小)
maximum size = expr (塊大小的上限)
alignment = expr (最小對(duì)齊字節(jié)數(shù))
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的名稱(chēng)
filename 目標(biāo)文件的名稱(chēng)
即可以按照section的屬性,名稱(chēng)及其所在目標(biāo)文件的名稱(chēng)這三個(gè)過(guò)濾條件中,任意選取一個(gè)條件,或選取多個(gè)條件進(jìn)行組合,來(lái)圈定所要求的sections
name blockoverlay的名稱(chēng)
舉例:
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
參數(shù):
by copy 在程序啟動(dòng)時(shí)自動(dòng)執(zhí)行初始化。
manually 在程序啟動(dòng)時(shí)不自動(dòng)執(zhí)行初始化。
param 可以是: packing = { none | compress1 | compress2 | auto }
copy routine = functionname
packing表示是否壓縮數(shù)據(jù),缺省是auto
functionname表示是否使用自己的拷貝函數(shù)來(lái)取代缺省函數(shù)。
section-selector 同上
舉例:
initialize by copy { rw };
do not initialize
{
section-selectors
};
作用:
規(guī)定在程序啟動(dòng)時(shí)不需要初始化的sections。一般用于__no_init聲明的變量段(.noinit)。
參數(shù):
section-selector 同上
舉例:
do not initialize { .noinit };
place at { address memory[: expr] | start of region_expr | end of region_expr }
{
extended-selectors
};
作用:
把一系列sectionsblocks放置在某個(gè)具體的地址,或者一個(gè)region的開(kāi)始或者結(jié)束處。
參數(shù):
memory memory的名稱(chēng)
expr 地址值,該地址必須在memory所定義的范圍內(nèi)
region_expr region的名稱(chēng)
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
};
作用:
把一系列sectionsblocks放置在某個(gè)region中。sectionsblocks將按任意順序放置。
參數(shù):
region-expr region的名稱(chēng)
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 };

IARICF文件分析與應(yīng)用
sections在地址空間中的存放是由ILINK鏈接器來(lái)實(shí)現(xiàn)的,而ILINK鏈接器是按照用戶(hù)在ICF文件中的規(guī)定來(lái)放置sections的,所以理 解ICF文件的內(nèi)容尤其重要。

一個(gè)標(biāo)準(zhǔn)的ICF文件可包括下面這些內(nèi)容:

1.       可編址的存儲(chǔ)空間(memory
2.       不同的存儲(chǔ)器地址區(qū)域(region
3.       不同的地址塊(block
4.       Section的初始化與否
5.       Section在存儲(chǔ)空間中的放置

下 面介紹了幾條ICF文件中常見(jiàn)的指令,詳細(xì)內(nèi)容請(qǐng)參考ILINK相關(guān)說(shuō)明文檔(EWARM_DevelopmentGuide.pdf):

1.    define [ exported ] symbol name = expr;
作用:    指定某個(gè)符號(hào)的值。

參數(shù):    exported 導(dǎo)出該symbol,使其對(duì)可執(zhí)行鏡像可用
name     --符號(hào)名
expr     --符號(hào)值

舉例:
define symbol RAM_START_ADDRESS = 0x40000000;
define symbol RAM_END_ADDRESS = 0x4000FFFF;   

2.    define memory name with size = expr [, unit-size];

作用:    定義一個(gè)可編址的存儲(chǔ)地址空間(memory)。

參數(shù):    name     --memory的名稱(chēng)
expr     --地址空間的大小
unit-size --expr的單位,可以是位(unitbitsize),缺省是字節(jié)(unitbytesize

舉例:
define memory MEM with size = 4G;

3.    define region name = region-expr;

作用:    定義一個(gè)存儲(chǔ)地址區(qū)域(region)。一個(gè)區(qū)域可由一個(gè)或多個(gè)范圍組成,每個(gè)范圍內(nèi)地址必須連續(xù),但幾個(gè)范圍之間不必是連續(xù)的。

參數(shù):    name region的名稱(chēng)
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

};

作用:    定義一個(gè)地址塊(block);它可以是個(gè)空塊,比如棧、堆;也可以包含一系列sections

參數(shù):    name     block的名稱(chēng)
param 可以是:     size = expr (塊的大小)
maximum size = expr (塊大小的上限)
alignment = expr (最小對(duì)齊字節(jié)數(shù))
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的名稱(chēng)
filename 目標(biāo)文件的名稱(chēng)
即可以按照section的屬性,名稱(chēng)及其所在目標(biāo)文件的名稱(chēng)這三個(gè)過(guò)濾條件中,任意選取一個(gè)條件,或選取多個(gè)條件進(jìn)行組合,來(lái)圈定所要求的 sections
name blockoverlay的名稱(chēng)

舉例:
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

參數(shù):    by copy 在程序啟動(dòng)時(shí)自動(dòng)執(zhí)行初始化。
manually 在程序啟動(dòng)時(shí)不自動(dòng)執(zhí)行初始化。
param 可以是: packing = { none | compress1 | compress2 | auto }
copy routine = functionname
packing表示是否壓縮數(shù)據(jù),缺省是auto
functionname表示是否使用自己的拷貝函數(shù)來(lái)取代缺省函數(shù)。
section-selector 同上

舉例:
initialize by copy { rw };

6.    do not initialize
{
section-selectors
};

作用:    規(guī)定在程序啟動(dòng)時(shí)不需要初始化的sections。一般用于__no_init聲明的變量段(.noinit)。

參數(shù):    section-selector 同上

舉例:
do not initialize { .noinit };

7.    place at { address memory[: expr] | start of region_expr | end of region_expr }
{
extended-selectors
};

作用:    把一系列sectionsblocks放置在某個(gè)具體的地址,或者一個(gè)region的開(kāi)始或者結(jié)束處。

參數(shù):    memory memory的名稱(chēng)
expr 地址值,該地址必須在memory所定義的范圍內(nèi)
region_expr region的名稱(chēng)
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
};

作用:    把一系列sectionsblocks放置在某個(gè)region中。sectionsblocks將按任意順序放置。

參數(shù):    region-expr region的名稱(chēng)
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 };     

IARICF文件中宏給程序使用

如果想定在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];

可發(fā)現(xiàn)uiData的值為0x08090000

該法可方便通過(guò)ICF指定某變量的地址。

程序也可以。寫(xiě)法類(lèi)似.vector

如果用block的方。類(lèi)似

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };

C中:

#pragma language="extended"
#pragma segment="CSTACK"

ptr = __sfe( "CSTACK" );可得到CSTACK的高端地址+1

__sfeReturns last address of segment.

從事電子技術(shù)工作這么多年一直想寫(xiě)點(diǎn)東西,但以限于本人文筆與技術(shù)水平一直沒(méi)寫(xiě)。今天有空寫(xiě)點(diǎn)請(qǐng)多多指教。


define symbol NVNC_Start = 0x08000000; // 中斷起始地址
define symbol NVNC_size_cstack   = 0x400; //中斷堆棧尺寸
define symbol PROEG_size_heap    = 0x400;//程序堆棧尺寸

define symbol USB_SRAM_start  = 0x40006000; //USB 專(zhuān)用SRAM起始與結(jié)束地址
define symbol USB_SRAM_end    = 0x400063FF;

define symbol SyS_SRAM_start   = 0x20000000;  //定議RAM起始與結(jié)束地址
define symbol SyS_SRAM_end     = 0x2000FFFF; // 64K

define symbol SyS_Flash_start   = 0x08000800 ; //定議FLASH起始與結(jié)束地址
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 }; // 沒(méi)有定議的C文件存放在此
//定議相關(guān)文件存儲(chǔ)空間


以上文件只參考IAR目錄下的:《EWARM_DevelopmentGuide.ENU.pdf
以上有錯(cuò)或本人理解不對(duì)請(qǐng)指出。

IARICF文件中宏給程序使用
如果想定在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];

可發(fā)現(xiàn)uiData的值為0x08090000

該法可方便通過(guò)ICF指定某變量的地址。

程序也可以。寫(xiě)法類(lèi)似.vector

如果用block的方。類(lèi)似

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };

C中:

#pragma language="extended"

#pragma segment="CSTACK"

ptr = __sfe( "CSTACK" );可得到CSTACK的高端地址+1
__sfeReturns last address of segment.


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:71505 發(fā)表于 2015-1-2 15:12 | 只看該作者
樓主強(qiáng)大,記錄了
回復(fù)

使用道具 舉報(bào)

板凳
ID:43600 發(fā)表于 2015-7-26 01:51 | 只看該作者
Very very good, nice job !!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 网站黄色在线免费观看 | 五月激情综合 | 先锋资源吧 | 在线黄av| 中文字幕在线精品 | 国产日韩一区二区三免费 | www.久久久久久久久久久 | 国产精品2区 | a视频在线观看 | 视频一区二区三区四区五区 | 久草免费在线视频 | 断背山在线观看 | 日韩a| 国产午夜精品一区二区三区 | 欧美精品一区二区三区在线播放 | 99久久精品免费看国产四区 | 午夜小影院 | 99精品免费视频 | 九九热这里只有精品6 | 日韩综合在线视频 | 91精品一区二区三区久久久久久 | 欧美日本久久 | 色综合成人网 | 精品免费国产一区二区三区四区 | 久久精品国产久精国产 | 久久不卡区 | 久久精品亚洲精品国产欧美 | 欧洲妇女成人淫片aaa视频 | 精品视频一区二区三区 | 久久精品在线 | 欧美三级电影在线播放 | 91精品国产综合久久国产大片 | 搞黄网站在线观看 | 一区二区日韩 | 日韩av.com | 操操操av| 国产视频不卡一区 | 日韩精品在线观看一区二区三区 | 女女爱爱视频 | 天堂在线网 | 天天插天天操 |