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

 
 
> Прерывание от таймера в AT91SAM7X256
ZAA
сообщение May 22 2008, 05:35
Сообщение #1


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

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Используем FreeRTOS. ВОзникла необходимость использования таймера. Вроде просто так таймер запускается и работает, а вот прерывания не обрабатывает. Я подозреваю, что функцию обработки прерывания нельзя объявлять, как обычную функцию. Наверное, надо прописывать ещё вектор прерывания от таймера где-то там. В том и проблема, что не очень хорошо разбираюсь во всяких там секциях памяти, размещении векторов и т. д (по крайней мере в этом контроллере). Как бы это попроще организовать??? help.gif
ТЕкст (кстати стандартный) приведен ниже:
//ф-ия обработки прерывания
void timer1_c_irq_handler(void)
{
AT91PS_TC TC_pt = AT91C_BASE_TC1;
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++;
vParTestToggleLED( 2 );
}

void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
{
unsigned int dummy;
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ) ;
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_TC1);
TC_pt->TC_CCR = AT91C_TC_CLKDIS ;
TC_pt->TC_IDR = 0xFFFFFFFF ;

dummy = TC_pt->TC_SR;

TC_pt->TC_CMR = Mode ;

TC_pt->TC_CCR = AT91C_TC_CLKEN ;
}

void timer_init ( void )
{
unsigned int oldHandler;
unsigned int mask ;
AT91S_AIC *pAIC = AT91C_BASE_AIC;
AT91S_TC *pTMR = AT91C_BASE_TC1;

//init the timer interrupt counter
count_timer0_interrupt=0;
count_timer1_interrupt=0;

//* Open timer1
AT91F_TC_Open(AT91C_BASE_TC1,TC_CLKS_MCK128,AT91C_ID_TC1);

//* Open Timer 1 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer1_c_irq_handler);
AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS; // IRQ enable CPC
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1);

//* Start timer1
//AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG ;

}

P.S. Знаю, что подобные посты уже были, но хотелось бы ещё раз остановиться на данной проблеме! Спасибо заранее за ответы.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение May 22 2008, 09:00
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Чтобы получить маааленький совет, укажите:
1. Какой используется компилятор.
2. Какой порт FreeRTOS.
Go to the top of the page
 
+Quote Post
ZAA
сообщение May 22 2008, 13:24
Сообщение #3


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

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(aaarrr @ May 22 2008, 12:00) *
Чтобы получить маааленький совет, укажите:
1. Какой используется компилятор.
2. Какой порт FreeRTOS.


Я делаю проект в Eclipse для AT91SAM7X256. А компилятор - gcc (который из эклипсовского gnu-армовского набора инструментов). Пыталась найти что-то подобное в инфе про gcc, но безрезультатно...Видимо, или ищу не там, или не то...
А вообще без отладчика тяжко программу писать...
Go to the top of the page
 
+Quote Post
sla000
сообщение May 23 2008, 03:08
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 25-06-07
Из: Томск
Пользователь №: 28 670



Цитата(ZAA @ May 22 2008, 19:24) *
Я делаю проект в Eclipse для AT91SAM7X256. А компилятор - gcc (который из эклипсовского gnu-армовского набора инструментов). Пыталась найти что-то подобное в инфе про gcc, но безрезультатно...Видимо, или ищу не там, или не то...
А вообще без отладчика тяжко программу писать...


Тяжело но можно, а потом когда привыкаешь так даже проще )

По вашему случаю рекомендую этот код компилить в ARM режиме, либо разделить код на 2 части и в ARM компилить функцию прерывания, а в THUMB (в котором скомпилен FreeRTOS для SAM7X256) скомпилировать все остальное. Кроме того обратите внимание как обрамлен код прерывания в уже имеющихся прерываниях FreeRTOS. То как сделано сейчас просто уронит ось когда наконец заработает.
Go to the top of the page
 
+Quote Post
ZAA
сообщение May 23 2008, 05:10
Сообщение #5


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

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(sla000 @ May 23 2008, 06:08) *
Тяжело но можно, а потом когда привыкаешь так даже проще )

По вашему случаю рекомендую этот код компилить в ARM режиме, либо разделить код на 2 части и в ARM компилить функцию прерывания, а в THUMB (в котором скомпилен FreeRTOS для SAM7X256) скомпилировать все остальное. Кроме того обратите внимание как обрамлен код прерывания в уже имеющихся прерываниях FreeRTOS. То как сделано сейчас просто уронит ось когда наконец заработает.

