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

 
 
> AT91SAM9G45, IRQ и FIQ
Sergey1212
сообщение Apr 26 2013, 07:54
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-04-13
Пользователь №: 76 596



Вобщем задача такая
хочу реализовать параллельную шину данных и 8 ног внешнего прерывания по которым будет опрашиваться шина.
данные с шины должны опрашиваться как можно быстрее т.е. прерываться выполнения IRQ и не допускать вложенности.
Для этих целей хочу использовать FIQ. Использовать EBI для общения как с статической памятью не получится, буду использовать ногодрыг, да и устройство на другой стороне имеет относительно низкую скорость шины.
IRQ будут висеть на таймерах и т.д. а FIQ на физических пинах.

Отсюда вопросы насколько хорошо выполненна реализация IRQ в стандартных примерах атмеля?
из архив at91sam9m10-ekes-softpack-1.9.zip
Если там все по кривому, было бы не плохо увидеть ссылку на правильный код.
Получится ли вообще повесить на 8 ног FIQ прерывания?
Не владею асемблером, где можно посмотреть пример кода с FIQ на этот проц?
сохранение стека, возврат и т.д.
И еще стоит ли вообще использовать FIQ или достаточно использовать на эти 8 ног IRQ с одинаковым самым высоким приоритетом?
будут ли выполняющиеся в этот момент IRQ с более низким приоритетом прерываться для выполнения IRQ с более высоким приоритером?
и как я понимаю вложенности тоже не будет т.к. IRQ будут с одинаковым высоким приоритетом?

Сообщение отредактировал Sergey1212 - Apr 26 2013, 08:08
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Sergey1212
сообщение May 2 2013, 05:44
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 23-04-13
Пользователь №: 76 596



Есть вот такой код фика
CODE

FIQ_Handler_Entry:

