Перейти к содержанию
    

arm AT91sam7s256 + FREERTOS

arm AT91sam7s256 + FREERTOS :help:

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

arm AT91sam7s256 + FREERTOS :help:

 

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

 

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

 

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

 

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

 

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

 

По прерыванию таймера 0 должен вызыватся обработчик прерывания vPreemptiveTick

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для этой цели ведь используется PIT таймер - он и предназначен специально для этого.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для этой цели ведь используется PIT таймер - он и предназначен специально для этого.

 

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

Вы правы я перепутал с портом для LPC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

таймер тикает
Насколько я помню там надо каждый обработчик вызывать из АСМ-обертки. А не видя кода советовать что-либо очень тяжело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да асм обёртка есть :

 

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();
}

 

 

 

Ни светодиодом не моргает ни на точках останова не останавливается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот :(

 

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

 

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

 

 

:help::help::help::help::help::help::help::help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот :(

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

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

А теперь вспоминай: Отладку внутрисхемную делал? Точку останова внутри обработчика прерывания ставил? После остановки в этой точке прекращал отладку? Если да, попробуй сделать так: В начале программы до глобального разрешения прерываний вставь строчку
 
    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:

 

 

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

 

или это проблема кривых рук :smile3046:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема оказалась вот в чём:

 

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

но прерывания у неё описываются в АРМ инструциях

 

 

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

 

поставил _arm перед объявлением обработчика и всё пошло!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...