спасибо вам! Я попробую. Ещё встречный вопрос. Надо секцию, отвечающую за прерывания. размещать в Csatartup.c? Там же где и секции .text, .bss? Может быть. вы мне подскажете какой-нибудь источник, в котором хотя бы в общих словах рассказывается о принципах написания ассемблерных файлов для этого контроллера. ну в смысле всяких там секций и т п, а то с этим туговато. а без этого никак crying.gif Спасибо!
И ещё: что вы имеете ввиду под "То как сделано сейчас просто уронит ось когда наконец заработает"?

Сообщение отредактировал ZAA - May 23 2008, 05:13
Go to the top of the page
 
+Quote Post
sla000
сообщение May 23 2008, 05:36
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 25-06-07
Из: Томск
Пользователь №: 28 670



Цитата(ZAA @ May 23 2008, 11:10) *
Надо секцию, отвечающую за прерывания. размещать в Csatartup.c? Там же где и секции .text, .bss?


Нет, гляньте в мейкфайл, там есть список файлов SRC и SRCARM, так вот, если вы создадите файлик с телом перывания, то его надо добавить в список SRCARM. Так он скомпилится в ARM режиме. Соответсвенно всю остальную требуху - инициализацию таймера и т.п. можно запихнуть в SRC, тогда они скомпилятся в THUMB.

Цитата(ZAA @ May 23 2008, 11:10) *
Может быть. вы мне подскажете какой-нибудь источник, в котором хотя бы в общих словах рассказывается о принципах написания ассемблерных файлов для этого контроллера. ну в смысле всяких там секций и т п, а то с этим туговато. а без этого никак crying.gif Спасибо!


Да не переживайте вы так ) зачем вам вообще надо программировать на асме? Ну если уж так интересно читайте документацию на архитектуру ARM7TDMI есть на сайте ATMEL.

Цитата(ZAA @ May 23 2008, 11:10) *
И ещё: что вы имеете ввиду под "То как сделано сейчас просто уронит ось когда наконец заработает"?


У FreeRTOS есть совершенно четкие указания как должно выглядеть прерывание. Если им не следовать результат непредсказуем, но 100% что все пойдет не так как должно. Как должно быть обрамлено прерывание можно почитать тут:
http://www.freertos.org/portsam7xlwIP.html
Go to the top of the page
 
+Quote Post
ZAA
сообщение May 24 2008, 18:58
Сообщение #7


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

Группа: Участник
Сообщений: 141
Регистрация: 10-02-08
Из: Екб
Пользователь №: 34 906



Цитата(sla000 @ May 23 2008, 08:36) *
Нет, гляньте в мейкфайл, там есть список файлов SRC и SRCARM, так вот, если вы создадите файлик с телом перывания, то его надо добавить в список SRCARM. Так он скомпилится в ARM режиме. Соответсвенно всю остальную требуху - инициализацию таймера и т.п. можно запихнуть в SRC, тогда они скомпилятся в THUMB.


Уважаемый sla000!!! Я следую Вашим советам, но все равно не хочет этот таймер рботать. Уж руки просто опускаются!
Я объявляю в файлике interrupt_timer (который компилируется в ARM-mode) 2 функции (как сказано на сайте фриртоса):

void vTIMER_ISR_Handler( void )
{
portBASE_TYPE xTaskWokenByPost = pdFALSE;
static volatile unsigned portLONG ulNextMessage = 0;
xISRStatus *pxMessage;
AT91PS_TC TC_pt = AT91C_BASE_TC1;
unsigned int dummy;
//* Acknowledge interrupt status
dummy = TC_pt->TC_SR;
//* Suppress warning variable "dummy" was set but never used
dummy = dummy;
count_timer1_interrupt++;
vParTestToggleLED(3);
AT91C_BASE_AIC->AIC_EOICR = 0;
}


void vTIMER_ISR_Wrapper( void )
{
/* Save the context of the interrupted task. */
portSAVE_CONTEXT();

/* Call the handler itself. This must be a separate function as it uses
the stack. */
vTIMER_ISR_Handler();

/* Restore the context of the task that is going to
execute next. This might not be the same as the originally
interrupted task.*/
portRESTORE_CONTEXT();
}


Обе эти функции объявлены в файле interrupt_timer.h так:
void vTIMER_ISR_Wrapper( void ) __attribute__((naked));
void vTIMER_ISR_Handler( void );

Потом в init_timer.c (компилируется в THUMB-mode) настраиваю таймер1 (тоже вроде стандартная последовательность) и вызываю обработчик прерывания:
void timer_init ( void )
//* Begin
{
AT91S_AIC *pAIC = AT91C_BASE_AIC;
AT91S_TC *pTMR = AT91C_BASE_TC1;
//* Open timer1
AT91F_TC_Open(AT91C_BASE_TC1,TC_CLKS_MCK128,AT91C_ID_TC1);
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_TC1);
AT91C_BASE_TC1->TC_CMR=AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_CPCSTOP;

