Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неверная обработка функции
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Тема
Код
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 настроенные на выход.
cebotor
Цитата(Тема @ Feb 4 2008, 12:01) *
Проходит на ура, а совместная же работа не работает, SHAG LED это PA27 PA 15 настроенные на выход.

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

что значит перестает выполняться ? - не попадает в событие обработчик ? не дергает ногой ? у вас один кусок от другово не зависит - попробуйте понять последовательно заменяя строки кода на незначащие при добавлении чего именно перестает отрабоатываться переворачивание первой ноги в первом ифе. Например сразу после добавления второго ифа , или после прописывания в него вложенного ифа или после дергания второй ногой во вложенном. И отпишите пожалуйста что получилось - зело интересно, действительно ли проблема столь чиста.
Dron_Gus
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, если у Вас другой - проверьте, но обычно у них одинаковые глюки.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.