Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Keil RV3.50 и FIQ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AlexanderPo
Други! Выручайте! Зациклился. Пытаюсь реализовать обработку FIQ прерываний как описано http://www.keil.com/support/man/docs/ca/ca_le_fiq.htm. Но при компиляции выдаёт ошибку error: #130: expected a "{". Хотя реально никакой синтаксической ошибки нет! Может кто сталкивался?
GetSmart
У разных компилеров свой синтаксис атрибутов процедур. Вероятно тот пример не для кейла. Вероятнее всего нужно изменить заголовок процедуры под кейл. Читайте хелп на кейл.
AlexanderPo
Ничего не понимаю! Я ж на сайте кейла хелп смотрел!!!

В двух словах что делаю.
1. Файл Startup.s
- импортирую имя C-шной функции: IMPORT MyFIQ_Handler
- указываю переход на эту функцию:
...
FIQ_Handler B MyFIQ_Handler
...
2. В файле проекта, например, Application.c, реализую эту функцию:
void MyFIQ_Handler(void) __fiq
{
/* Чего-то делается */
}

Где ошибка?
GetSmart
Цитата(AlexanderPo @ Jun 10 2009, 12:44) *
Ничего не понимаю! Я ж на сайте кейла хелп смотрел!!!

Точно. Я и не заметил что сайт кейла biggrin.gif
Просто когда выдаётся ошибка '{' expected - это означает, что встретилось что-то ненужное вроде атрибута __fiq там, где он не нужен. В ИАРе этот атрибут ставится перед заголовком процедуры, если поставить после то ИАР тоже ругается.
AlexanderPo
Цитата(GetSmart @ Jun 10 2009, 11:56) *
Приведите точный текст своего обработчика.


Вообще-то это даже и не важно! Ошибка выдаётся даже вот с таким текстом:

void MyFIQ_Handler(void) __fiq
{
}

Если аттрибут __fiq переместить в начало определения функции, то выдаётся другая синтаксическая ошибка. С атрибутом __irq такой ерунды не происходит куда бы его не поставить! Он всегда воспринимается правильно.
AjaxLab
Цитата(AlexanderPo @ Jun 10 2009, 12:05) *
Вообще-то это даже и не важно! Ошибка выдаётся даже вот с таким текстом:

void MyFIQ_Handler(void) __fiq
{
}

Если аттрибут __fiq переместить в начало определения функции, то выдаётся другая синтаксическая ошибка. С атрибутом __irq такой ерунды не происходит куда бы его не поставить! Он всегда воспринимается правильно.


Если используется компилятор RealView, то там __fiq нет.
aaarrr
Атрибут __fiq кончился вместе с компилятором CARM. У RVCT есть только __irq.
AlexanderPo
Цитата(AjaxLab @ Jun 10 2009, 12:19) *
Если используется компилятор RealView, то там __fiq нет.


Поясните, пожайлуйста, а как тогда реализовать FIQ?
Действительно, если всё оставить как есть и только убрать __fiq, то всё начинает компилится, НО! Программа вылетает, кажется, в Undefined Mode! Я предполагал, что именно атрибут __fiq обеспечивает правильное сохранение/восстановление регистров. В частности, PC.
aaarrr
Напишите __irq - будет работать. Если хотите использовать преимущества дополнительного банка регистров, пишите обработчик FIQ на асме.
AlexanderPo
Цитата(aaarrr @ Jun 10 2009, 12:36) *
Напишите __irq - будет работать. Если хотите использовать преимущества дополнительного банка регистров, пишите обработчик FIQ на асме.


То есть реализовать FIQ на С в кейле невозможно? Вот это да! Вот тебе и хвалёный на всех семинарах кейл! А чего же в хелпе это не отражено?
GetSmart
Цитата(aaarrr @ Jun 10 2009, 13:20) *
Атрибут __fiq кончился вместе с компилятором CARM. У RVCT есть только __irq.

А разумное объяснение у них есть?!
Sanya_kv
У тебя с стартапе так релизовано?
Код
Vectors         LDR     PC,Reset_Addr        
                LDR     PC,Undef_Addr
                LDR     PC,SWI_Addr
                LDR     PC,PAbt_Addr
                LDR     PC,DAbt_Addr
                NOP                          ; Reserved Vector
