Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: arm AT91sam7s256 + FREERTOS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Пришелец
arm AT91sam7s256 + FREERTOS help.gif

Пытаюсь использовать прерывания от таймера 0. - прерывания не возникают blink.gif

настраиваю таймер и AIC как в IAR овском примере проекта с прерываниями (который без RTOS на плате работает)

В чём могут быть грабли unsure.gif - подскажите кто знает

Заранее спасибо! biggrin.gif
klen
Цитата(Пришелец @ Oct 7 2006, 13:25) *
arm AT91sam7s256 + FREERTOS help.gif

Пытаюсь использовать прерывания от таймера 0. - прерывания не возникают blink.gif

настраиваю таймер и AIC как в IAR овском примере проекта с прерываниями (который без RTOS на плате работает)

В чём могут быть грабли unsure.gif - подскажите кто знает

Заранее спасибо! biggrin.gif


Таймер 0 используется для генерации тиков планировщика. Смотри функцию static void prvSetupTimerInterrupt( void ) в файле port.c

По прерыванию таймера 0 должен вызыватся обработчик прерывания vPreemptiveTick
Пришелец
Для этой цели ведь используется PIT таймер - он и предназначен специально для этого.

А я говорю про TC0 - это ведь разные вещи ???
klen
Цитата(Пришелец @ Oct 7 2006, 16:07) *
Для этой цели ведь используется PIT таймер - он и предназначен специально для этого.

А я говорю про TC0 - это ведь разные вещи ???

Вы правы я перепутал с портом для LPC.
Пришелец
help.gif
Пришелец
таймер тикает
Сергей Борщ
Цитата(Пришелец @ Oct 9 2006, 13:35) *
таймер тикает
Насколько я помню там надо каждый обработчик вызывать из АСМ-обертки. А не видя кода советовать что-либо очень тяжело.
Пришелец
да асм обёртка есть :

Код
vTimerISREntry:

    portSAVE_CONTEXT        ; Save the context of the current task.

    bl    timer0_c_irq_handler            ; Call the ISR routine.

    portRESTORE_CONTEXT        ; Restore the context of the current task -
                            ; which may be different to the task that
                            ; was interrupted.




вот обработчик на C:

Код
void timer0_c_irq_handler(void)
{
    AT91PS_TC TC_pt = AT91C_BASE_TC0;
    unsigned int dummy;
    //* Acknowledge interrupt status
    dummy = TC_pt->TC_SR;
    //* Suppress warning variable "dummy" was set but never used
    dummy = dummy;
//    count_timer0_interrupt++;
    //* Read the output state
    vParTestToggleLED(3);
}



Настройка таймера и прерываний:


Код
void soft_uart_ini(void)
{
      unsigned int dummy;
          portENTER_CRITICAL();
        {
        
        //* First, enable the clock of the TIMER
            AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< AT91C_ID_TC0 );

        //* Disable the clock and the interrupts
        AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
        AT91C_BASE_TC0->TC_IDR = 0xFFFFFFFF;

        //* Clear status bit
            dummy = AT91C_BASE_TC0->TC_SR;
        //* Suppress warning variable "dummy" was set but never used
            dummy = dummy;
        //* Set the Mode of the Timer Counter
        AT91C_BASE_TC0->TC_CMR = 4;
    
        //* Enable the clock
        AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN;
        
    AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC0, TIMER0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, vTimerISREntry);
    AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;  //  IRQ enable CPC
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC0);

    AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG;
    
        }
        portEXIT_CRITICAL();
}




Ни светодиодом не моргает ни на точках останова не останавливается.
Пришелец
Ну вот sad.gif

теперь и иаровский пример с прерываниями от таймеров не работает.

Вообще ничего не понимаю - ничего кажется там не менял. cranky.gif


help.gif help.gif help.gif help.gif help.gif help.gif help.gif help.gif
Сергей Борщ
Цитата(Пришелец @ Oct 10 2006, 16:29) *
Ну вот sad.gif
теперь и иаровский пример с прерываниями от таймеров не работает.
Вообще ничего не понимаю - ничего кажется там не менял. cranky.gif
А теперь вспоминай: Отладку внутрисхемную делал? Точку останова внутри обработчика прерывания ставил? После остановки в этой точке прекращал отладку? Если да, попробуй сделать так: В начале программы до глобального разрешения прерываний вставь строчку
Код

    AT91C_BASE_AIC->AIC_EOICR = 0;                    // Reset AIC logic
или в .mac добавь в execUserReset() строчки
Код
    __writeMemory32(0xffffffff,0xFFFFF130,"Memory");
    .....
    __writeMemory32(0xffffffff,0xFFFFF130,"Memory");
    // всего 8 раз.
Пришелец
AT91C_BASE_AIC->AIC_EOICR = 0; стоит такая штука уже


Код
static void prvSetupHardware( void )
{
    /* When using the JTAG debugger the hardware is not always initialised to
    the correct default state.  This line just ensures that this does not
    cause all interrupts to be masked at the start. */
    AT91C_BASE_AIC->AIC_EOICR = 0;
    
    /* Most setup is performed by the low level init function called from the
    startup asm file. */

    /* Configure the PIO Lines corresponding to LED1 to LED4 to be outputs as
    well as the UART Tx line. */
    AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK | (1<<1) | (1<<27) | (1<<24));
    
    /* Enable the peripheral clock. */
    AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );



}
Пришелец
Вообще странно - никак не хочет работать тот пример иаровский с прерываниями от таймеров, а раньше работал cranky.gif


Может ли так погореть ARM ??? twak.gif

или это проблема кривых рук smile3046.gif
Пришелец
Проблема оказалась вот в чём:

RTOS компилируется в THUMB инструкциях (в арм почему то не работает - не разбирался)
но прерывания у неё описываются в АРМ инструциях


ф-ция прерывания от таймера была на С соответственно в THUMB

поставил _arm перед объявлением обработчика и всё пошло!!!
Kail
Да уж... Сочуствую smile.gif. Наверное всю голову поломал. Такие ошибки искать - полная попа.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.