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

 
 
 
Reply to this topicStart new topic
> Конец таблицы векторов прерываний, Как определить?
prottoss
сообщение Jul 16 2006, 16:58
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Собственно, суть вопроса в названии темы. Есть ли в ИАРЕ какие нибудь нормальные способы определить конец таблицы векторов. Необходимо именно после таблицы загнать некоторые константы. Я понимаю, что можно заглянуть в хедер МК, под который пишется проект, и с помощью #pragma location указать место компилятору, но хотелось бы узнать более грамотный способ, чтобы можно было портировать проект на другой МК, без лишних правок проекта...

Спасибо.


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 16 2006, 17:52
Сообщение #2


Гуру
******

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



Цитата(prottoss @ Jul 16 2006, 19:58) *
Собственно, суть вопроса в названии темы. Есть ли в ИАРЕ какие нибудь нормальные способы определить конец таблицы векторов. Необходимо именно после таблицы загнать некоторые константы. Я понимаю, что можно заглянуть в хедер МК, под который пишется проект, и с помощью #pragma location указать место компилятору, но хотелось бы узнать более грамотный способ, чтобы можно было портировать проект на другой МК, без лишних правок проекта...

Спасибо.
Если узнать и разместить надо на этапе компиляции - то в .xcl определить свой сегмент сразу после определения INTVEC и до остальных кодовых сегментов. В этот сегмент и поместить нужное. Если на этапе выполнения - __segment_end("INTVEC") в С и SFB(INTVEC) в асм.


--------------------
На любой вопрос даю любой ответ
"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
prottoss
сообщение Jul 16 2006, 18:14
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Сергей Борщ @ Jul 17 2006, 01:52) *
Если узнать и разместить надо на этапе компиляции - то в .xcl определить свой сегмент сразу после определения INTVEC и до остальных кодовых сегментов. В этот сегмент и поместить нужное. Если на этапе выполнения - __segment_end("INTVEC") в С и SFB(INTVEC) в асм.
Да, это работает, спасибо. Но хотелось бы, чтобы конец сегмента, или начало требуемого массива в тексте модуля *.с, а не в *.xcl , и адрес вычислялся на этапе компиляции


--------------------
Go to the top of the page
 
+Quote Post
arttab
сообщение Jul 17 2006, 02:12
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



Можно написать сою библиотеку, которая по define чегото, подставляла бы нужные параметры для размещения Вашего сегмента. Похожие вещи видел, но сам не делал.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 17 2006, 06:46
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(prottoss @ Jul 16 2006, 21:14) *
Но хотелось бы, чтобы конец сегмента, или начало требуемого массива в тексте модуля *.с, а не в *.xcl , и адрес вычислялся на этапе компиляции

Думал-думал.. А отчего такое горячее желание "решить" задачу непредназначенными для этого средствами?

1.Самый "правильный" вариант - действительно завести свой сегмент и указать линкеру куда его линковать. Для решения каких-то "особенных" проблем можно передавать и линкеру и компилятору некий общий параметр (задаваемый в makefile/проекте) через командную строку.
2.Самый дубовый - добавляете свои "констанаты" прямо в файл с таблицей векторов (но см. примечание к п.3).
3.Самый "кривой" - Создаете файл c с указанием того, что результат компиляции слинковать в INTVEC (полагаю, что IAR линкер, как обычно, выполнит линковку в сегмент в порядке встретившимся ему упоминаний). Но *.xcl рожденный "автоматически" все равно править придется, ибо там скорее всего
INTVEC фиксированного размера.

А других я не знаю, да и не встречал в них когда-либо какой-либо необходимости.




Цитата(arttab @ Jul 17 2006, 05:12) *
Можно написать сою библиотеку, которая по define чегото

Волшебное слово библиотека тут совсем не играет, как и #define, ибо размещением всего и вся за пределами кусочков сегмента ведает линкер и только линкер - вот и указанием ему что и как делать и предстоит мудрить. Мочему нужно "мудрить", вместо прямого и четкого указания - вопрос интересный.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 17 2006, 08:15
Сообщение #6


Гуру
******

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



Цитата(prottoss @ Jul 16 2006, 21:14) *
Цитата(Сергей Борщ @ Jul 17 2006, 01:52) *
Если узнать и разместить надо на этапе компиляции - то в .xcl определить свой сегмент сразу после определения INTVEC и до остальных кодовых сегментов. В этот сегмент и поместить нужное. Если на этапе выполнения - __segment_end("INTVEC") в С и SFB(INTVEC) в асм.
Да, это работает, спасибо. Но хотелось бы, чтобы конец сегмента, или начало требуемого массива в тексте модуля *.с, а не в *.xcl , и адрес вычислялся на этапе компиляции
Стоп. Вычислялся адрес или размещались данные? Для вычисления адреса вполне работает intrinsic-функция __segment_end("INTVEC"). А рулить размещением из .C можно только в одном случае: размещение констант по абсолютному адресу. Во всех остальных случаях это невозможно, ибо С с адресами не работает. Он знает только смещения в пределах перемещаемого сегмента (участка сегмента), а абсолютные адреса взамен этих смещений проставляет линкер после размещения сегмента.

