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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Прерывания в компиляторе RealView, IRQ или FIQ?
defunct
сообщение Jul 20 2007, 13:48
Сообщение #16


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SergeyDDD @ Jul 17 2007, 17:33) *
Далай обработчик FIQ на ассемблере

+1
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 20 2007, 21:21
Сообщение #17


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

Группа: Свой
Сообщений: 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
Сообщение #18


Гуру
******

Группа: Модераторы
Сообщений: 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
AlexandrY
сообщение Jul 21 2007, 08:22
Сообщение #19


Ally
******

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



Лучше, лучше ... biggrin.gif

В STR91x есть специальное место для кеширования команды перехода по вектору.
На FIQ может экономиться куча тактов за счет того, что не надо читать команду из FLASH.


Цитата(a3r3 @ Jul 11 2007, 13:00) *
Только не лучше, а так же, как и у остальных процессоров с ARM ядром. Регистры R8-R12.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jul 21 2007, 11:05
Сообщение #20


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

Группа: Свой
Сообщений: 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
Сообщение #21


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
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #23


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

Группа: Свой
Сообщений: 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
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #25


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
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #27


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
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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
AlexandrY
сообщение Jul 22 2007, 21:49
Сообщение #29


Ally
******

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



Ok! Согласен. В принципе цели мы добились. Человек должен понять, что корректно написать быстрый обработчик без asm-а он не сможет.

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

За то, что мне, "разумному юзеру" не дают воспользоваться банком регистров FIQ я не скажу спасибо разработчикам такого компилятора. Ваши попытки оправдать отсутствие такой возможности у компилятора заботой о "неразумном юзере" очень неуклюжи sad.gif.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 22 2007, 22:06
Сообщение #30


Гуру
******

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



Цитата(AlexandrY @ Jul 23 2007, 00:49) *
Человек должен понять, что корректно написать быстрый обработчик без asm-а он не сможет.

Корректный - сможет. И более быстый для FIQ сможет. А c наворотами в виде вложенных прерываний без ASM не сможет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 07:11
Рейтинг@Mail.ru


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