|
|
  |
Не ставятся точки останова в теле прерывания. |
|
|
|
Sep 16 2015, 07:03
|
Участник

Группа: Участник
Сообщений: 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 он всё равно работает.
Почему?
|
|
|
|
|
Sep 16 2015, 08:19
|
Участник

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

|
Цитата(Сергей Борщ @ Sep 16 2015, 10:56)  Видимо у вас в настройках среду указано "копилить весь проект как голый Си независимо от расширений файлов" Нет, в настройках компилятора опция "Lenguage" стоит в "C++", а опция "C++ dialect" в "Extended Embedded C++".
|
|
|
|
|
Sep 16 2015, 10:47
|
Участник

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

|
Спасибо всем. Проблема решилась. Оказывается, действительно, нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp".
|
|
|
|
|
Sep 16 2015, 11:18
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Sep 16 2015, 11:27
|

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

|
QUOTE (Вячик13 @ Sep 16 2015, 13:47)  Спасибо всем. Проблема решилась. Оказывается, действительно, нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp". Собственно обработчик здесь ни причем. Это относится ко всем, ибо в С++ имена замангаливаются ввиду поддержки перегрузки функций. P.S. Пост отредактировал. Что-то затмение нашло
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|