Цитата(VladislavS @ Nov 8 2007, 23:20)

А есть у кого __iar_data_init() в исходниках? А то привык в проекте cstartup.s79 , low_level_init.c и segment_init.c иметь. Пока только щупаю 5.10 - рабочие проекты на него еще не перевожу, но уже подумываю.
Т.к. пока приходится отлаживать через openOCD (в IAR 5.11 есть поддержка GDB server). Пришлось переходить на 5 IAR. Я тоже люблю цеплять свой стартап. Поэтому разобрался с принципиальным отличием 5 от перыдущих.
Раньше необходимые данные для инициализации сегментов генерил компилер в виде:
Код
PUBWEAK ?init?tab?DATA_Z
RSEG INITTAB:CODE:ROOT(2)
DATA
?init?tab?DATA_Z:
DCD sfe(DATA_Z) - sfb(DATA_Z), sfb(DATA_Z), sfb(DATA_Z)
PUBWEAK ?init?tab?DATA_I
RSEG DATA_ID:CONST:SORT:NOROOT(2)
`?*?DATA_ID`:
RSEG INITTAB:CODE:ROOT(2)
DATA
?init?tab?DATA_I:
DCD sfe(DATA_I) - sfb(DATA_I), sfb(DATA_I), sfb(DATA_ID)
END
и т.п. всякими хитрыми метками и директивами. что бы полностью выкинуть этот стартап. можно было в своем стартапе определить
Код
PUBLIC ?init?tab?DATA_I
?init?tab?DATA_I:
PUBLIC ?init?tab?DATA_Z
?init?tab?DATA_Z:
и сегмент INITTAB не создавался и можно спокойно было инитить сегменты или не инитить...
Теперь принципиально идеология не поменялась просто все это свалили на линкер, поэтому он и не стандартный. Линкер генерит аналог INITTAB ( в который еще похоже добавили адрес функции инициализирующей...).
Но есть способ просто от этого всего избавится!
использовать do not initialize ( в том числе и для DATA_Z и заполнять 0 самому)
и initialize manually для сегментов, которые надо копировать (из флеша например)
ну и указать имя точки входа Override default program entry.
Для Coretx-M3 вообще можно обойтись без ASM, т.к. стек изначально сам проц инитит
Код
uint32_t const __vector_table@".intvec" =
{
STACK_TOP,
(uint32_t)main,
......
};
а в icf файле
place at start of ROM { section .intvec};