Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не ставятся точки останова в теле прерывания.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Вячик13
Имеется IAR 6.50 для ARM. Тестовый проект для STM32F103VCT6 (почти пустой). В нём имеются файлы: main.cpp,
main.h,
startup_stm32f10x_hd.s,
stm32f10x_vector.c,
stm32f10x_it.c,
stm32f10x_it.h.

Задействовано одно прерывание - TIM3_IRQHandler.

При отладке наблюдается интересный эффект - если обработчик прерывания находится в файле main.cpp, то точки останова в его тексте ставятся и отладчик по ним останавливается. А если я его переношу в файл stm32f10x_it.c, то точки останова не ставятся и отладчик "улетает" (скорее всего при срабатывании прерывания). Такое впечатление, что обработчик при линковании не включается в код программы.

Оптимизация при компиляции отключена.

Текст обработчика:

extern "C" void TIM3_IRQHandler(void) {
TIM3_SR_bit.UIF=false; //Сброс флага прерывания таймера ADC
it=12;
ty=14;
tg=it+ty;
}

Хотя пробовал и без "extern "C" и в файле main.cpp он всё равно работает.

Почему?
esaulenka
Это симптомы "функция не включается в итоговый проект".
Что такое "отладчик улетает" ?


этот stm32f10x_it.c компилируется? линкуется? Для проверки можно написать туда тестовую функцию и вызвать её из main ().

extern "C" правильный :-) компилятор C понимать не должен, это чисто плюсовая штука. Почему IAR не ругается на её появление в c-файле, не знаю. Предлагаю убрать.
Сергей Борщ
Цитата(Вячик13 @ Sep 16 2015, 10:03) *
Хотя пробовал и без "extern "C" и в файле main.cpp он всё равно работает.
Видимо у вас в настройках среду указано "копилить весь проект как голый Си независимо от расширений файлов"
Вячик13
Цитата(Сергей Борщ @ Sep 16 2015, 10:56) *
Видимо у вас в настройках среду указано "копилить весь проект как голый Си независимо от расширений файлов"


Нет, в настройках компилятора опция "Lenguage" стоит в "C++", а опция "C++ dialect" в "Extended Embedded C++".
Сергей Борщ
Цитата(Вячик13 @ Sep 16 2015, 11:19) *
Нет, в настройках компилятора опция "Lenguage" стоит в "C++", а опция "C++ dialect" в "Extended Embedded C++".
А надо ставить что-то типа "Язык в зависимости от расширения файла". Был в старых версиях такой вариант, как в новых - не знаю, но тоже должен быть.
Вячик13
Спасибо всем. Проблема решилась. Оказывается, действительно, нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp".
Сергей Борщ
Цитата(Вячик13 @ Sep 16 2015, 13:47) *
нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp".
Ерунда какая-то. Если файл имеет расширение .c - это файл исходника на языке Си, для которого конструкция extern "C" является запрещенной. Почитайте, что такое extern "C" и поймите, как оно должно применяться: https://isocpp.org/wiki/faq/mixing-c-and-cpp
zltigo
QUOTE (Вячик13 @ Sep 16 2015, 13:47) *
Спасибо всем. Проблема решилась. Оказывается, действительно, нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp".

Собственно обработчик здесь ни причем. Это относится ко всем, ибо в С++ имена замангаливаются ввиду поддержки перегрузки функций.

P.S.
Пост отредактировал. Что-то затмение нашло sad.gif

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.