Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос про XLC файл IAR4.42A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
igorenja
Суть вопроса:
Во флеши лежит загрузчик и рабочая программа. Как заставить компилятор при компиляции рабочей программы не использовать область 0-3FFF а начать с адреса 4000?

Что пытался сделать:
Правлю в XLC файле параметр -DROMSTART=00004000
компилирую..... и ни чего в прошивке не изменяется.....
что делать....
KSN
глянуть xcl, в нем есть определение сегмента CODE:
-Z(CODE)CODE=_..X_INTVEC_SIZE-_..X_FLASH_END
в Вашем случает подстваить так:
-Z(CODE)CODE=0x4000-_..X_FLASH_END.
Изменить придется все строчки, относящиеся к flash памяти(область памяти CODE)
igorenja
Заменил, все осталось как и прежде.... XLC :

-Z(CONST)INTRAMSTART_REMAP=00200000
-Z(CONST)INTRAMEND_REMAP=0021FFFF

-DROMSTART=00004000
-DROMEND=0007FFFF

-DRAMSTART=00200000
-DRAMEND=0021FFFF

-Z(CODE)INTVEC=00-3F

-Z(CODE)ICODE,DIFUNCT=0x4000-ROMEND
-Z(CODE)SWITAB=ROMSTART-ROMEND

-Z(CODE)CODE=0x4000-ROMEND //ROMSTART

-Z(CONST)INITTAB,DATA_ID,DATA_C=0x4000-ROMEND
-Z(CONST)CHECKSUM=0x4000-ROMEND

-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND

-Z(DATA)CODE_I=RAMSTART-RAMEND
-Z(CONST)CODE_ID=0x4000-ROMEND // Initializer for
-QCODE_I=CODE_ID

-D_CSTACK_SIZE=(100*4)
-D_IRQ_STACK_SIZE=(3*8*4)
-D_HEAP_SIZE=0

-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)HEAP+_HEAP_SIZE=RAMSTART-RAMEND
KSN
Речь о IAR ARM или IAR AVR?
igorenja
IAR ARM
igorenja
В общем проблема решена, но возникла новая: в сгенерированном файле прошивки в самом начале содержатся какието не нулевые символы.... Что это такое непонятно.... как узнать что там за код?
Сергей Борщ
Цитата(igorenja @ Jul 10 2009, 12:18) *
в сгенерированном файле прошивки в самом начале содержатся какието не нулевые символы.... Что это такое непонятно.... как узнать что там за код?
Заставьте линкер сгенерить .map. В конце этого файла будет карта расположения сегментов в памяти. Ищите, какой сегмент попадает в интересующие вас адреса и дальше ищите в этом же файле, откуда этот сегмент появляется.
igorenja
Большое спасибо.
в начало попадает -Z(CODE)INTVEC=00-3F
правлю
-Z(CODE)INTVEC=4000-403F
в .map файле всё замечательно становится. Только прошивка генерируется снова с нулевого адреса.....
Сергей Борщ
Цитата(igorenja @ Jul 10 2009, 15:58) *
Только прошивка генерируется снова с нулевого адреса.....
Верните взад ROMSTART и покажите весь xcl. Кстати, простым смещением векторов вы их можете убить - они должны быть слинкованы так, чтобы работать после перемещения в нулевые адреса ремапом. Это делается примерно так:
Код
-DROMSTART=00101000
-DROMEND=0010FFFF

// Intvec always linked to 0x00-0x3F
-Z(CODE)INTVEC=00000000-0000003F

// ROM
-Z(CODE)INTVEC_I=ROMSTART-ROMEND
-QINTVEC=INTVEC_I                       // place INTVEC image into INTVEC_I.
-Z(CODE)ICODE,CODE,DIFUNCT,SWITAB=ROMSTART-ROMEND
-Z(CONST)INITTAB,DATA_ID,DATA_C,CODE_ID=ROMSTART-ROMEND
igorenja
Показываю весь XLC:

-carm

-Z(CONST)INTRAMSTART_REMAP=00200000
-Z(CONST)INTRAMEND_REMAP=00207FFF

