Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странное поведение 5.10 при компиляции в C++
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
alexander55
Добрый день!
Обнаружил следующую неприятность в IAR версии 5.10.
Привожу вариант, который каждый может попробовать.

IAR С-примерчик с одним прерыванием по таймеру при выборе языка C успешно компилируется и в ARM и Thumb (и в RAM и во Flash).
Если выбрать любую вариацию C++ объектные файлы образуются, а на этапе сборки говорит, что
нет определения для вектора IRQ_ISR_Handler.
Привожу текст для RAM (под Flash аналогично) .

Building configuration: TimerInt - JLINK_RAM
Updating build tree...
Linking
Error[Li005]: no definition for "IRQ_ISR_Handler" [referenced from C:\ARM_Projects\Education\
IAR-LPC-214X\TimerInt\Project\JLINK_RAM\Obj\lpc2xxx_cstartup.o]
Error while running Linker

Total number of errors: 1
Total number of warnings: 0

Какие есть мысли.
zltigo
Цитата(alexander55 @ Sep 14 2007, 14:59) *
Какие есть мысли.

Мысли обычные - соглашения о преобразовании имен в С++ другие. IRQ_ISR_Handler() должен быть объявлен, как сишный, иначе из ASM черт ногу сломит вызывая его.
Сергей Борщ
Цитата(alexander55 @ Sep 14 2007, 14:59) *
Привожу текст для RAM (под Flash аналогично) .
....
Какие есть мысли.
Текст видать кто-то покоцал. А мысль одна: переводя слова zltigo extern "C" __arm __irq void IRQ_ISR_Handler()
{
......
}
А чтобы компилилось в обоих режимах -
Код
#include <yvals.h>
_EXTERN_C  __arm __irq void IRQ_ISR_Handler()
{
......
}
_END_EXTERN_C
насчет yvals.h - возможно в 5.10 он имеет другое название, но в предыдущих он подключается автоматически через любой из библиотечных заголовочных файлов (через тот же stdint.h)
alexander55
Удалось решить проблему следующим образом.
В startup и С модулях заменил
IRQ_ISR_Handler на IRQ_Handler.
После этого компилится нормально и С и в EC++ и в EEC++.
Я просмотрел примеры для других ARM uC там везде irq_handler и fiq_handler. У LPC (автор Стадомир Бонев - кажется, он с Olimex) часть irq_isr_handler, fiq_isr_handler, часть irq_handler, fiq_handler.
В документации IAR везде одназначно рекомендуется irq_handler, fiq_handler.

PS. Поздравляю всех с победой нашей сборной на eurobasket-2007.
zltigo
Цитата(alexander55 @ Sep 17 2007, 08:03) *
В startup и С модулях заменил
IRQ_ISR_Handler на IRQ_Handler.

Полная ерунда. Можете хоть горшком называть - что-то походя еще подправили.
alexander55
Цитата(zltigo @ Sep 17 2007, 09:37) *
Полная ерунда. Можете хоть горшком называть - что-то походя еще подправили.

Я также считал, а сейчас во всем уже сомневаюсь.

Сейчас проверил. Название важно для startup, для С может даже не совпадать со startup овским.
Там важен даже регистр, т.е. IRQ_Handler проходит, а irq_handler нет.
zltigo
Цитата(alexander55 @ Sep 17 2007, 08:58) *
а сейчас во всем уже сомневаюсь.

Отбростье сомнения, иначе следующим "логичным" шагом будет покупка бубна smile.gif. Причина была указана в первых ответах.
alexander55
"Сейчас проверил. Название важно для startup, для С может даже не совпадать со startup овским.
Там важен даже регистр, т.е. IRQ_Handler проходит, а irq_handler нет."
Кажется нашел, ответы на стр.31-32 DevelopmentGuide.pdf. Как ни странно, совпало с моими субъективными ощущениями.
zltigo
Цитата(alexander55 @ Sep 17 2007, 09:28) *
Там важен даже регистр, т.е. IRQ_Handler проходит, а irq_handler нет."