;               LDR     PC,IRQ_Addr
                LDR     PC,[PC,#-0xF20]      ; Vector From AIC_IVR
;               LDR     PC,FIQ_Addr
                LDR     PC,[PC,#-0xF20]      ; Vector From AIC_FVR

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0                    ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Какой проц используешь?
aaarrr
Цитата(AlexanderPo @ Jun 10 2009, 12:45) *
То есть реализовать FIQ на С в кейле невозможно? Вот это да! Вот тебе и хвалёный на всех семинарах кейл!

Почему невозможно-то? Возможно, просто не так эффективно будет.

Цитата(AlexanderPo @ Jun 10 2009, 12:45) *
А чего же в хелпе это не отражено?

Потому что Вы читаете хелп не от того компилятора.


Цитата(GetSmart @ Jun 10 2009, 12:46) *
А разумное объяснение у них есть?!

А зачем тут что-то объяснять? Они вполне разумно решили, что пользователю лучше самому разобраться с банком FIQ, если оно ему надо. А если не надо, то можно использовать __irq.

Цитата(Sanya_kv @ Jun 10 2009, 12:48) *
У тебя с стартапе так релизовано?
...
Какой проц используешь?

Ну и к чему все это?
AlexanderPo
Осталось только раздражение на кейл! Зачем же комплектовать IDE старым хелпом. Там тоже описан атрибут __fiq. Не буду переходить с IAR на Keil rolleyes.gif
GetSmart
Цитата(aaarrr @ Jun 10 2009, 13:53) *
А зачем тут что-то объяснять? Они вполне разумно решили, что пользователю лучше самому разобраться с банком FIQ, если оно ему надо. А если не надо, то можно использовать __irq.

Глупость да и только. Никаких сложностей __fiq не требовал. Кроме этого раньше была аналогичная глупость с вложенными прерываниями. Браво, Кейл!
aaarrr
Цитата(AlexanderPo @ Jun 10 2009, 13:02) *
И как просто, не зарываясь в asm, реализовать обработку FIQ непонятно...

Да почему непонятно? Зачем зарываться в асм?

Цитата(GetSmart @ Jun 10 2009, 13:03) *
Глупость да и только. Никаких сложностей __fiq не требовал. Кроме этого раньше была аналогичная глупость с вложенными прерываниями. Браво, Кейл!

Глупость - использовать модификатор __fiq не вдаваясь в подробности, дескать, компилятор все сделает. Максимум, что он может - это сократить сохранение/восстановление контекста, человек способен придумать более разумное использование банка.
GetSmart
Цитата(aaarrr @ Jun 10 2009, 14:08) *
Глупость - использовать модификатор __fiq не вдаваясь в подробности, дескать, компилятор все сделает. Максимум, что он может - это сократить сохранение/восстановление контекста, человек способен придумать более разумное использование банка.

Это законное удобство, на которое расчитывает юзер компилятора. Да, хотя бы не сохранять 4 регистра, уже экономия.
Какой человек? Что придумать?
Sanya_kv
Вместо __fiq поставь __irq. Проверенно работает. Толко вход в фунцию рекомендую писать на ассемблере.
aaarrr
Цитата(GetSmart @ Jun 10 2009, 13:11) *
Это законное удобство, на которое расчитывает юзер компилятора. Да, хотя бы не сохранять 4 регистра, уже экономия.

Удобства и экономии на 3 копейки, при заметном усложнении компилятора (типа, тут используем вместо R0-R3 R8-R11, но если есть вызов вложенных процедур, то используем R8-R11 для сохранения R0-R3, и все это ради одного обработчика).

Цитата(GetSmart @ Jun 10 2009, 13:11) *
Какой человек? Что придумать?

Ну, если думать некому, то можно просто писать __irq - проигрыш от лишних сохранений затереятся на фоне других "изысков".
defunct
Цитата(GetSmart @ Jun 10 2009, 12:03) *
Глупость да и только. Никаких сложностей __fiq не требовал. Кроме этого раньше была аналогичная глупость с вложенными прерываниями. Браво, Кейл!

Ну а причем тут Keil?
У Keil'овского компилятора как раз __fiq атрибут поддерживается.
Браво адресуйте непосредственно ARM-LTD, т.к. RVCT это их творение.

Цитата(GetSmart @ Jun 10 2009, 12:11) *
Это законное удобство, на которое расчитывает юзер компилятора.

А чем неудобно вместо нескольких бестолковых и нестандартных атрибутов, пользовать вообще без атрибуетов, или по крайней мере сократить их количество до одного?
zltigo
Цитата(defunct @ Jun 12 2009, 04:40) *
А чем неудобно вместо нескольких бестолковых и нестандартных атрибутов, пользовать вообще без атрибуетов, или по крайней мере сократить их количество до одного?

Ну-ну sad.gif sad.gif а зачем еще, например, компилятору несколько разных бестолковых ключей оптимизации, пользовать вообще без оптимизации, или по крайней мере сократить их количество до одого? smile.gif


Цитата(aaarrr @ Jun 10 2009, 12:36) *
Ну, если думать некому, то можно просто писать __irq - проигрыш от лишних сохранений затереятся на фоне других "изысков".

Или не затеряется. В то,что среднестатический программист способен бездумно испохабить многое - верю. Только это не значит, что по этой "причине" можно делать упрощенные компиляторы.
sonycman
Да, интересно, что ответили бы разрабы RealView на вопрос об отсутствии обёртки для FIQ...
Лидеры, млин, в, так сказать, компилеростроении laughing.gif

ЗЫ: хорошо жить на свете с кортексом, никаких заморочек с обёртками cool.gif
defunct
Цитата(zltigo @ Jun 12 2009, 08:48) *
Ну-ну sad.gif sad.gif а зачем еще, например, компилятору несколько разных бестолковых ключей оптимизации, пользовать вообще без оптимизации, или по крайней мере сократить их количество до одого? smile.gif

И правда зачем? Вы когда-нибудь реально использовали те ключики, которые находятся между, образно говоря, "без оптимизации" и "максимальная оптимизация"?

Возвращаясь к теме - некий магический атрибут __fiq, который якобы сделает все максимально быстро и эффективно, на самом деле ничего не сделает, - не догадается компилер хранить static переменные в регистрах FIQ банка...
Отсутствие __fiq в RVCT дисциплинирует, и еще раз заставит задуматься нужен ли там __FAST__ IRQ. Если нужен - Asm в руки и делаем настоящий FAST. А если не нужен (FIQ используется просто как более приоритетный IRQ) то чем __irq атрибут не устраивает?
Sanya_kv
Цитата(defunct @ Jun 13 2009, 06:05) *
Отсутствие __fiq в RVCT дисциплинирует, и еще раз заставит задуматься нужен ли там __FAST__ IRQ. Если нужен - Asm в руки и делаем настоящий FAST. А если не нужен (FIQ используется просто как более приоритетный IRQ) то чем __irq атрибут не устраивает?


Зачем тогда С компилятор нужен. На Asm всю прогу писать "Надёжней", "Качественней", сроки реализации "Немногим" медленнее, отладка совсем чуть-чуть, а главное программа выполняется быстрей (иногда), ... . Я согласен, что разработчики компилятора не боги, но и компилятор стоит не дешёво (хотя для кого как и где).
В данном примере действительно правильней реализовать на АSМ, из-за недостатка среды разработки.
Зачем брать автомобиль, который иногда приходится толкать? glare.gif
aaarrr
С тем же успехом можно возмущаться, что не предусмотрены атрибуты для режимов abort и не встроен обработчик swi. Сколько у Вас FIQ в программе? Я почему-то думаю, что от 0 до 1.
Sanya_kv
Один. Программно интерфейс пришлось реализовать. А с __swi все в порядке, использую довольно часто. В обще использую Keil только из-за OS, и некоторых удобств в разработке. Последние время больше симпатизирую IAR.
aaarrr
Цитата(Sanya_kv @ Jun 13 2009, 15:04) *
А с __swi все впорядке, использую довольно часто.

__swi - это вызов, обработчик-то все равно нужен самописный, более того, на асме (sic!). Не напрягает?
zltigo
Цитата(defunct @ Jun 13 2009, 05:05) *
И правда зачем? Вы когда-нибудь реально использовали те ключики, которые находятся между, образно говоря, "без оптимизации" и "максимальная оптимизация"?

Поминаемые Вами ключики таковыми собственно не являются - это готовые наборы из других ключей. Теми, индивидуальными - пользуюсь, не ежедневно, но несомненно пользуюсь и не только в пределах проекта или отдельного файла, но и наиболее часто для отдельных кусков исходника. Это достаточно не сложно и проще, нежели преписывать куски кода на том-же ASM
Цитата
Возвращаясь к теме - некий магический атрибут __fiq, который якобы сделает все максимально быстро и эффективно, на самом деле ничего не сделает, - не догадается компилер хранить static переменные в регистрах FIQ банка...

Я не специалист по магии (и уж тем более не жду никаих чудес от компилятора )поэтому мне совершенно достато того, что я знаю, комплятор может сделать.
Цитата
Отсутствие __fiq в RVCT дисциплинирует, и еще раз заставит задуматься нужен ли там __FAST__ IRQ.

Я, считаю, что я способен думать и без таких заботливых "подсказок".
Цитата
Если нужен - Asm в руки и делаем настоящий FAST.

Если нужно выжать по максимуму я и сам напишу его обработчик на ASM в startup прямо с адреса 0x1C. Если нужно будет написать развеситый обработчик FIQ (есть у меня и такие на многие килобайты), то __fiq мне в этом, как минимум ну СОВСЕМ ничем не помешает. Ну а если просто какой-то средненький о сотню байт, то я предпочту писать на 'C' ( естественно осознавая, что потери, нежели мне вдруг с бодуна придет мысль о вызове, например, функций из обработчика, будут малосовметимыми со скоростью), нежели на ASM благодаря "заботе" об излечении от каких-то якобы имеющихся у пользователей "иллюзий".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.