|
|
  |
Прерывания в компиляторе RealView, IRQ или FIQ? |
|
|
|
Jul 22 2007, 14:00
|

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

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 22 2007, 19:53
|

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 банка будет абсолютно всегда, даже если потребуются все регистры, экономия почти двойная.
|
|
|
|
|
Jul 22 2007, 20:23
|

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

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

|
Цитата(AlexandrY @ Jul 22 2007, 23:35)  Юзер на C не успеет вновь разрешить прерывания до сохранения регистров, так что здесь все чисто. Чисто?  А с SPSR_irq и LR_sys, что будет, если неразумный юзер их не сохранит 'просто' разрешив прерывания в обработчике? Короче, юзер должен быть разумным - без этого никак. Ну а разумный юзер для начала: 1. не будет в обработчик самого приоритетного прерывания вкладывать какие попало IRQ; 2. думать зачем иметь несколько FIQ; 3. очень крепко думать, зачем их делать вложенными; 4. и если вдруг придучает зачем, что будет очень странным для разумного юзера, поймет, что этот обработчик вовсе и не __fiq у него получися  и скажет компилятору, что это __irq. За то, что мне, "разумному юзеру" не дают воспользоваться банком регистров FIQ я не скажу спасибо разработчикам такого компилятора. Ваши попытки оправдать отсутствие такой возможности у компилятора заботой о "неразумном юзере" очень неуклюжи  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 22 2007, 21:49
|

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

|
Ok! Согласен. В принципе цели мы добились. Человек должен понять, что корректно написать быстрый обработчик без asm-а он не сможет. Цитата(zltigo @ Jul 23 2007, 01:04)  Чисто?  А с SPSR_irq и LR_sys, что будет, если неразумный юзер их не сохранит 'просто' разрешив прерывания в обработчике? Короче, юзер должен быть разумным - без этого никак. Ну а разумный юзер для начала: 1. не будет в обработчик самого приоритетного прерывания вкладывать какие попало IRQ; 2. думать зачем иметь несколько FIQ; 3. очень крепко думать, зачем их делать вложенными; 4. и если вдруг придучает зачем, что будет очень странным для разумного юзера, поймет, что этот обработчик вовсе и не __fiq у него получися  и скажет компилятору, что это __irq. За то, что мне, "разумному юзеру" не дают воспользоваться банком регистров FIQ я не скажу спасибо разработчикам такого компилятора. Ваши попытки оправдать отсутствие такой возможности у компилятора заботой о "неразумном юзере" очень неуклюжи  .
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|