//* Open Timer 1 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ( void (*)( void ) )vTIMER_ISR_Wrapper);
//AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS; // IRQ enable CPC
AT91C_BASE_TC1->TC_RC = 0xFFFF;
//AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1);

AT91C_BASE_TC1->TC_CCR=AT91C_TC_CLKEN;
AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG ;
}

В чем косяк может быть? help.gif Помогите пожалуйста!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ZAA   Прерывание от таймера в AT91SAM7X256   May 22 2008, 05:35
- - aaarrr   Цитата(ZAA @ May 22 2008, 09:35) Я подозр...   May 22 2008, 05:40
|- - _4afc_   Цитата(aaarrr @ May 22 2008, 09:40) Нельз...   May 22 2008, 07:06
|- - aaarrr   Цитата(_4afc_ @ May 22 2008, 11:06) Обраб...   May 22 2008, 07:29
- - ZAA   НУ вот, ничего конкретного... а ведь хотя бы один...   May 22 2008, 08:41
|- - ZAA   Цитата(sla000 @ May 23 2008, 08:36) Нет, ...   May 24 2008, 07:34
|- - KolyanV   Цитата(ZAA @ May 24 2008, 21:58) В чем ко...   May 24 2008, 20:35
|- - aaarrr   Цитата(ZAA @ May 24 2008, 22:58) AT91F_TC...   May 24 2008, 21:30
- - ZAA   Цитата(aaarrr @ May 25 2008, 00:30) Timer...   May 25 2008, 07:10
|- - aaarrr   Цитата(ZAA @ May 25 2008, 11:10) У меня н...   May 25 2008, 10:12
|- - ZAA   Цитата(aaarrr @ May 25 2008, 13:12) А vTa...   May 25 2008, 13:39
- - aaarrr   Нет, отдельный task создавать не нужно. Вы шедулер...   May 25 2008, 15:38
|- - ZAA   Цитата(aaarrr @ May 25 2008, 18:38) Нет, ...   May 25 2008, 16:40
- - aaarrr   CPCSTOP не забыли убрать?   May 25 2008, 16:43
|- - ZAA   Цитата(aaarrr @ May 25 2008, 19:43) CPCST...   May 25 2008, 18:26
|- - aaarrr   Цитата(ZAA @ May 25 2008, 22:26) AT91C_BA...   May 26 2008, 02:56
|- - ZAA   Цитата(aaarrr @ May 26 2008, 05:56) Почем...   May 26 2008, 07:05
|- - ZAA   Цитата(aaarrr @ May 26 2008, 05:56) Почем...   May 26 2008, 13:00
- - aaarrr   И Вам спасибо за отсутствие AT91F_ в исходниках   May 26 2008, 13:03
|- - ZAA   Цитата(aaarrr @ May 26 2008, 16:03) И Вам...   May 27 2008, 17:31
|- - aaarrr   Цитата(ZAA @ May 27 2008, 21:31) Для реал...   May 27 2008, 18:38
|- - ZAA   Цитата(aaarrr @ May 27 2008, 21:38) Можно...   May 28 2008, 03:50
|- - ZAA   Цитата(aaarrr @ May 27 2008, 21:38) Разни...   May 28 2008, 17:40
|- - aaarrr   Цитата(ZAA @ May 28 2008, 21:40) 1) Можно...   May 28 2008, 18:21
|- - ZAA   Цитата(aaarrr @ May 28 2008, 21:21) Спас...   May 28 2008, 18:23
|- - ZAA   Цитата(aaarrr @ May 28 2008, 21:21) ... В...   May 28 2008, 20:51
|- - aaarrr   Цитата(ZAA @ May 29 2008, 00:51) Если раз...   May 29 2008, 03:06
|- - ZAA   Цитата(aaarrr @ May 29 2008, 06:06) Остан...   May 29 2008, 03:11
|- - aaarrr   Цитата(ZAA @ May 29 2008, 07:11) Да ещё и...   May 29 2008, 04:56
|- - ZAA   Цитата(aaarrr @ May 29 2008, 07:56) Ну, э...   May 29 2008, 07:46
- - aaarrr   Так добавьте какую-нибудь задачу, которая просто б...   May 29 2008, 07:50
- - ZAA   Цитата(aaarrr @ May 29 2008, 10:50) Так д...   May 29 2008, 10:01
- - ZAA   Цитата(aaarrr @ May 29 2008, 10:50) Так д...   Jun 13 2008, 05:15


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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 02:56
Рейтинг@Mail.ru


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