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

 
 
 
Reply to this topicStart new topic
> Компилятор Microsoft для ARM
sergeeff
сообщение Mar 8 2006, 17:45
Сообщение #1


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Коллеги!

Не использовал ли в своей жизни кто-нибудь clarm (Microsoft C/C++ compiler for ARM)? Есть интересное наблюдение. В модуле C1_ARM.DLL присутствует ключевое слово __interrupt, что наводит на мысли о поддержке в компиляторе данного выражения (так хочется этого). Но документация (скудная до ужаса) молчит на сей вопрос. Не сталкивался ли кто с этим?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 8 2006, 19:56
Сообщение #2


Гуру
******

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



Цитата(sergeeff @ Mar 8 2006, 19:45) *
Не использовал ли в своей жизни кто-нибудь clarm (Microsoft C/C++ compiler for ARM)?

А смысл?
Что ожидается получить от его использования?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 8 2006, 23:34
Сообщение #3


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Хочу получить нестандартную генерацию пролога и эпилога при вызове функции. Ясно, что можно это сделать на ассемблере с вызовом из середины обычной функции, но все это не слишком изящно и черевато трудноуловимыми ошибками. Хотя именно так это и решено в том же компиляторе Green Hills.

Сообщение отредактировал sergeeff - Mar 8 2006, 23:35
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 9 2006, 05:35
Сообщение #4


Гуру
******

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



Цитата(sergeeff @ Mar 9 2006, 01:34) *
Хочу получить нестандартную генерацию пролога и эпилога при вызове функции.

Ясно, что можно это сделать на ассемблере с вызовом из середины обычной функции, но все это не слишком изящно и черевато трудноуловимыми ошибками.

Хотя именно так это и решено в том же компиляторе Green Hills.


1. А конкретизировать? Что такое экстравагантное потребовалось, до чего не додумалося НИКТО из
производителей компиляторов, но додумался MS. Какие надежды внушило вам абсолютно обыденное в мире компиляторв (тем более для embedded) слово "__interrupt"? Кстати, для ARMов оно бессмысленно,
ибо нужно иметь в компиляторе поддежку минимум трех вариантов для IRQ, FIQ и SWI.

2. Написание нескольких десятков команд на ASM "черевато" а перескок на странный компилятор
c "документация (скудная до ужаса)" это тогда чем черевато?

3. Абсолютно нормальный подход к делу используется всегда и всеми, если действительно нужен свой
пролог-эпилог для, например, шедулеров операционок.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 9 2006, 17:43
Сообщение #5


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



1. Ничего особо экстравагантного не потребовалось. Надо объявить функцию, которая вызывается по прерыванию. При этом ясно, что обычная функция и функция вызываемая по прерыванию имеют разные прологи/эпилоги.

2. Думаю, что Microsoft’овский компилятор не столь уж странен, если на нам написан WindowsCE под ARM. И уж не «страньше», чем многими любимый gcc. К тому же бесплатный.

3. Насчет нормальности такого подхода – это не факт. Совершенно ясно, что так (связка ассемблер + С/С++) делать можно. И так можно реализовать что-хочешь. Но мне при этом видится ряд неоптимальных решений. Первое. Приходится из ассемблерного модуля вызывать лишнюю функцию, написанную на С/С++. Второе. Так как вы понятия не имеете (если, конечно не заниматься такой веселой работой, как изучение ассемблерных кодов, порождаемых компилятором), какие регистры компилятор задействует в этой вызываемой функции, приходится записывать в стек на всякий случай все scratch регистры. Если бы функция, вызываемая по прерыванию, была бы написана непосредственно на ЯВУ c некоторым специальным ключевым словом (например, __interrupt), компилятор запихнул бы в стек только необходимый минимум регистров.

4. Потенциально можно вывернуться и по-другому, объявив функцию «голой» (__declspec(naked)), в inline asm’е самостоятельно прописать свой пролог/эпилог. Но в моем случае этот вариант не проходит, т.к. clarm не поддерживает встраевыемый ассемблер.

Чтобы не разводить дискуссию про то какой компилятор лучше или хуже, задам исходный вопрос по-другому:

Реализована ли в компиляторе С++ Microsoft для ARM ключевое слово __interrupt?

