Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неудачный переход с С на С++
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
baralgin
Решил перевести проект с С на С++, код писался аккуратно поэтому появилось совсем немного несоответствий (типа TRUE->true). Но программа не работает. Проект пишется одновременно в Keil и IAR. Отладка показывает что код зацикливается в недрах старап-файла на этапе инициализации переферии. В Keil  

Код
...</P><P>DMA2_Channel4_5_IRQHandler
                B       .

                ENDP

                ALIGN


И в IAR:

Код
...</P><P>TIM2_IRQHandler
        B TIM2_IRQHandler


TIM2_IRQHandler расположен в main.cpp (там же и прерывание от DMA). Похоже что моих обработчиков компилятор неузрел. Наверное проблема изъезжена, но в хэлпе ничего не нашёл.
sergeeff
Чтобы в ассемблерной части программы вы могли использовать функции из С++ надо их объявить как:
extern "C" ....

Обычно в .h файлах делают обертку из:

Код
#ifdef __cplusplus
extern "C" {
#endif

....


#ifdef __cplusplus
}
#endif


Почитайте про это, например, тут:

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
baralgin
Спасибо, обьявление как extern "C" помогло. Странно, почему компилятор не ругается.
AHTOXA
Цитата(baralgin @ Mar 10 2010, 16:19) *
Странно, почему компилятор не ругается.

Потому что у него есть умолчательные обработчики прерываний.
jorikdima
Цитата(AHTOXA @ Mar 10 2010, 14:40) *
Потому что у него есть умолчательные обработчики прерываний.

ЭЭЭ, это в каком таком компиляторе и под какую платформу?
sergeeff
Про "умолчательные обработчики прерываний" - это сильный тезис! Приз в студию!

А на счет диагностики. По идее должен был бы линкер ругаться, на отсутствующие функции. Может не разглядели его сообщения. Они после компиляции появляются.
baralgin
Да нет, линкер не ругался и исправно генерил код. Это действительно больше похоже на "умолчательные обработчики" (Default_Handler в моём startup_stm32f10x_hd.s).
sergeeff
Тем не менее "умолчательные обработчики" - это обычные функции, сидящие в вашем startup файле (еще надо сильно подумать, хорош ли ваш startup) и не имеющие никакого отношения к компилятору.
AHTOXA
Цитата(sergeeff @ Mar 10 2010, 18:00) *
Тем не менее "умолчательные обработчики" - это обычные функции, сидящие в вашем startup файле (еще надо сильно подумать, хорош ли ваш startup) и не имеющие никакого отношения к компилятору.


Хорошо, я напишу более развёрнуто:
Потому что у компилятора есть "умолчательные обработчики" из стартапа. Так нормально, или есть ещё к чему придраться? smile.gif
sergeeff
Цитата(AHTOXA @ Mar 10 2010, 17:50) *
Хорошо, я напишу более развёрнуто:
Потому что у компилятора есть "умолчательные обработчики" из стартапа. Так нормально, или есть ещё к чему придраться? smile.gif


У компилятора есть программные модули для компиляции и у продвинутых компиляторов - intrinsic функции (http://en.wikipedia.org/wiki/Intrinsic_function).

Вообще я не придираюсь, а стараюсь расширять ваш кругозор (для вашего профессионального блага).
AHTOXA
Цитата(sergeeff @ Mar 10 2010, 19:28) *
У компилятора есть программные модули для компиляции и у продвинутых компиляторов - intrinsic функции (http://en.wikipedia.org/wiki/Intrinsic_function).


Кроме того, у компилятора есть то, что он компилирует. Помедитируйте над этим на досуге.

Цитата
Вообще я не придираюсь, а стараюсь расширять ваш кругозор (для вашего профессионального блага).


Вы отчего-то решили, что ваш кругозор шире, и поэтому совершенно не пытаетесь понять меня. Чем отказываете мне в здравом смысле.
Пожалуйста, в следующий раз, прежде чем расширять мой кругозор, подумайте, вдруг вы просто что-то недопоняли.
sergeeff
Цитата
Кроме того, у компилятора есть то, что он компилирует. Помедитируйте над этим на досуге..


Как там у классика "Когда вы говорите, мне кажется, что вы бредите".

То что компилирует компилятор, это что? Единицы компиляции, или файлы или программные модули. Народ в мире по разному их называет. И больше ничего, по крайней мере, у С/С++ компилятора нет.

И над чем я должен медитировать? Над "умолчательными обработчиками", которые есть где-то там в "кроме того, что компилятор компилирует"?

Функция в обработчике прерывания или есть или ее нет. Автор топика ее переназначил на свою С++ функцию. Возникает вопрос, каким это экзотическим способом, что линкер глазом не моргнул на его манипуляции и оставил эти самые пресловутые "умолчательные обработчики". Вы хотите меня убедить, что в startup'e есть функции обработки прерывания от таймера TIM2_IRQHandler, и автор прописал свою собственную точно такую функцию TIM2_IRQHandler в main, объявил ее как extern "C" и линкер не обнаруживает никакого конфликта имен? Не верю.
shreck
Цитата(sergeeff @ Mar 11 2010, 05:33) *
Вы хотите меня убедить, что в startup'e есть функции обработки прерывания от таймера TIM2_IRQHandler...

Да, есть.


Цитата(sergeeff @ Mar 11 2010, 05:33) *
... и автор прописал свою собственную точно такую функцию TIM2_IRQHandler в main, объявил ее как extern "C" и линкер не обнаруживает никакого конфликта имен? Не верю.

Да, не обнаруживает конфликта. Потому что в startup файле имена функций обработчиков объявлены как weak.
sergeeff
Да уж, чего только не по напридумывают.
AHTOXA
Цитата(sergeeff @ Mar 11 2010, 14:33) *
Да уж, чего только не по напридумывают.


Это можно воспринимать как извинения? smile.gif

Вообще-то, (это к вопросу о кругозоре), Weak symbols - это один из ключевых механизмов в Си. В частности, именно благодаря ему возможно написать свой putchar() вместо умолчательного.
sergeeff
Цитата(AHTOXA @ Mar 11 2010, 14:49) *
Это можно воспринимать как извинения? smile.gif

Вообще-то, (это к вопросу о кругозоре), Weak symbols - это один из ключевых механизмов в Си. В частности, именно благодаря ему возможно написать свой putchar() вместо умолчательного.


Приношу свои извинения. Тем не менее, согласитесь, сложновато обсуждать текст неопубликованного модуля. Механизм weak, может и ключевой, но не стандартный, например в MS VS2008 его нет, и в МS2010 его тоже не планируют. Во-вторых, меня всегда настораживает, когда:
1. Нет никакой диагностики ни на этапе компиляции, ни на этапе сборки проекта, что ты не определил какую либо функцию (глобальную переменную).
2. Программа выполняет не то, что ты написал, а то, что подразумевал какой-то дядя. Это требует наличия очень хорошей документации на программный продукт или кучи времени, на изучение исходных текстов.
3. Автор топика ни словом про weak функции не обмолвился.

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