Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR настройка векторов прерываний
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Hexxx
Нужно мне чтобы мой код собрался в rawbinary с базой 0x30080000. В начале должны быть вектора прерываний, а потом код.

Я отредактировал .xcl файл:
Код

-carm

-DROMSTART=30080000
-DROMEND=30090000

-DRAMSTART=30090000
-DRAMEND=30100000

-Z(CODE)INTVEC=30080000-3008003F
-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
-Z(CODE)SWITAB=ROMSTART-ROMEND

-Z(CODE)CODE=ROMSTART-ROMEND
-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND
-Z(CONST)CODE_ID=ROMSTART-ROMEND
-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND


И на выходе получаю файл размером 805 Мб т.е. ~ 0x30080000 байт. В начале которого (смещение 0) идут вектора прерываний, а со смещения 0x30080000 сишный код. Почему оно игнорирует -Z(CODE)INTVEC=30080000-3008003F и пихает вектора на адрес 0? Как его заставить собрать нормальный бинарь?
IgorKossak
Посмотрите файл cstartup.s79, особенно комментарии к модулю ?RESET.
Hexxx
Спасибо!
Нужно всего лишь поставить org 0x30080000 после директивы начала сегмента.
IgorKossak
Тем не менее, я считаю, что это не очень элегантный способ.
Ведь в файле cstartup.s79 указано в каком сегменте размещать код и с каким смещением от начала сегмента. А по каким адресам размещать сегмент указано в файле xcl. Так что всё и в предыдущем варианте должно работать.
Предполагаю, что файл xcl, который Вы правили, на самом деле не подключается, а подключается файл по умолчанию. Либо дополнительно подключается ещё один файл.
Посмотрите подробности в файле map (в заголовке).
Сергей Борщ
По основному вопросу согласен с IgorKossak. Смотрите .map - что он куда разместил. В шапке .map вы увидете аргументы командную строку линкера и сможете проверить, используется ли ваш .xcl. В крайнем случае делайте проект int main() {} и кидайте его сюда. Я часто использую подобное размещение и никогда не сталкивался с вашей проблемой.
Немного не в тему:
Цитата(Hexxx @ Sep 20 2007, 15:36) *
-Z(CODE)INTVEC=30080000-3008003F
Вы потом эти вектора куда-то копируете? В таком случае работоспособность этого кода будет зависеть от того, как описаны переходы по векторам. Попробуйте вот такой вариант:
Код
// Intvec always linked to 0x00-0x3F
-Z(CODE)INTVEC=00000000-0000003F

// ROM
-Z(CODE)INTVEC_I=ROMSTART-ROMEND
-QINTVEC=INTVEC_I   // place vectors to INTVEC_I, but link to intvec
В этом случае вектора будут указывать куда надо после копирования в нулевые адреса вне зависимости от описания переходов: LDR PC,=Handler или B Handler.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.