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

 
 
 
Reply to this topicStart new topic
> arm AT91sam7s256 + FREERTOS
Пришелец
сообщение Oct 7 2006, 09:25
Сообщение #1


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



arm AT91sam7s256 + FREERTOS help.gif

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

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

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

Заранее спасибо! biggrin.gif
Go to the top of the page
 
+Quote Post
klen
сообщение Oct 7 2006, 11:42
Сообщение #2


бессмертным стать можно тремя способами
*****

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



Цитата(Пришелец @ 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
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Oct 7 2006, 12:07
Сообщение #3


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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

А я говорю про TC0 - это ведь разные вещи ???
Go to the top of the page
 
+Quote Post
klen
сообщение Oct 7 2006, 15:21
Сообщение #4


бессмертным стать можно тремя способами
*****

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



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

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

Вы правы я перепутал с портом для LPC.
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Oct 9 2006, 07:32
Сообщение #5


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



help.gif
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Oct 9 2006, 10:35
Сообщение #6


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



таймер тикает
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2006, 09:31
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Oct 10 2006, 09:59
Сообщение #8


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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

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




Ни светодиодом не моргает ни на точках останова не останавливается.
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Oct 10 2006, 13:29
Сообщение #9


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



Ну вот sad.gif

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

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


help.gif help.gif help.gif help.gif help.gif help.gif help.gif help.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2006, 14:02
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Пришелец @ 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 раз.


Сообщение отредактировал Сергей Борщ - Oct 10 2006, 14:04


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Oct 27 2006, 11:26
Сообщение #11


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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



}
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Oct 30 2006, 08:00
Сообщение #12


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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


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

или это проблема кривых рук smile3046.gif
Go to the top of the page
 
+Quote Post
Пришелец
сообщение Nov 8 2006, 08:48
Сообщение #13


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

Группа: Участник
Сообщений: 183
Регистрация: 28-01-05
Пользователь №: 2 272



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

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


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

поставил _arm перед объявлением обработчика и всё пошло!!!
Go to the top of the page
 
+Quote Post
Kail
сообщение Nov 8 2006, 14:07
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 3-08-06
Пользователь №: 19 285



Да уж... Сочуствую smile.gif. Наверное всю голову поломал. Такие ошибки искать - полная попа.
Go to the top of the page
 
+Quote Post

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

 


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


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