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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Неудачный переход с С на С++, Расположение обработчика прерывания
baralgin
сообщение Mar 10 2010, 10:20
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Решил перевести проект с С на С++, код писался аккуратно поэтому появилось совсем немного несоответствий (типа 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). Похоже что моих обработчиков компилятор неузрел. Наверное проблема изъезжена, но в хэлпе ничего не нашёл.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 10 2010, 10:38
Сообщение #2


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Чтобы в ассемблерной части программы вы могли использовать функции из С++ надо их объявить как:
extern "C" ....

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

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

....


#ifdef __cplusplus
}
#endif


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

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html
Go to the top of the page
 
+Quote Post
baralgin
сообщение Mar 10 2010, 11:19
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Спасибо, обьявление как extern "C" помогло. Странно, почему компилятор не ругается.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 10 2010, 11:40
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(baralgin @ Mar 10 2010, 16:19) *
Странно, почему компилятор не ругается.

Потому что у него есть умолчательные обработчики прерываний.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Mar 10 2010, 12:24
Сообщение #5


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



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

ЭЭЭ, это в каком таком компиляторе и под какую платформу?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 10 2010, 12:30
Сообщение #6


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

А на счет диагностики. По идее должен был бы линкер ругаться, на отсутствующие функции. Может не разглядели его сообщения. Они после компиляции появляются.
Go to the top of the page
 
+Quote Post
baralgin
сообщение Mar 10 2010, 12:48
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Да нет, линкер не ругался и исправно генерил код. Это действительно больше похоже на "умолчательные обработчики" (Default_Handler в моём startup_stm32f10x_hd.s).
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 10 2010, 13:00
Сообщение #8


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Тем не менее "умолчательные обработчики" - это обычные функции, сидящие в вашем startup файле (еще надо сильно подумать, хорош ли ваш startup) и не имеющие никакого отношения к компилятору.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 10 2010, 13:50
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Mar 10 2010, 18:00) *
Тем не менее "умолчательные обработчики" - это обычные функции, сидящие в вашем startup файле (еще надо сильно подумать, хорош ли ваш startup) и не имеющие никакого отношения к компилятору.


Хорошо, я напишу более развёрнуто:
Потому что у компилятора есть "умолчательные обработчики" из стартапа. Так нормально, или есть ещё к чему придраться? smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 10 2010, 14:28
Сообщение #10


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


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

Вообще я не придираюсь, а стараюсь расширять ваш кругозор (для вашего профессионального блага).
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 10 2010, 16:25
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


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

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


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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 10 2010, 21:33
Сообщение #12


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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


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

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

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

Функция в обработчике прерывания или есть или ее нет. Автор топика ее переназначил на свою С++ функцию. Возникает вопрос, каким это экзотическим способом, что линкер глазом не моргнул на его манипуляции и оставил эти самые пресловутые "умолчательные обработчики". Вы хотите меня убедить, что в startup'e есть функции обработки прерывания от таймера TIM2_IRQHandler, и автор прописал свою собственную точно такую функцию TIM2_IRQHandler в main, объявил ее как extern "C" и линкер не обнаруживает никакого конфликта имен? Не верю.
Go to the top of the page
 
+Quote Post
shreck
сообщение Mar 11 2010, 03:11
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(sergeeff @ Mar 11 2010, 05:33) *
Вы хотите меня убедить, что в startup'e есть функции обработки прерывания от таймера TIM2_IRQHandler...

Да, есть.


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

Да, не обнаруживает конфликта. Потому что в startup файле имена функций обработчиков объявлены как weak.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 11 2010, 09:33
Сообщение #14


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Да уж, чего только не по напридумывают.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 11 2010, 11:49
Сообщение #15


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sergeeff @ Mar 11 2010, 14:33) *
Да уж, чего только не по напридумывают.


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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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