//-DROMSTART=00000000 // FVA coment
-DROMSTART=00004000 // 0x00 <-> 00004000 space for boot
-DROMEND=0007FFFF

-DRAMSTART=00200000
-DRAMEND=00207FFF

-Z(CODE)INTVEC=00-3F
//-Z(CODE)INTVEC=4000-403F

-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
-Z(CODE)SWITAB=ROMSTART-ROMEND

-Z(CODE)CODE=ROMSTART-ROMEND

-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
-Z(CONST)CHECKSUM=ROMSTART-ROMEND

-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND

-Z(DATA)CODE_I=RAMSTART-RAMEND
-Z(CONST)CODE_ID=ROMSTART-ROMEND // Initializer for
-QCODE_I=CODE_ID

//-D_CSTACK_SIZE=(100*4) //FVA coment
//-D_IRQ_STACK_SIZE=(3*8*4) //FVA coment
-D_CSTACK_SIZE=(800*4) //FVA code
-D_IRQ_STACK_SIZE=(50*8*4) //FVA code

-D_HEAP_SIZE=0

-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)HEAP+_HEAP_SIZE=RAMSTART-RAMEND

// -Felf
igorenja
Вот листинг из мар файла
SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
INTVEC 00000000 - 0000003B 3C com 2
ICODE 00004000 - 00004103 104 rel 2
DIFUNCT 00004104 rel 2
CODE 00004104 - 00004407 304 rel 2
INITTAB 00004408 - 00004413 C rel 2
DATA_I 00200000 dse 0
DATA_Z 00200000 - 00200000 1 rel 0
CSTACK 00200004 - 00202003 2000 rel 2
IRQ_STACK 00202004 - 00202A03 A00 rel 2
igorenja
Новое что я нарыл:
тип выходного файла mpds
во вкладке config опций линкера нуно поставить крыжик override default program entry

после этого прошивка начинает генерироваться с адреса 4000, но снова неправильная......(содержание отсутствует...)
igorenja
В общем на данный момент у меня есть один работающий проект в котором прошивка генерируется с нужного адреса. в мар файле этого проекта написано:
ICODE
Relative segment, address: 00004000 - 000040FB (0xfc bytes), align: 2
Segment part 1. ROOT.
ENTRY ADDRESS REF BY
===== ======= ======
__main 000040D0
AT91F_Default_FIQ_handler
000040D8
AT91F_Default_IRQ_handler
000040DC
AT91F_Spurious_handler
000040E0
LOCAL ADDRESS
===== =======
reset 00004000
InitReset 0000408C
undefvec 00004004
swivec 00004008
pabtvec 0000400C
dabtvec 00004010
rsvdvec 00004014
irqvec 00004018
IRQ_Handler_Entry 00004044
fiqvec 0000401C
FIQ_Handler_Entry 0000401C
?jump_to_main 000040C8
?call_exit 000040D4
End 000040D4
_?0 000040E4
_?1 000040E8
_?2 000040EC
_?3 000040F0
_?4 000040F4
_?5 000040F8

И есть ещё мой проект от которого я так и не могу добиться нужного. в его мар файле написано:


ENTRY ADDRESS REF BY
===== ======= ======
_HEAP_SIZE 00000000
_IRQ_STACK_SIZE 00000A00
_CSTACK_SIZE 00002000
RAMEND 00207FFF
RAMSTART 00200000
ROMEND 0007FFFF
ROMSTART 00004000
*************************************************************************

SEGMENTS IN THE MODULE
======================
INITTAB
Relative segment, address: 00004000 - 0000400B (0xc bytes), align: 2
Segment part 20. ROOT.

ENTRY ADDRESS REF BY
===== ======= ======
?init?tab?DATA_Z 00004000

SEGMENT SPACE START ADDRESS END ADDRESS SIZE TYPE ALIGN
======= ===== ============= =========== ==== ==== =====
INITTAB 00004000 - 0000400B C rel 2
DATA_Z 00200000 dse 0



