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

 
 
 
Closed TopicStart new topic
> Не ставятся точки останова в теле прерывания.
Вячик13
сообщение Sep 16 2015, 07:03
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604



Имеется 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 он всё равно работает.

Почему?
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Sep 16 2015, 07:39
Сообщение #2


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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


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

extern "C" правильный :-) компилятор C понимать не должен, это чисто плюсовая штука. Почему IAR не ругается на её появление в c-файле, не знаю. Предлагаю убрать.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 16 2015, 07:56
Сообщение #3


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
Вячик13
сообщение Sep 16 2015, 08:19
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604



Цитата(Сергей Борщ @ Sep 16 2015, 10:56) *
Видимо у вас в настройках среду указано "копилить весь проект как голый Си независимо от расширений файлов"


Нет, в настройках компилятора опция "Lenguage" стоит в "C++", а опция "C++ dialect" в "Extended Embedded C++".
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 16 2015, 09:37
Сообщение #5


Гуру
******

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



Цитата(Вячик13 @ Sep 16 2015, 11:19) *
Нет, в настройках компилятора опция "Lenguage" стоит в "C++", а опция "C++ dialect" в "Extended Embedded C++".
А надо ставить что-то типа "Язык в зависимости от расширения файла". Был в старых версиях такой вариант, как в новых - не знаю, но тоже должен быть.


--------------------
На любой вопрос даю любой ответ
"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
Вячик13
сообщение Sep 16 2015, 10:47
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604



Спасибо всем. Проблема решилась. Оказывается, действительно, нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp".
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 16 2015, 11:18
Сообщение #7


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Sep 16 2015, 11:27
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (Вячик13 @ Sep 16 2015, 13:47) *
Спасибо всем. Проблема решилась. Оказывается, действительно, нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp".

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

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



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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