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

 
 
> Проблема компиляции обработчика прерывания. (STM+GCC)
Real_Bastard
сообщение Nov 28 2012, 11:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 7-11-06
Из: Санкт-Петербург
Пользователь №: 22 041



Контроллер STM32L151 компилятор GCC (Sourcery G++).
Есть обработчик прерывания по таймеру.
CODE
// Обработчик прерывания TIM6_DAC
void TIM6_IRQHandler(void){
if (k==0){
k=1;
GPIO_SetBit(GPIOA,1);
} else {
GPIO_ResetBit(GPIOA,1);
k=0;
}
TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем флаг UIF
}
Все отлично работает.
А вот если сброс флага вынести в отдельную функцию-начинаются проблемы.
CODE
// Обработчик прерывания TIM6_DAC
void clear_flag(void){
TIM6->SR &= ~TIM_SR_UIF; //Сбрасываем флаг UIF
}
void TIM6_IRQHandler(void){
if (k==0){
k=1;
GPIO_SetBit(GPIOA,1);
} else {
GPIO_ResetBit(GPIOA,1);
k=0;
}
clear_flag();
}

Флаг сбрасывается через раз. Естественно, зависит от оптимизации (при отключенной все хорошо).
тут у народа были похожие проблемы...
Прошу совета....

Сообщение отредактировал Real_Bastard - Nov 28 2012, 12:07
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение Nov 28 2012, 11:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Барьер ставить не пробовали?
Код
void RTC_Handler()
{
    /* Clear interrupt source */
    RTC_IntClear(RTC_IFC_COMP0);
    /* Flushing instructions to make sure that the interrupt is not re-triggered*/
    /* This may be required when the peripheral clock is slower than the core */
    __DSB();

}


PS. Ссылка не рабочая.
Go to the top of the page
 
+Quote Post
Real_Bastard
сообщение Nov 28 2012, 12:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 7-11-06
Из: Санкт-Петербург
Пользователь №: 22 041



Цитата(_Артём_ @ Nov 28 2012, 15:16) *
PS. Ссылка не рабочая.

http://electronix.ru/forum/lofiversion/index.php/t84789.html . "...Код ниже. Т.е. если очищать флаг запроса на прерывание перед самым выходом из него, то попадаем в прерывание второй раз. Не могу понять причин такого поведения...."

Цитата(KRS @ Nov 28 2012, 15:15) *
Попробуйте поставить очистку флага в начало обработчика прерывания.

Объехать на кривой козе я могу....мне бы понять логику компилятора.



Сообщение отредактировал Real_Bastard - Nov 28 2012, 12:10
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 28 2012, 12:17
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Real_Bastard @ Nov 28 2012, 16:04) *
Т.е. если очищать флаг запроса на прерывание перед самым выходом из него, то попадаем в прерывание второй раз. Не могу понять причин такого поведения...."

ЕМНИП как раз по таймерам для Cortex и была рекомендация как можно раньше сбрасывать флаг до выхода из прерывания.
Достаточно просто разместить код в начале обработчика

Цитата(Real_Bastard @ Nov 28 2012, 16:15) *
Объехать на кривой козе я могу....мне бы понять логику компилятора.

Компилятор тут не причем!
Линия прерывания не успевает сброситься! Проц работает быстрее чем периферия
Go to the top of the page
 
+Quote Post



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

 


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


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