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

 
 
 
Reply to this topicStart new topic
> sam7x, таймер
serikbei
сообщение Aug 14 2007, 19:22
Сообщение #1





Группа: Новичок
Сообщений: 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
}
Go to the top of the page
 
+Quote Post
KAlex
сообщение Aug 15 2007, 07:16
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



С gcc не работаю, но под IAR компилится без проблем. Смотри в чем между ними разница.
Go to the top of the page
 
+Quote Post
amw
сообщение Aug 15 2007, 07:52
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



В gcc нет управления размещением кода.
Код размещается линкером - ld.
Для размещения функции или данных в ОЗУ нужно:
1. Написать линкер скрипт с секцией (секциями) с указанием адреса начала в ОЗУ. Например секция с именем .ramfunc
2. В прототипе функции или переменной указать в какой секции ее размещать. Например:
int func(int x) __attribute__ (( section(".ramfunc") ));
3. В crt0.S (или как там у Вас называется стартап файл) скопировать эту секцию из флеша в ОЗУ. (по аналогии с секцией .data).

Сообщение отредактировал amw - Aug 15 2007, 07:53


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
serikbei
сообщение Aug 31 2007, 22:59
Сообщение #4





Группа: Новичок
Сообщений: 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 с программой. С другими примерами прерывания работают без проблем, но я бы хотел разобраться с этим примерчиком. Может кто то уже сталкивался с этой проблемой? И просьба сильно не ругаться если я чего лишнего ... Я только начал разбираться с микроконтроллерами.
Спасибо заранее
Go to the top of the page
 
+Quote Post
amw
сообщение Sep 1 2007, 08:35
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  ramfunc.zip ( 14.78 килобайт ) Кол-во скачиваний: 40
 


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 1 2007, 08:39
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
amw
сообщение Sep 1 2007, 08:49
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
serikbei
сообщение Sep 1 2007, 09:23
Сообщение #8





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



Вот спасибо. Буду пробовать
Go to the top of the page
 
+Quote Post

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

 


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


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