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

 
 
> Неверная обработка функции, прерывания от 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
 
Start new topic
Ответов
Dron_Gus
сообщение Feb 5 2008, 07:42
Сообщение #2


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 24th July 2025 - 08:30
Рейтинг@Mail.ru


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