stmfd sp!, {r0, lr}
ldr lr, =AT91C_BASE_AIC
ldr r0, [lr, #AIC_FVR]
str lr, [lr, #AIC_FVR]
msr CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC
//;- Save scratch/used registers and LR in User Stack
stmfd sp!, {r1-r3, r4, r12, lr}
//;- Branch to the routine pointed by the AIC_FVR

ldr r0, =fiq
mov r14, pc
bx r0
//;- Restore scratch/used registers and LR from User Stack
ldmia sp!, {r1-r3, r4, r12, lr}
//;- Leave Interrupts disabled and switch back in FIQ mode
msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ
mov r0, #0xFFFFFF
ldr r8, =AT91C_BASE_AIC
str r0, [r8, #AIC_EOICR]

//;- Restore the R0 ARM_MODE_SVC register
ldmia sp!, {r0, lr}
//;- Restore the Program Counter using the LR_fiq directly in the PC
subs pc,lr,#4

но работает он только если я в AIC_SMR[source] = AT91C_AIC_PRIOR_HIGHEST | 0;
а если использую другие варианты (0x2 << 5) или (0x1 << 5) или (0x3 << 5) то прерывание остается активным т.к. все время заходит в процедуру fiq и там прочитанный статус равен 0
если тот же обраотчик вешаю на IRQ то все работает отлично прерывания сбрасываются как положено
т.е. дело не в обработчике
вот код fiq
Код
void fiq(void)
{
    volatile unsigned int dummy, reg;
    unsigned int status;
    status = AT91C_BASE_PIOA->PIO_ISR;
    status &= AT91C_BASE_PIOA->PIO_IMR;

    printf("HI %d \r\n", status);

    if(status!=0)
    {
        dummy = AT91C_BASE_PIOA->PIO_ISR;
        printf("HI fiq \r\n");
    }
}


Подскажите в чем проблема?
И как сделать чтобы переходил по вектору на процедуру сохраненную через AIC
комментирую строку ldr r0, =fiq в фик не попадаю
жытага нет поэтому в слепую очень уж непросто разбираться и учиться
подскажите пожалуйста

Сообщение отредактировал Sergey1212 - May 2 2013, 05:48
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 2 2013, 07:52
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Sergey1212 @ May 2 2013, 11:44) *
Есть вот такой код фика
...
//;- Restore the R0 ARM_MODE_SVC register
ldmia sp!, {r0, lr}
//;- Restore the Program Counter using the LR_fiq directly in the PC
subs pc,lr,#4

И где же восстановление прерванного режима CPU???
У вас после такого возврата, CPU останется в режиме FIQ, стек разрушится, не говоря уже о том что прерывания останутся запрещёнными.

Цитата(Sergey1212 @ May 2 2013, 11:44) *
если тот же обраотчик вешаю на IRQ то все работает отлично прерывания сбрасываются как положено
По-моему - Вы обманываете. Такой код работать не будет.

И это кроме того, что таким Вы убиваете весь смысл FIQ как быстрого прерывания. Зачем он Вам тогда нужен? Пользуйтесь IRQ. Такими манипуляциями Вы низводите плюсы FIQ (скорость входа/выхода) до обычной скорости IRQ с внешним AIC-контроллером, т.е. - самой тормозной.

Цитата(aaarrr @ May 2 2013, 12:41) *
Подумайте, нужны ли вам вообще прерывания по фронту - для внутренних источников (к которым относится и GPIO), в 99.9% случаев смысла работать по фронту нет.
Проблема автора в том, что он не хочет ничего читать из документации на CPU, а хочет надёргать каких-то левых чужих кусков не разбираясь как они работают, и чтобы это всё заработало, да ещё и быстро...

Цитата(Sergey1212 @ May 2 2013, 11:44) *
...
printf("HI %d \r\n", status);
...

Запускать такие тяжёлые функции из ISR, к тому же ещё на стеке SVC (printf до фига ест стека) неизвестно какого размера (скорей всего - небольшого)???
Ну-ну, успехов! wink.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 2 2013, 08:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(jcxz @ May 2 2013, 11:52) *
По-моему - Вы обманываете. Такой код работать не будет.

Нет, тут все правильно: subs pc, lr, #4 восстановит режим.

Цитата(jcxz @ May 2 2013, 11:52) *
Запускать такие тяжёлые функции из ISR, к тому же ещё на стеке SVC (printf до фига ест стека) неизвестно какого размера (скорей всего - небольшого)???
Ну-ну, успехов! wink.gif

Если это из атмеловских примеров, то у них как раз все наоборот - стек IRQ/FIQ имеет минимальный размер, а SVC/USR достаточно приличные.
Но правильно, конечно, будет убрать это дурацкое переключение и расширить при необходимости стек FIQ.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sergey1212   AT91SAM9G45   Apr 26 2013, 07:54
- - aaarrr   Цитата(Sergey1212 @ Apr 26 2013, 11:54) О...   Apr 26 2013, 08:13
- - Sergey1212   Не подскажите пример хорошей реализации IRQ и FIQ?   Apr 26 2013, 08:30
- - jcxz   Цитата(Sergey1212 @ Apr 26 2013, 13:54) П...   Apr 26 2013, 08:41
- - aaarrr   ИМХО, хорошая реализация может выглядеть примерно ...   Apr 26 2013, 08:50
- - Sergey1212   а всетаки пример может кто скинет? с вложенными IR...   Apr 26 2013, 11:01
||- - jcxz   Цитата(aaarrr @ May 2 2013, 14:00) Нет, т...   May 2 2013, 09:09
|- - Sergey1212   ЦитатаПо-моему - Вы обманываете. Такой код работат...   May 2 2013, 08:32
|- - aaarrr   Цитата(Sergey1212 @ May 2 2013, 12:32) Де...   May 2 2013, 08:40
|- - jcxz   Цитата(Sergey1212 @ May 2 2013, 14:32) Я ...   May 2 2013, 08:59
|- - Sergey1212   Цитата(jcxz @ May 2 2013, 12:59) Вы-то ка...   May 2 2013, 09:11
|- - jcxz   Цитата(Sergey1212 @ May 2 2013, 15:11) В ...   May 2 2013, 09:54
- - aaarrr   Прочитайте внимательно раздел "27.8.4.5 Fast ...   May 2 2013, 06:41
- - Sergey1212   Да спасибо, это видимо потому что прерывание не сб...   May 2 2013, 09:02
|- - aaarrr   Цитата(Sergey1212 @ May 2 2013, 13:02) ст...   May 2 2013, 09:45
- - Sergey1212   ЦитатаНе надо делать: впустую переключать контекст...   May 2 2013, 11:12
|- - aaarrr   Цитата(Sergey1212 @ May 2 2013, 15:12) Их...   May 2 2013, 11:47
- - Sergey1212   Всем спасибо, хоть что-то разъяснилось) Код сократ...   May 2 2013, 11:50
- - jcxz   Я же уже писал... В моём ARM9-ядре (ARM926EJ-S ...   May 2 2013, 16:08
- - aaarrr   Цитата(Sergey1212 @ May 2 2013, 15:50) Че...   May 2 2013, 18:02


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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 05:28
Рейтинг@Mail.ru


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