Удивительно-то как! Оказывается в 'C' важен регистр, удивление мое не знает границ smile.gif
Цитата
Кажется нашел, ответы на стр.31-32 DevelopmentGuide.pdf. Как ни странно, совпало с моими субъективными ощущениями.

Повторяю, мне неведомо, что Вы там шаманите, какой startup редактируете, какой ассемблируете и какой в конце концов линкуете, и уж что такое в DevelopmentGuide.pdf страшное могли вычитать, но имя функции обработчика прерывания может быть любым.
alexander55
Цитата(zltigo @ Sep 17 2007, 10:45) *
но имя функции обработчика прерывания может быть любым.

Да это так, но не в startup.
zltigo
Цитата(alexander55 @ Sep 17 2007, 09:59) *
Да это так, но не в startup.

Все, больше слов нет sad.gif.
Срочно покупайте бубен, для дальнейшей "программерской деятельности" он Вам очень поможет.
alexander55
Цитата(zltigo @ Sep 17 2007, 11:10) *
Все, больше слов нет sad.gif.
Срочно покупайте бубен, для дальнейшей "программерской деятельности" он Вам очень поможет.

Купил бубен и продолжил исследование. Для меня истина дороже.
В результате шаманской деятельности все выяснил.
При компиляции в EC++ и EEC++ пропадает (бесследно)
__vector_0x14: DC32 0 ; RESERVED
При компиляции в C все ОК.
Выключены все оптимизации.

Выход, как всегда, есть. Но интересны соображения уважаемых коллег.
alexander55
Спасибо всем (Zltogo и особенно Сергею Борщ). Все работает.
Я уже такого накрутил, что сам запутался.
Ключевой момент это
_EXTERN_C __arm __irq void IRQ_ISR_Handler()
{
......
}
_END_EXTERN_C

PS. Прошу не расстреливать за паникерство.
IgorKossak
Цитата(alexander55 @ Sep 19 2007, 14:39) *
PS. Прошу не расстреливать за паникерство.

Наоборот, обьявляю благодарность за терпимость, самокритичность и чувство юмора! a14.gif
alexander55
Цитата(IgorKossak @ Sep 19 2007, 21:24) *
Наоборот, обьявляю благодарность за терпимость, самокритичность и чувство юмора! a14.gif

Спасибо, приятно когда тебя понимают.
alexander55
Цитата(alexander55 @ Sep 19 2007, 15:39) *
Ключевой момент это
_EXTERN_C __arm __irq void IRQ_ISR_Handler()
{
......
}
_END_EXTERN_C

Занимаясь другим вопросом случайно увидел в документации на 5.10, что рекомендуют
extern "C"
Проверил, работает без вопросов.
dxp
Цитата(alexander55 @ Sep 24 2007, 11:47) *
Занимаясь другим вопросом случайно увидел в документации на 5.10, что рекомендуют
extern "C"
Проверил, работает без вопросов.

А не про это ли написал Сергей Борщ в посте #3? smile.gif
alexander55
Цитата(dxp @ Sep 24 2007, 10:04) *
А не про это ли написал Сергей Борщ в посте #3? smile.gif

Слона то я и не заметил (Крылов).
Сергей Борщ
Цитата(alexander55 @ Sep 24 2007, 12:31) *
Слона то я и не заметил (Крылов).
Зато достигнутое упорным трудом запоминается лучше smile.gif
alexander55
Цитата(Сергей Борщ @ Sep 24 2007, 14:18) *
Зато достигнутое упорным трудом запоминается лучше smile.gif

Повторение - мать учения (поговорка).
Новое - хорошо забытое старое (афоризм).
И для дуализма.
История нас учит тому, что ни чему не учит (афоризм).

PS.
TMen *ptr;
ptr=& S_Borshch;
ptr->Rating++;
ptr->Summary++;
ptr-& Alexander55;
ptr->IQ++;

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