Я перебробовал различные варианты вызова функций с этим спецификатором и наполучал лишь кучу сообщений об ошибках. Вполне вероятно, что __interrupt не реализована, или реализована каким-либо специфическми образом.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 9 2006, 18:42
Сообщение #6


Гуру
******

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



Цитата(sergeeff @ Mar 9 2006, 19:43) *
Ничего особо экстравагантного не потребовалось. Надо объявить функцию, которая вызывается по прерыванию. При этом ясно, что обычная функция и функция вызываемая по прерыванию имеют разные прологи/эпилоги.

Ликбеза не надо - за десяки лет работы "я в курсе".
Я уже писал одним __interrupt на ARM платформе обойтись невозможно, ввиду разных правил
для разных прерываний. Это не X86. Посему, что значит __interrupt одному MS ведомо уж
не знаю, какими словами Вам еще это объяснить.
У MS вполне может быть заточен компилятор исключительно под приложения, со всеми вытекающими
последствиями. Возьмите любой нормальный компилятор и смотрите что-то типа
__fiq, __irq, __swh


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
si21
сообщение Mar 13 2006, 01:15
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 55
Регистрация: 9-04-05
Из: г. Минск
Пользователь №: 3 984



Может не совсем в тему, но я лично уже давно отказался от __interrupt и т.п.
Небольшой эпилог/пролог на ассемблере при входе/выходе в прерывание и нет проблем. Например,
для irq (ARM720):
IRQHandler:
; Fix the return address
sub lr,lr,#4
stmfd sp!,{r0-r3,r12,lr}
bl IRQ_ISR_Handler -> моя п/п-обработчик, написанная как обычная (рядовая) ф-ция
; выход из пр-ия
ldmfd sp!,{r0-r3,r12,pc}^
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 13 2006, 06:45
Сообщение #8


Гуру
******

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



Цитата(si21 @ Mar 13 2006, 03:15) *
Может не совсем в тему, но я лично уже давно отказался от __interrupt и т.п.

; Fix the return address
sub lr,lr,#4
stmfd sp!,{r0-r3,r12,lr}

Сделать _абсолютно_ то же, что сделает компилятор, только руками и не дай бог,
если вдруг другой 'C' компилятор решит какой-нибудь из r4.... сделать расходным и не сохранит
его при вызове Вашей функции.
Ну и сразу гагантированный вызов функции на ровном месте.
Короче, в чем смысл, при наличии штатной поддержки, естественно.

Сообщение отредактировал zltigo - Mar 13 2006, 06:46


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


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 26-08-04
Пользователь №: 548



Ну просто не знаю как еще сказать, повторяю м_е_д_л_е_н_н_о еще раз: в тулзах от М$ нет абсолютного линковщика/локатора и его библиотека н_и_к_а_к не поддерживает ембеддный код, конечно можно извратиться и натянуть его как резиновое изделие на голову, но стоит ли сей спорт выделки? У меня есть знакомый, который адаптировал MS 7.0 под X86 embedded, так там от библиотек практически ничего не осталось, а процедура превращения результирующего экзешника в hex-ленту поражает своей алхимичностью...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Mar 13 2006, 16:13
Сообщение #10


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(d__ @ Mar 13 2006, 15:47) *
Ну просто не знаю как еще сказать, повторяю м_е_д_л_е_н_н_о еще раз: в тулзах от М$ нет абсолютного линковщика/локатора и его библиотека н_и_к_а_к не поддерживает ембеддный код, конечно можно извратиться и натянуть его как резиновое изделие на голову, но стоит ли сей спорт выделки? У меня есть знакомый, который адаптировал MS 7.0 под X86 embedded, так там от библиотек практически ничего не осталось, а процедура превращения результирующего экзешника в hex-ленту поражает своей алхимичностью...

Да нет там ничего сложного - EVC4, например, генерит код для WinCE в обычном формате PE. Я все собираюсь, да никак не найду пары дней для написания конвертировщика в hex. Если таки напишу - выложу с исходниками.
Оно того стоит - EVC очень приличный код выдает. Недавно коллега перекомпилил мой код с GCC3.2 на EVC4, блин, в процедуре загрузки ПЛИС через JTAG пришлось нопы ручками вставлять - настолько EVC код под XScale на скорость прооптимизировал. Единственное что - с документацией плоховато. Еще мне ассемблеры от MS не нравятся, но это уже мои персональные тараканы smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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