|
Неудачный переход с С на С++, Расположение обработчика прерывания |
|
|
|
Mar 10 2010, 10:20
|
Частый гость
 
Группа: Участник
Сообщений: 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). Похоже что моих обработчиков компилятор неузрел. Наверное проблема изъезжена, но в хэлпе ничего не нашёл.
|
|
|
|
|
Mar 10 2010, 10:38
|
Профессионал
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 10 2010, 16:25
|

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

|
Цитата(sergeeff @ Mar 10 2010, 19:28)  У компилятора есть программные модули для компиляции и у продвинутых компиляторов - intrinsic функции (http://en.wikipedia.org/wiki/Intrinsic_function). Кроме того, у компилятора есть то, что он компилирует. Помедитируйте над этим на досуге. Цитата Вообще я не придираюсь, а стараюсь расширять ваш кругозор (для вашего профессионального блага). Вы отчего-то решили, что ваш кругозор шире, и поэтому совершенно не пытаетесь понять меня. Чем отказываете мне в здравом смысле. Пожалуйста, в следующий раз, прежде чем расширять мой кругозор, подумайте, вдруг вы просто что-то недопоняли.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 10 2010, 21:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата Кроме того, у компилятора есть то, что он компилирует. Помедитируйте над этим на досуге.. Как там у классика "Когда вы говорите, мне кажется, что вы бредите". То что компилирует компилятор, это что? Единицы компиляции, или файлы или программные модули. Народ в мире по разному их называет. И больше ничего, по крайней мере, у С/С++ компилятора нет. И над чем я должен медитировать? Над "умолчательными обработчиками", которые есть где-то там в "кроме того, что компилятор компилирует"? Функция в обработчике прерывания или есть или ее нет. Автор топика ее переназначил на свою С++ функцию. Возникает вопрос, каким это экзотическим способом, что линкер глазом не моргнул на его манипуляции и оставил эти самые пресловутые "умолчательные обработчики". Вы хотите меня убедить, что в startup'e есть функции обработки прерывания от таймера TIM2_IRQHandler, и автор прописал свою собственную точно такую функцию TIM2_IRQHandler в main, объявил ее как extern "C" и линкер не обнаруживает никакого конфликта имен? Не верю.
|
|
|
|
|
Mar 11 2010, 03:11
|

Местный
  
Группа: Свой
Сообщений: 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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|