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

 
 
> Прерывания в компиляторе RealView, IRQ или FIQ?
SanyaKID
сообщение Jun 27 2007, 07:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 13-09-06
Пользователь №: 20 359



Разбирались мы тут с прерываниями и накопали вот что. Компилятор armcc не делает разницы между IRQ и FIQ перываниями, и использует как в IRQ так и в FIQ режимах общие регистры R0-R7, сохраняя их в стеке при входе прерывания.
А вот в описании архитектуры ARM7TDMI сказано что в режиме FIQ регистры R8-R14 в нутри прерывания это banked registers, то есть они не пересекаются с регистрами R8-R14 вне прерывания и их не надо класть в стек.
Так вот, может кто знает, можно ли как-нибуть указать компилятору, чтобы он пользовался этими banked register, а не общими? Хотя и экономится всего 2 команды, но ради научного интереса хочется выжать из Fast Interrupta все на что он способен! smile.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение Jul 20 2007, 21:21
Сообщение #2


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

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



Что-то никак не пойму. Контроллер прерываний используется? Так на кой нужны какие-то отдельные функции со всякими умными __irq и прочим?

Контроллеру указываешь адрес любой функции void fff(void), а обработчик прерывания пишется один на всех в startup'e. Примеров тому - полно. Или хочется чего-то особо экзотического?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 21 2007, 07:54
Сообщение #3


Гуру
******

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



Цитата(sergeeff @ Jul 21 2007, 00:21) *
а обработчик прерывания пишется один на всех в startup'e. Примеров тому - полно. Или хочется чего-то особо экзотического?
Индивидуальный обработчик на каждый источник позволяет компилятору сохранять на стеке только необходимые регистры. В общем же придется сохранять все.


--------------------
На любой вопрос даю любой ответ
"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
sergeeff
сообщение Jul 21 2007, 11:05
Сообщение #4


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

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



Цитата(Сергей Борщ @ Jul 21 2007, 11:54) *
Индивидуальный обработчик на каждый источник позволяет компилятору сохранять на стеке только необходимые регистры. В общем же придется сохранять все.


Не понимаю. Согласно стандарту вызова функций scratch регистры не сохраняются. Прерывание может прийти в любой момент времени. Значит обработчик должен сохранить именно scratch - остальные при необходимости и так сохранятся при вызове функции, если функции это надо. Ключевые слова типа __irq именно это и заставляют компилятор делать. Или нет?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 23 2007, 09:44
Сообщение #5


Гуру
******

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



Цитата(sergeeff @ Jul 21 2007, 14:05) *
Не понимаю. Согласно стандарту вызова функций scratch регистры не сохраняются. Прерывание может прийти в любой момент времени. Значит обработчик должен сохранить именно scratch - остальные при необходимости и так сохранятся при вызове функции, если функции это надо. Ключевые слова типа __irq именно это и заставляют компилятор делать. Или нет?
Возможно я был не прав в своих заблуждениях. Давайте разбираться. То, что остальные регистры сохранятся при вызове функции вовсе не значит, что прерывание может их испортить. К scratch относятся R0-R3, R12. При возникновении исключения IRQ (а именно о нем шла речь в контексте многих обработчиков) переключаются только R13, R14 и значит общая "обертка" должна сложить на стек все 5 scratch регистров, ибо не имеет информации какой из них будет испорчен в конкретном обработчике. Если же мы даем компилятору возможность для каждого обработчика сгенерить свои пролог/эпилог, то для некоторых прерываний, в которых не все scratch регистры портятся, компилятор имеет право сохранять/восстанавливать только используемые (экономятся такты и место на стеке). Едем далее - в каждой самой "внешней" функции обработчика компилятор должен сохранить preserved регистры, которые используются. В случае индивидуального пролога/эпилога он может объединить в одну команду сохранение scratched и preserved регистров (сэкономив такты и код), а в случае общего пролога/эпилога ему придется делать две команды - сохранение scratched в прологе и сохранение preserved в теле обработчика. Аналогичные выкладки для эпилога.

