|
|
  |
sam7x, таймер |
|
|
|
Aug 14 2007, 19:22
|
Группа: Новичок
Сообщений: 10
Регистрация: 3-04-06
Пользователь №: 15 768

|
У меня проблема с теймером. Не могу запустить примерчик. Думаю проблема с прерываниями. Работаю с FreeRTOS использую компайлер gcc. Пишет что непонимает __ramfunc. Каким образом я могу запустить этот пример?
void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId) { unsigned int dummy;
//* First, enable the clock of the TIMER AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ) ;
//* Disable the clock and the interrupts TC_pt->TC_CCR = AT91C_TC_CLKDIS ; TC_pt->TC_IDR = 0xFFFFFFFF ;
//* Clear status bit dummy = TC_pt->TC_SR; //* Suppress warning variable "dummy" was set but never used dummy = dummy; //* Set the Mode of the Timer Counter TC_pt->TC_CMR = Mode ;
//* Enable the clock TC_pt->TC_CCR = AT91C_TC_CLKEN ; }
__ramfunc 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 if ( (AT91F_PIO_GetInput(AT91C_BASE_PIOA) & LED3 ) == LED3 ) { AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, LED3 ); } else { AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED3 ); } }
void timer_init ( void ) { //init the timer interrupt counter count_timer0_interrupt=0; count_timer1_interrupt=0;
//* Open timer0 AT91F_TC_Open(AT91C_BASE_TC0,TC_CLKS_MCK1024,AT91C_ID_TC0);
//* Open Timer 0 interrupt AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC0, TIMER0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer0_c_irq_handler); AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS; // IRQ enable CPC AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC0);
//* Start timer0 AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG ;
//* End }
|
|
|
|
|
Aug 31 2007, 22:59
|
Группа: Новичок
Сообщений: 10
Регистрация: 3-04-06
Пользователь №: 15 768

|
Проблема вследующем: Я хотел бы реализовать Interrupts под Примером от FreeRTOS uIP_Demo_Rowley_ARM7 (GCC), но как я уже писал программа не пониает _ramfunc и _attribute хотя Tasks работают. С изменением файлов тоже куча вопросов в этом примере три ассемблер датаек boot.s, AT91SAM7_Startup.s, crt0.s что я там должен изменить???(чтобы таймер работал). Хотя в Makefile я ничего ненашел чтобы связывало AT91SAM7_Startup.s и crt0.s с программой. С другими примерами прерывания работают без проблем, но я бы хотел разобраться с этим примерчиком. Может кто то уже сталкивался с этой проблемой? И просьба сильно не ругаться если я чего лишнего ... Я только начал разбираться с микроконтроллерами. Спасибо заранее
|
|
|
|
|
Sep 1 2007, 08:35
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
int func(int x) __attribute__ (( section(".ramfunc") ));Пересчитайте подчерки. Их по два с каждой стороны, точку переди менем секции не пропустите, и скобок тоже должнл быть по две плюс имя секции то-же в скобках. __attribute__ указывается для прототипа. Например в *.h файле Код int func(int x) __attribute__ (( section(".ramfunc") )); а в *.c файле Код int func(int x) { return x * 2; } Или в *.c файле без хедера: Код int func(int x) __attribute__ (( section(".ramfunc") )); int func(int x) { return x * 2; } Слово .ramfunk не является каким-то особенным. Имя секции выбирает программист произвольно. Смотри пример. После компилляции дают немного разные результаты по выводу бинарика.
Сообщение отредактировал amw - Sep 1 2007, 08:40
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 1 2007, 08:39
|

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

|
Цитата(serikbei @ Sep 1 2007, 01:59)  я бы хотел разобраться с этим примерчиком. Может кто то уже сталкивался с этой проблемой? Как сказал amw, в GCC функции в ОЗУ расположить несколько сложнее, чем в IAR. Вы можете просто выкинуть в этом примере ключевое слово __ramfunc, на данном этапе освоения вам не важны те тонкости, которые вытекают из размещения функции в ОЗУ.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 1 2007, 08:49
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Минуточку, а какой таймер использует FreeRTOS для переключения задач? Случайно не Таймер0? Тогда лучше перенести эксперименты на другой таймер. Цитата(serikbei @ Sep 1 2007, 01:59)  С изменением файлов тоже куча вопросов в этом примере три ассемблер датаек boot.s, AT91SAM7_Startup.s, crt0.s что я там должен изменить???(чтобы таймер работал). Найти файл, в котором производится инициализация секции .data и .bss и добавить в него инициализаци секции .ramfunc. Ну или файл, из которого вызываются функции инициализации .data и .bss и добавить в него вызов функции инициализации .ramfunc.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
|
Sep 1 2007, 09:23
|
Группа: Новичок
Сообщений: 10
Регистрация: 3-04-06
Пользователь №: 15 768

|
Вот спасибо. Буду пробовать
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|