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

 
 
 
Reply to this topicStart new topic
> Неверная обработка функции, прерывания от RTTC
Тема
сообщение Feb 4 2008, 09:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 31-01-08
Из: Екатеринбург
Пользователь №: 34 632



Код
void pio_c_irq_handler ( void ) __irq{
int rttsr1,rttsr2;
rttsr1=AT91F_RTTGetStatus(AT91C_BASE_RTTC);
rttsr1=rttsr1;
rttsr2=rttsr1;
if(rttsr1&1)
{      if  (out==0)
{                out=1;    
                AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED);
}      else
{                
                out=0;
                AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED);
                AT91F_RTTSetAlarmValue(AT91C_BASE_RTTC,(AT91F_RTTReadValue(AT91C_BASE_RTTC)+1000*interval));
}
}

if(rttsr2&2)
{      if  (shags==0)
{                shags=1;    
                AT91F_PIO_SetOutput( AT91C_BASE_PIOA, SHAG);
}      else
{                
                shags=0;
                AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, SHAG);
}
}
    


  *AT91C_AIC_EOICR = 0;                     /* End of Interrupt */
}

У меня прерывания от таймера и будильника сделаны в одной функции, если отрабаотывать отдельно

Код
void pio_c_irq_handler ( void ) __irq{
int rttsr1,rttsr2;
rttsr1=AT91F_RTTGetStatus(AT91C_BASE_RTTC);
rttsr1=rttsr1;
rttsr2=rttsr1;
if(rttsr1&1)
{      if  (out==0)
{                out=1;    
                AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED);
}      else
{                
                out=0;
                AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED);
                AT91F_RTTSetAlarmValue(AT91C_BASE_RTTC,(AT91F_RTTReadValue(AT91C_BASE_RTTC)+1000*interval));
}
}



  *AT91C_AIC_EOICR = 0;                     /* End of Interrupt */
}
или
Код
void pio_c_irq_handler ( void ) __irq{
int rttsr1,rttsr2;
rttsr1=AT91F_RTTGetStatus(AT91C_BASE_RTTC);
rttsr1=rttsr1;
rttsr2=rttsr1;

if(rttsr2&2)
{      if  (shags==0)
{                shags=1;    
                AT91F_PIO_SetOutput( AT91C_BASE_PIOA, SHAG);
}      else
{                
                shags=0;
                AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, SHAG);
}
}
    


  *AT91C_AIC_EOICR = 0;                     /* End of Interrupt */
}


Проходит на ура, а совместная же работа не работает, SHAG LED это PA27 PA 15 настроенные на выход.


--------------------
Наша электроника и программы - http://soft-ee.com
Go to the top of the page
 
+Quote Post
cebotor
сообщение Feb 4 2008, 10:40
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(Тема @ Feb 4 2008, 12:01) *
Проходит на ура, а совместная же работа не работает, SHAG LED это PA27 PA 15 настроенные на выход.

может по порядку ? из кода видно что камень - sam7. а конкретнее ?
и собственно по сути дела - у вас три случая :
1 обработка двух событий одной процедурой
2 обработка одного события
3 обработка другово события.
случаи 2 и 3 получаються из первого путем коментирования кусков кода.
неясно :
1 какие именно симптомы неработоспособности
2 нельля ли методом последовательного приближения от случая 1 к случаю 2 например понять
причину засора ?


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
Тема
сообщение Feb 4 2008, 15:46
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 31-01-08
Из: Екатеринбург
Пользователь №: 34 632



Поскольку прерывание от RTCC и Alarm RTCC одно(потому как дескрипторы одинаковые хотя возможно я не прав, но нашел лишь AT91C_ID_SYS) то обработка происходит одной функций, но непонятно почему когда в теле цикла появляться 2 if подряд то просто перестает выполняться!камень SAM7S256, последовательно пытался...по отдельности работают оба случая...


--------------------
Наша электроника и программы - http://soft-ee.com
Go to the top of the page
 
+Quote Post
cebotor
сообщение Feb 5 2008, 07:26
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(Тема @ Feb 4 2008, 18:46) *
Поскольку прерывание от RTCC и Alarm RTCC одно(потому как дескрипторы одинаковые хотя возможно я не прав, но нашел лишь AT91C_ID_SYS) то обработка происходит одной функций, но непонятно почему когда в теле цикла появляться 2 if подряд то просто перестает выполняться!камень SAM7S256, последовательно пытался...по отдельности работают оба случая...

что значит перестает выполняться ? - не попадает в событие обработчик ? не дергает ногой ? у вас один кусок от другово не зависит - попробуйте понять последовательно заменяя строки кода на незначащие при добавлении чего именно перестает отрабоатываться переворачивание первой ноги в первом ифе. Например сразу после добавления второго ифа , или после прописывания в него вложенного ифа или после дергания второй ногой во вложенном. И отпишите пожалуйста что получилось - зело интересно, действительно ли проблема столь чиста.


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Feb 5 2008, 07:42
Сообщение #5


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



RTT: Possible Event Loss when Reading RTT_SR
If an event (RTTINC or ALMS) occurs within the same slow clock cycle during which the
RTT_SR is read, the corresponding bit might be cleared. This can lead to the loss of this event.
Problem Fix/Workaround:
The software must handle the RTT event as an interrupt and should not poll RTT_SR.

Т.е. если проц входит в прерывание и успевает прочитать регистр состояния меньше чем за 1 slow clock cycle, то бит не успеет взвестись. А самим чтением Вы его обратно сбросите. Т.е. прерывание то может и крутиться, но ветви if не выполняются.

З.Ы. это из errat'ы на sam7x, если у Вас другой - проверьте, но обычно у них одинаковые глюки.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

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

 


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


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