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

 
 
> Прерывания в компиляторе 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
AlexandrY
сообщение Jul 22 2007, 13:54
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Вы правы, человек поднял проблему не подумавши.

Цитата(sergeeff @ Jul 21 2007, 14:35) *
Не понимаю. Согласно стандарту вызова функций scratch регистры не сохраняются. Прерывание может прийти в любой момент времени. Значит обработчик должен сохранить именно scratch - остальные при необходимости и так сохранятся при вызове функции, если функции это надо. Ключевые слова типа __irq именно это и заставляют компилятор делать. Или нет?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 22 2007, 14:00
Сообщение #6


Гуру
******

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



Цитата(AlexandrY @ Jul 22 2007, 16:54) *
человек поднял проблему не подумавши.

Ну а если подумать над словами человека?
Это если компилятор знает про FIQ:
Код
FIQ_ISR_handler:
        MOV      R8,#+4
        LDR      R9,??FIQ_ISR_handler_0;; 0xffffffffe01fc140
        LDR      R10,??FIQ_ISR_handler_0+0x4;; fic_counter
??FIQ_ISR_handler_1:
        LDR      R11,[R10, #+0]
        ADD      R11,R11,#+1
        STR      R11,[R10, #+0]
        LDR      R11,[R9, #+0]
        ORR      R11,R11,#0x4
        STR      R11,[R9, #+0]
        STR      R8,[R9, #+0]
        LDR      R11,[R9, #+0]
        AND      R11,R11,#0x4
        LSRS     R11,R11,#+2
        BNE      ??FIQ_ISR_handler_1
        SUBS     PC,LR,#+4     ;; return


А это если ему что IRQ, что FIQ все едино
Код
FIQ_ISR_handler:
        PUSH     {R0-R3}
        MOV      R0,#+4
        LDR      R1,??FIQ_ISR_handler_0;; 0xffffffffe01fc140
        LDR      R2,??FIQ_ISR_handler_0+0x4;; fic_counter
??FIQ_ISR_handler_1:
        LDR      R3,[R2, #+0]
        ADD      R3,R3,#+1
        STR      R3,[R2, #+0]
        LDR      R3,[R1, #+0]
        ORR      R3,R3,#0x4
        STR      R3,[R1, #+0]
        STR      R0,[R1, #+0]
        LDR      R3,[R1, #+0]
        AND      R3,R3,#0x4
        LSRS     R3,R3,#+2
        BNE      ??FIQ_ISR_handler_1
        POP      {R0-R3}
        SUBS     PC,LR,#+4     ;; return


Сообщение отредактировал zltigo - Jul 22 2007, 14:34


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 22 2007, 19:18
Сообщение #7


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

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



Пример классный (без иронии, я на досуге тоже подумывал о том, что было бы неплохо, если бы компилятор знал о FIQ). Но на практике навар будут только в случае, если для обработки fiq хватает четырех регистров на все про все. А часто такое бывает? Не думаю.

Сообщение отредактировал zltigo - Jul 22 2007, 19:22
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 22 2007, 19:29
Сообщение #8


Гуру
******

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



Цитата(sergeeff @ Jul 22 2007, 22:18) *
Но на практике навар будут только в случае, если для обработки fiq хватает четырех регистров на все про все.

Нет.
1. Регистров 7;
2. Навар в виде экономии времени и стека на пушировании семи регистров FIQ банка будет абсолютно всегда, даже если потребуются все регистры, экономия почти двойная.

P.S.
Избегайте ненужного цитрования.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 22 2007, 19:53
Сообщение #9


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Этот пример содержит подвох.
Достаточно юзеру снова резрешить FIQ прерывания на входе в такой обработчик и он получит глюков по полной. И при этом он будет иметь право требовать от ARM возмещения убытков.
Не забываем, что юзер будет писать на C и не подозревать как используются регистры.
А компилятор не будет пытаться расшифровать программу юзера на тему разрешил или нет он FIQ на входе в обработчик.

Вообщем есть стандарт "Procedure Call Standard for the ARM® Architecture"
Принебрегать им могут только компиляторы низкого уровня.
Скажите в каком компиляторе вы видели такой код, и я буду знать какой компилятор даже пробывать не стоит.



Цитата(zltigo @ Jul 22 2007, 22:59) *
Навар в виде экономии времени и стека на пушировании семи регистров FIQ банка будет абсолютно всегда, даже если потребуются все регистры, экономия почти двойная.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 22 2007, 20:23
Сообщение #10


Гуру
******

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



Цитата(AlexandrY @ Jul 22 2007, 22:53) *
Этот пример содержит подвох.

Не больше, чем IRQ, который тоже не поддерживает вложенных прерываний без принятия дополнительных мер.
Цитата
Достаточно юзеру снова резрешить FIQ прерывания на входе в такой обработчик и он получит глюков по полной.

Как и при вложеных прерываниях в обработчик IRQ, и мириадах других случаев, если мифический юзер не будет ведать, что творит.
Цитата
Вообщем есть стандарт "Procedure Call Standard for the ARM® Architecture"

Который к обработчикам прерываний ни сном ни духом, однако.
Цитата
Скажите в каком компиляторе вы видели такой код

Любой, который имеет квалификатор __fiq. В данном конкретном случае IAR.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 22 2007, 20:35
Сообщение #11


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Юзер на C не успеет вновь разрешить прерывания до сохранения регистров, так что здесь все чисто.
Т.е. я понимаю задача ставится все сделать в рамках C.
Кстати inline ассемблер в RealView тоже не даст юзеру исхитриться с разрешением прерываний.


Цитата(zltigo @ Jul 22 2007, 23:53) *
Как и при вложеных прерываниях в обработчик IRQ, и мириадах других случаев, если мифический юзер не будет ведать, что творит.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 22 2007, 21:34
Сообщение #12


Гуру
******

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



Цитата(AlexandrY @ Jul 22 2007, 23:35) *
Юзер на C не успеет вновь разрешить прерывания до сохранения регистров, так что здесь все чисто.

Чисто? smile.gif А с SPSR_irq и LR_sys, что будет, если неразумный юзер их не сохранит 'просто' разрешив прерывания в обработчике? Короче, юзер должен быть разумным - без этого никак. Ну а разумный юзер для начала:
1. не будет в обработчик самого приоритетного прерывания вкладывать какие попало IRQ;
2. думать зачем иметь несколько FIQ;
3. очень крепко думать, зачем их делать вложенными;
4. и если вдруг придучает зачем, что будет очень странным для разумного юзера, поймет, что этот обработчик вовсе и не __fiq у него получися sad.gif и скажет компилятору, что это __irq.

За то, что мне, "разумному юзеру" не дают воспользоваться банком регистров FIQ я не скажу спасибо разработчикам такого компилятора. Ваши попытки оправдать отсутствие такой возможности у компилятора заботой о "неразумном юзере" очень неуклюжи sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
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   Ok! Согласен. В принципе цели мы добились. Чел...   Jul 22 2007, 21:49
||- - zltigo   Цитата(AlexandrY @ Jul 23 2007, 00:49) Че...   Jul 22 2007, 22:06
|- - Сергей Борщ   Цитата(sergeeff @ Jul 21 2007, 14:05) Не ...   Jul 23 2007, 09:44
- - 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 Текстовая версия Сейчас: 23rd June 2025 - 18:38
Рейтинг@Mail.ru


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