реклама на сайте
подробности

 
 
> IAR настройка векторов прерываний
Hexxx
сообщение Sep 20 2007, 12:36
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 29-03-06
Пользователь №: 15 592



Нужно мне чтобы мой код собрался в 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? Как его заставить собрать нормальный бинарь?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
IgorKossak
сообщение Sep 20 2007, 12:48
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Посмотрите файл cstartup.s79, особенно комментарии к модулю ?RESET.
Go to the top of the page
 
+Quote Post
Hexxx
сообщение Sep 20 2007, 13:24
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 49
Регистрация: 29-03-06
Пользователь №: 15 592



Спасибо!
Нужно всего лишь поставить org 0x30080000 после директивы начала сегмента.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Sep 21 2007, 06:35
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Тем не менее, я считаю, что это не очень элегантный способ.
Ведь в файле cstartup.s79 указано в каком сегменте размещать код и с каким смещением от начала сегмента. А по каким адресам размещать сегмент указано в файле xcl. Так что всё и в предыдущем варианте должно работать.
Предполагаю, что файл xcl, который Вы правили, на самом деле не подключается, а подключается файл по умолчанию. Либо дополнительно подключается ещё один файл.
Посмотрите подробности в файле map (в заголовке).
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 21 2007, 08:13
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



По основному вопросу согласен с 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.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016