Где ошибка в рассуждениях?
Цитата(AlexandrY @ Jul 22 2007, 16:54) *
Вы правы, человек поднял проблему не подумавши.
Если вы это про мой пост, то особенно хотелось бы услышать Ваши контр-аргументы.


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- SanyaKID   Прерывания в компиляторе RealView   Jun 27 2007, 07:17
- - GetSmart   Из ваших слов в стеке сохраняются только R0-R7. Та...   Jun 27 2007, 08:00
- - zltigo   Цитата(SanyaKID @ Jun 27 2007, 10:17) Так...   Jun 27 2007, 08:15
- - SpiritDance   В realView при описании обработчика IRQ на С испол...   Jun 27 2007, 08:41
|- - SanyaKID   Цитата(SpiritDance @ Jun 27 2007, 12:41) ...   Jun 27 2007, 09:29
|- - SpiritDance   Цитата(SanyaKID @ Jun 27 2007, 13:29) А в...   Jun 27 2007, 09:39
|- - SanyaKID   Цитата(SpiritDance @ Jun 27 2007, 13:39) ...   Jun 27 2007, 09:50
|- - Andy_ry   В STR91x лучше дело обстоит - для FIC выделен ...   Jul 11 2007, 09:00
|- - a3r3   Цитата(Andy_ry @ Jul 11 2007, 13:00) В ST...   Jul 11 2007, 09:30
||- - AlexandrY   Лучше, лучше ... В STR91x есть специальное мес...   Jul 21 2007, 08:22
|- - zltigo   Цитата(Andy_ry @ Jul 11 2007, 12:00) В ST...   Jul 11 2007, 15:09
|- - SanyaKID   Цитата(zltigo @ Jul 11 2007, 19:09) Если-...   Jul 16 2007, 10:32
|- - SergeyDDD   Далай обработчик FIQ на ассемблере   Jul 16 2007, 11:51
||- - SanyaKID   Цитата(SergeyDDD @ Jul 16 2007, 15:51) Да...   Jul 17 2007, 06:40
||- - SergeyDDD   Цитата(SanyaKID @ Jul 17 2007, 10:40) Я д...   Jul 17 2007, 14:33
||- - defunct   Цитата(SergeyDDD @ Jul 17 2007, 17:33) Да...   Jul 20 2007, 13:48
|- - kamedi_clab   Цитата(SanyaKID @ Jul 16 2007, 14:32) у м...   Jul 19 2007, 12:41
|- - AlexandrY   Вы правы, человек поднял проблему не подумавши. Ц...   Jul 22 2007, 13:54
||- - zltigo   Цитата(AlexandrY @ Jul 22 2007, 16:54) че...   Jul 22 2007, 14:00
||- - sergeeff   Пример классный (без иронии, я на досуге тоже поду...   Jul 22 2007, 19:18
||- - zltigo   Цитата(sergeeff @ Jul 22 2007, 22:18) Но ...   Jul 22 2007, 19:29
||- - AlexandrY   Этот пример содержит подвох. Достаточно юзеру снов...   Jul 22 2007, 19:53
||- - zltigo   Цитата(AlexandrY @ Jul 22 2007, 22:53) Эт...   Jul 22 2007, 20:23
||- - AlexandrY   Юзер на C не успеет вновь разрешить прерывания до ...   Jul 22 2007, 20:35
||- - zltigo   Цитата(AlexandrY @ Jul 22 2007, 23:35) Юз...   Jul 22 2007, 21:34
||- - AlexandrY   Ok! Согласен. В принципе цели мы добились. Чел...   Jul 22 2007, 21:49
||- - zltigo   Цитата(AlexandrY @ Jul 23 2007, 00:49) Че...   Jul 22 2007, 22:06
- - sergeeff   Насчет умной функции обработчика прерывания. Думае...   Jul 24 2007, 06:01
|- - zltigo   Цитата(sergeeff @ Jul 24 2007, 09:01) Но....   Jul 24 2007, 06:25
|- - Сергей Борщ   Цитата(sergeeff @ Jul 24 2007, 09:01) Пре...   Jul 24 2007, 10:48
- - SanyaKID   Ничего себе сколько тут уже понаписали... Вообщем-...   Jul 24 2007, 09:05
- - GetSmart   Цитата(SanyaKID)В итоге, в теории, чтобы не ковыря...   Jul 24 2007, 15:02
- - SanyaKID   Цитата(GetSmart @ Jul 24 2007, 19:02) Ну ...   Jul 25 2007, 09:43
- - Сергей Борщ   Цитата(SanyaKID @ Jul 25 2007, 12:43) Да,...   Jul 25 2007, 10:21


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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 15:09
Рейтинг@Mail.ru


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