|
Прерывания в компиляторе RealView, IRQ или FIQ? |
|
|
|
Jun 27 2007, 07:17
|
Участник

Группа: Участник
Сообщений: 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 все на что он способен!
|
|
|
|
|
 |
Ответов
|
Jul 23 2007, 09:44
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|