Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите с прерыванием таймера
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
coolibin
Использую IAR 4.41A, JLink J-Tag дебагер, RAM дебаг, стандартный cstartup.
Код:
CODE


void AT91F_TC_Open(AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
//* Begin
{
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 ;
//* End
}

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

}

...
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, 0x4, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer0_c_irq_handler);
AT91C_BASE_TC0->TC_IER = AT91C_TC_COVFS;
AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_TC0);
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_TC0);

AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG;
...



код вроде сдерт с атмеловского примера, но прерывание все равно не генерируется. Причем если работать с флагом, а не с прерываниями, то все норм.
aaarrr
1. У обработчика нет модификатора __irq
2. В обработчике нет записи AIC_EOICR
coolibin
но в примере этого тоже не было(((
DpInRock
Указанные aaarrr деяния могли скрываться внутри стартапа. Так что вы должны точно отдать себе отчет в правильности подключаемого стартапа, а не от фонаря.
aaarrr
Угу, пора уже памятку повесить, что смотреть/выкладывать, если не работают прерывания.
coolibin
Увы.
Я так понимаю __irq говорит компилятору автоматически создать т. н. обертку(при входе регистры в стек, при выходе из стека и т. п.). Я добавил в свой проект СStartUp.s79 из атмеловского примера. В атмеловском коде эта "обертка" написана вручную на асме. Ничего не изменилось. Прерывание как не вызывалось так и не вызывается, хотя программа куда то прыгает, а вот куда и почему не обрабатывается прерывание, это вопрос.
defunct
Цитата(coolibin @ May 15 2009, 19:20) *
Прерывание как не вызывалось так и не вызывается, хотя программа куда то прыгает, а вот куда и почему не обрабатывается прерывание, это вопрос.

Поставьте точку останова на адрес 0x18 и пройдитесь по шагам.
С отладчиком то это вопрос 5-ти минут.
DpInRock
Там вообще-то дофига стартапов. Какой именно?
У меня как раз все атмеловские примеры рабтали. Даже те, которые не должны бы были.
coolibin
Держи!
DpInRock
Я бы в код прерывания вставил что-нибудь полезное, заметное. А всякие отладчики выбросил бы в ближайшее мусорное ведро. Отладчик сделанный не своими руками - зло.
defunct
Цитата(DpInRock @ May 15 2009, 19:55) *
Я бы в код прерывания вставил что-нибудь полезное, заметное.

Конечно, это же "быстрее" чем пройтись по шагам от IRQ вектора до места где торчит проц и увидеть своими глазами куда и как он прыгает.

Цитата
А всякие отладчики выбросил бы в ближайшее мусорное ведро.

Смешно. Как раз тот случай, чем посмотреть и за пару минут решить проблему, лучше пользоваться дедовским светиком и третий день
менять стартапы.

Цитата
Отладчик сделанный не своими руками - зло.

Да-да, бабки в эпоху ленинской революции говорили, что поезда и лехтричество - это зло. Лучше телегой и со свечкой.
DpInRock
У меня просто никогда не было никаких отладчиков и JTAG. Чисто от бедности (а не гордыни).
А тут - вот доказательство - наличие отладчика не помогат. Так что пока я прав.

Я бы для начала убедился, что проц на нужной скорости работает. Настроил бы UART. И горя не знал бы.
defunct
Цитата(DpInRock @ May 16 2009, 00:39) *
У меня просто никогда не было никаких отладчиков и JTAG.

Ну симулятор тоже можно.. Надо то всего лишь протрассировать код IRQ.

Цитата
Я бы для начала убедился, что проц на нужной скорости работает. Настроил бы UART. И горя не знал бы.

Это работает когда костяк программы уже есть, IRQ обрабатываются и ведется отладка прикладной части.
А когда проблемы со стартапом - отладчик, причем любой формы (эмулятор, симулятор, JTAG и т.д.), наиболее эффективный способ.
DpInRock
Не работать прерывание может по многим причинам.

Вот у меня только что не работало прерывание от кодека. Три часа искал причину. Два бубна извел.
А просто вместо числа 0x20150618 писал (методом копи-пасте из другой программы) 20150618. А это был адрес памяти.
Которой в этом десятичном месте отродясь не бывало.
И проц вполне справедливо зависал упираясь в несуществующий обработчик данного события.
aaarrr
Цитата(DpInRock @ May 17 2009, 03:53) *
Не работать прерывание может по многим причинам.

Я вижу только две:
- непонимание архитектуры (самая распространенная)
- невнимательность

Цитата(DpInRock @ May 17 2009, 03:53) *
Вот у меня только что не работало прерывание от кодека. Три часа искал причину. Два бубна извел.
А просто вместо числа 0x20150618 писал (методом копи-пасте из другой программы) 20150618. А это был адрес памяти.
Которой в этом десятичном месте отродясь не бывало.
И проц вполне справедливо зависал упираясь в несуществующий обработчик данного события.

Ну вот, а кто-то тут недавно рассказывал, как это круто - вбивать все подряд цифирьками biggrin.gif
DpInRock
ДЫк,если б руками писал, то рефлекс-то есть. А тут сторонняя программа распечатала, куда она звуковой файл запихала и я его копипастнул прям в текст, чтоб побыстрее результат получить.Чисто глянуть. Сторонние внешние программы все равно не могут работать ни с чем, кроме как с абсолютными цифирками. Или относительными, но все равн цифирками.
И как раз некотырые познания в архитектуре подвели. Я довольно быстро понял, что идет трабл по выравниванию адреса. И полез комлать ММU.
А надо было просто глазами на этот самый адрес посмотреть. А так как копи-пасте не может врать, то и глазам я верить не стал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.