Возможно имеет место неправильный подход к проблеме. Если программа не использует прерываний то INTVEC состоит из одного вектора (RESET). Далее возможны два варианта в зависимости от содержания .xcl: следующий за этим сегментом адрес будет равен двум(байтам) либо будет "дырка" на неиспользуемые вектора. Но опять же предугадать какой вариант будет в конкретном случае не смотря в .xcl невозможно.

Может вы изложите задачу более подробно, с каким-нибудь примитивным примером?


--------------------
На любой вопрос даю любой ответ
"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
prottoss
сообщение Jul 17 2006, 08:53
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Сергей Борщ @ Jul 17 2006, 16:15) *
Стоп. Вычислялся адрес или размещались данные?
Я же сказал
Цитата
Но хотелось бы, чтобы конец сегмента, или начало требуемого массива в тексте модуля *.с, а не в *.xcl , и адрес вычислялся на этапе компиляции
Про __segment_end, я знал, но мне надо, чтобы массив констант размещался именно СРАЗУ после таблицы векторов (не спрашивайте, почему мне это надо, please, так надо :-) ) . Допустим, я передал свой исходник другому человеку, а он пользуется не IAR, он включает мои сырцы в свой проект, и у него получается сами знаете что...


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 17 2006, 09:44
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(prottoss @ Jul 17 2006, 11:53) *
..а он пользуется не IAR...

А ранее вопрос был:
Цитата
Есть ли в ИАРЕ какие нибудь нормальные способы ...

В IARе есть. И во многих других есть. Но другие. Такие тонкости всегда интимное дело конкретного
компилятора и естественно решаются написанием "порта" под компилятор. Но это ведь уже ДРУГОЙ вопрос?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 17 2006, 10:13
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(zltigo @ Jul 17 2006, 17:44) *
Цитата(prottoss @ Jul 17 2006, 11:53) *

..а он пользуется не IAR...

А ранее вопрос был:
Цитата
Есть ли в ИАРЕ какие нибудь нормальные способы ...

В IARе есть. И во многих других есть. Но другие. Такие тонкости всегда интимное дело конкретного
компилятора и естественно решаются написанием "порта" под компилятор. Но это ведь уже ДРУГОЙ вопрос?
Я все понял...Значит простых путей нет...


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 17 2006, 12:44
Сообщение #10


Шаман
******

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



Простых через некоторое интересное место может и нет, а стандартные для IAR методы просты - дальше некуда.
Есть средство заполнить сегмент константой (RETI) - линкер.
Есть средство разместить сегмент где угодно и как угодно - линкер.
Есть средство получить доступ из исходника куда угодно - компилятор.
Нет только средств изобретать свои правила игры.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 17 2006, 12:57
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(IgorKossak @ Jul 17 2006, 15:44) *
Нет только средств изобретать свои правила игры.

:-)


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jul 17 2006, 13:05
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(IgorKossak @ Jul 17 2006, 20:44) *
Нет только средств изобретать свои правила игры.
Что Вы имеете ввиду?


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 17 2006, 13:19
Сообщение #13


Шаман
******

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



Цитата(prottoss @ Jul 16 2006, 19:58) *
... но хотелось бы узнать более грамотный способ, чтобы можно было портировать проект на другой МК, без лишних правок проекта...

Цитата(prottoss @ Jul 17 2006, 16:05) *
Цитата(IgorKossak @ Jul 17 2006, 20:44) *
Нет только средств изобретать свои правила игры.
Что Вы имеете ввиду?

Элементарно, коль скоро имеем то, что имеем.
Если уж сориентировались на ИАРовскую платформу, то почему бы не воспользоваться стандартными для ИАР средствами. Переделки, хоть и минимальные, но будут. Других способов всё равно нет и ИАР не станет, я думаю, создавать их под заказ.
Если же планируется переходить ещё и под другую среду программирования, то переделок будет ещё больше.
Здесь вся сложность именно не в языковых средствах, а в сильной аппаратной зависимости Ваших желаний. А в этом плане, как Вам уже говорили, что ни среда, то свои правила, которые кстати в определённой мере незыблемы.
Извините, если слишком сложно обьясняю.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:44
Рейтинг@Mail.ru


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