Я так понимаю что после того как я ставлю крыжик override default program entry, defined by application компилятор не может найти начало программы.
Как ему показать на него?
И ещё вопрос, что за файлы Cstartup.s79 Cstartup_SAM7.c и как их подцепить/отцепить от проекта?
Сергей Борщ
Цитата(igorenja @ Jul 13 2009, 05:31) *
Показываю весь XLC:
Еще раз обращаю ваше внимание на
Код
-Z(CODE)INTVEC_I=ROMSTART-ROMEND
-QINTVEC=INTVEC_I                       // place INTVEC image into INTVEC_I.
По каким соображениям вы выбрали формат mpds?
Цитата(igorenja @ Jul 13 2009, 09:24) *
В общем на данный момент у меня есть один работающий проект в котором прошивка генерируется с нужного адреса.
Так может стоит сравнить их xcl?
Цитата(igorenja @ Jul 13 2009, 05:31) *
И ещё вопрос, что за файлы Cstartup.s79 Cstartup_SAM7.c и как их подцепить/отцепить от проекта?
Раз вы спрашиваете, значит они вам пока не нужны. Линкер подтягивает их содержимое из библиотеки в уже скомпилированном виде.
igorenja
По каким соображениям вы выбрали формат mpds?


этот формат стоит в работающем проекте, просто сравнивал настройки моего проекта (неработающего) и работающего промера.

Так может стоит сравнить их xcl?

я их не просто сравнил, я его скопировал в свой проект.... к сожалению не помогло.

-Z(CODE)INTVEC_I=ROMSTART-ROMEND
-QINTVEC=INTVEC_I // place INTVEC image into INTVEC_I.

Появляется ошибка:
Fatal Error[e72]: Segment INTVEC_I must be defined in a segment definition option (-Z, -b or -P)
Сергей Борщ
Цитата(igorenja @ Jul 13 2009, 10:02) *
Появляется ошибка:
Fatal Error[e72]: Segment INTVEC_I must be defined in a segment definition option (-Z, -b or -P)
Какая-то фигня: Как раз строчкой выше вы определяете этот сегмент опцией -Z:
Код
-Z(CODE)INTVEC_I=ROMSTART-ROMEND
Может неточно скопировали эту строчку?

P.S. пользуйтесь форматированием сообщений (кнопками и ), иначе их неудобно читать.
igorenja
Цитата(Сергей Борщ @ Jul 13 2009, 16:00) *
Какая-то фигня: Как раз строчкой выше вы определяете этот сегмент опцией -Z:
Код
-Z(CODE)INTVEC_I=ROMSTART-ROMEND
Может неточно скопировали эту строчку?

P.S. пользуйтесь форматированием сообщений (кнопками и ), иначе их неудобно читать.



Спасибо Вам большое за помощь. Решил проблему путём разбора работающего проекта. Как нибудь на досуге вернусь к этому вопросу.
tazik
Уважаемый, igorenja, у меня такая же проблема, как и у Вас.

Цитата(igorenja @ Jul 14 2009, 11:03) *
Суть вопроса:
Во флеши лежит загрузчик и рабочая программа. Как заставить компилятор при компиляции рабочей программы не использовать область 0-3FFF а начать с адреса 4000?

Что пытался сделать:
Правлю в XLC файле параметр -DROMSTART=00004000
компилирую..... и ни чего в прошивке не изменяется.....
что делать....


С той лишь разницей, что компилятор IAR ARM 5.30, требуемый начальный адрес 0x2000, XLC-файл отсутствует. Но есть *.icf.
Что пытался сделать?
Исправил в icf-файле константы
Код
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__              = 0x00000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__          = 0x00000044;
define symbol __ICFEDIT_region_ROM_end__            = 0x0007FFFF;


_intvec_start__ = 0x00000000 - на 0x00002000
ROM_start__ = 0x00000044 - на 0x00002044

- и программа не работает. Испытуемый пример - uip_webserver - из примеров к платам olimex LPC-P2378.

Ткните, пожалста носом, что читать, где копать.
В компиляторе keil просто надо было выставить начальный адрес IROM1=0x2000 - согласно an10759
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.