|
С++ Объявить вариантное перечисление., Шаблонами. |
|
|
|
Jul 1 2013, 10:49
|

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

|
Есть у меня файл, типа spi.h, в нём - перечисление всех имеющихся SPI: Код enum SpiNum { SPI_1, #if (SPI_COUNT>1) SPI_2, #elif (SPI_COUNT>2) SPI_3 #endif }; Захотелось мне избавиться от дефайнов, и переделать это на шаблоны. Делаю так: Код template<int SPI_Count> struct SpiEnumTraits; template<> struct SpiEnumTraits<1> { enum SpiNum { SPI_1 }; }; template<> struct SpiEnumTraits<2> { enum SpiNum { SPI_1, SPI_2 }; }; template<> struct SpiEnumTraits<3> { enum SpiNum { SPI_1, SPI_2, SPI_3 }; }; template<> struct SpiEnumTraits<4> { enum SpiNum { SPI_1, SPI_2, SPI_3, SPI_4 }; };
typedef typename SpiEnumTraits<chip::spi_count>::SpiNum SpiNum; На саму эту конструкцию компилятор не ругается, а вот на любые упоминания в тексте программы элементов перечисления (SPI_1 и т. д.) - ругается, мол, символ неопределён. Видимо, я что-то делаю неправильно, но вот что?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 1 2013, 18:50
|

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

|
Это я уже от безысходности добавил. И без typename - тоже не работает. На собственно тип SpiNum - не ругается, вот это объявление проглатывает нормально: Код template<SpiNum spiNum> struct SpiPins; А на элементы перечисления SpiNum - ругается. Вот тут например: Код template<> struct SpiPins<SPI_1> { typedef Pin<'A', 5> PinSCK; ... - говорит, мол, "error: ‘SPI_1’ was not declared in this scope". scope - тот же файл, никаких namespace-ов, ничего. Забыл написать, компилятор - gcc ( arm-embedded, если точнее).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 2 2013, 08:29
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(AHTOXA @ Jul 1 2013, 14:49)  Делаю так: Код template<int SPI_Count> struct SpiEnumTraits; template<> struct SpiEnumTraits<1> { enum SpiNum { SPI_1 }; }; typedef typename SpiEnumTraits<chip::spi_count>::SpiNum SpiNum; На саму эту конструкцию компилятор не ругается, а вот на любые упоминания в тексте программы элементов перечисления (SPI_1 и т. д.) - ругается, мол, символ неопределён. Правильно ругается - у вас enum получился локальным в классе, а typedef наружу вынес сам enum, а не его элементы. Делайте так Код typedef SpiEnumTraits<chip::spi_count> SPI;
... SPI::SPI_1 ...
|
|
|
|
|
Jul 2 2013, 08:51
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(AHTOXA @ Jul 2 2013, 12:49)  Так я тоже пробовал, и это тоже не работает: Код if (spiNum == SpiNum::SPI_1) ... error: 'SpiNum' is not a class or namespace.  SpiNum должен быть typedef'ом на весь класс, а не на его внутренний enum
|
|
|
|
|
Jul 5 2013, 19:29
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(AHTOXA @ Jul 1 2013, 14:49)  Код enum SpiNum { SPI_1, #if (SPI_COUNT>1) SPI_2, #elif (SPI_COUNT>2) SPI_3 #endif }; Как-то сама идея выглядит не очень. А если в контроллере есть SPI1 и SPI3, но отсутствует SPI2?
|
|
|
|
|
Apr 11 2015, 07:25
|

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

|
Недавно вернулся к этой теме, но немного по другому поводу. Повод такой: бывает так, что, в зависимости от номера периферийного модуля, он может иметь разные свойства. Например, каждый канал DMA на STM32L0xx может быть подключен только к определённому перечню периферийных устройств. (Канал 1 может быть подключен к ADC, TIM2_CH3 и AES_IN, канал 2 - к SPI2_RX, USART2_RX, LPUART1_RX и I2C1_TX. И так далее). Хотелось иметь у каждого канала функцию SelectChannel(), которая бы принимала в качестве аргумента только допустимые для данного канала значения. И я решил посмотреть, не поможет ли тут C++11. Вот что получилось. Объявляем шаблонный класс свойств канала: Код template<DmaChannelNum chNum> struct DmaChannelTraits; Определяем свойства для каждого канала: Код template<> struct DmaChannelTraits<DMA1_CH1> { enum { CHANNEL_NO = 1 }; enum { CSELR_SHIFT = (CHANNEL_NO-1)*4 }; enum class ChannelSelection : uint32_t // possible CSELR values { CH_SEL_ADC = (0x00 << CSELR_SHIFT), CH_SEL_TIM2_CH3 = (0x08 << CSELR_SHIFT), CH_SEL_AES_IN = (0x0B << CSELR_SHIFT), CH_SEL_MASK = (0x0F << CSELR_SHIFT), }; }; И так для всех каналов: Код template<> struct DmaChannelTraits<DMA1_CH6> { enum { CHANNEL_NO = 1 }; enum { CSELR_SHIFT = (CHANNEL_NO-1)*4 }; enum class ChannelSelection : uint32_t // possible CSELR values { CH_SEL_SPI2_RX = (0x02 << CSELR_SHIFT), CH_SEL_USART2_RX = (0x04 << CSELR_SHIFT), CH_SEL_LPUART1_RX = (0x05 << CSELR_SHIFT), CH_SEL_I2C1_TX = (0x06 << CSELR_SHIFT), CH_SEL_MASK = (0x0F << CSELR_SHIFT), }; }; И затем, уже в шаблоне канала: Код template<DmaChannelNum chNum> class DmaChannel { private: typedef DmaChannelTraits<chNum> ChannelTraits; public: using ChannelSelection = typename ChannelTraits::ChannelSelection; static void SelectChannel(ChannelSelection cs) { DMA->CSELR = (DMA->CSELR & ~static_cast<uint32_t>(ChannelSelection::CH_SEL_MASK)) | static_cast<uint32_t>(cs); } } Теперь, если мы попробуем выбрать для канала неверный источник: Код typedef DmaChannel<DMA1_CH1> Dma1Channel1; Dma1Channel1::SelectChannel(Dma1Channel1::ChannelSelection::CH_SEL_SPI2_RX); ,то получим ошибку времени компиляции. Кроме того, парсер эклипсы настолько умён, что в автоподстановке показывает правильные возможные значения для параметра. ЗЫ. Результат целиком можно посмотреть здесь.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 30 2015, 10:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(AHTOXA @ Apr 11 2015, 10:25)  Недавно вернулся к этой теме, но немного по другому поводу. ЗЫ. Результат целиком можно посмотреть здесь. Во-первых, спасибо. Получилось довольно аккуратно, микро-классы для пинов - вообще отличные. А во-вторых, как всем этим пользоваться? Код namespace STM32 { namespace SPI {
struct SpiProps { static const SpiNum NUMBER = SPI_1; static const Remap REMAP = REMAP_NONE; static const Divisor InitialDivisor = SPI_DIV_2; static const Cpol InitialCPOL = CPOL_L; static const Cpha InitialCPHA = CPHA_1; }; } }
STM32::SPI::Spi<STM32::SPI::SpiProps> MySPI; Работает, но выглядит некрасиво. Сделать using namespace не получилось - почему-то из области видимости пропадают enum'ы. Цитата(AHTOXA @ Apr 11 2015, 10:25)  Кроме того, парсер эклипсы настолько умён, что в автоподстановке показывает правильные возможные значения для параметра. Это тоже не работает, даже в вышеприведённом варианте - предлагает всё подряд. Где-то есть галка?
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Apr 30 2015, 11:08
|

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

|
Цитата(esaulenka @ Apr 30 2015, 15:33)  Во-первых, спасибо. Получилось довольно аккуратно, микро-классы для пинов - вообще отличные. Пожалуйста. Рад, что пригодилось. Цитата(esaulenka @ Apr 30 2015, 15:33)  А во-вторых, как всем этим пользоваться? Ну, я так и пользуюсь: Код struct AdcSpiProps { static const STM32::SPI::SpiNum NUMBER = STM32::SPI::SPI_1; static const STM32::SPI::Remap REMAP = STM32::SPI::REMAP_FULL; static const STM32::SPI::Divisor InitialDivisor = STM32::SPI::SPI_DIV_2; static const STM32::SPI::Cpol InitialCPOL = STM32::SPI::CPOL_H; static const STM32::SPI::Cpha InitialCPHA = STM32::SPI::CPHA_1; };
typedef STM32::SPI::Spi<AdcSpiProps> SpiAdc; extern SpiAdc spiAdc; - это в файле hw.h. Там я описываю всю периферию проекта. К нему есть файл hw.cpp - там объявляю переменные периферийных модулей и прописываю обработчики прерываний. Необходимость писать везде STM32::SPI:: конечно немного напрягает, но я к этому отношусь как к этапу конфигурирования проекта, который делается только один раз, в самом начале. Зато эти имена гарантированно не пересекутся с именами ST. Цитата(esaulenka @ Apr 30 2015, 15:33)  Это тоже не работает, даже в вышеприведённом варианте - предлагает всё подряд. Где-то есть галка? Ещё раз проверил, работает. Вот картинка:
Возможно, у вас не натроен поиск инклюдов в эклипсе. Посмотрите вот эту тему: тынц.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 30 2015, 12:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Это некорректный пример, так у меня тоже работает :-) Ведь если "CH_SEL_" затереть, там появится ещё с полсотни вариантов.
У меня, правда, в обратном порядке всё работает - проект конфигурируется галками, и эклипс сам генерирует make-файлы. Какой-то супер-гибкости мне не надо, а потешить самолюбие (я тут всё контролирую!) и так можно - make-файлы лежат себе на видном месте.
Я просто думал, что есть какая-то галка, чтобы эклипс подставлял для enum'а только значения, которые в нём разрешены. Ну, нет так нет...
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Apr 30 2015, 20:01
|

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

|
Цитата(esaulenka @ Apr 30 2015, 17:54)  Это некорректный пример, так у меня тоже работает :-) Ведь если "CH_SEL_" затереть, там появится ещё с полсотни вариантов. У меня нет никаких полусотни вариантов  CH_SEL_ Появляется само, потому что это общая часть среди всех имеющихся вариантов. То есть, если я напишу вот так: Код #include "stm32_dma.h"
void Test() { typedef STM32::DMA::Dma1Channel1 DmaCh; DmaCh::SelectChannel(DmaCh::ChannelSelection:: } , помещу курсор после двоеточия, и нажму Ctrl+Space, то эклипса сама дописывает "CH_SEL_", и выдаёт строго то, что нужно. Если не нажимать Ctrl+Space, а немного подождать, то CH_SEL_ не появляется, и варианты выдаются целиком. Но тоже строго те, которые надо. Вот, записал мультик:
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 7 2015, 12:58
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
С автодополнением я понял, почему у меня не работает. Он показывает всё, что есть в текущей области видимости. При моём способе объявления она куда больше - туда в т.ч. попадают все объекты, которые имеют глобальную область видимости. Переписал на явное указание области, стало приятнее:
За мультик спасибо :-) У меня теперь другой вопрос, слегка поважнее. В прошлый раз как-то просмотрел, что дебаг-версия прошивки увеличилась аж на 40 килобайт. Эффект проявляется при добавлении в проект этих строк: Код struct SpiProps { static const STM32::SPI::SpiNum NUMBER = STM32::SPI::SPI_1; static const STM32::SPI::Remap REMAP = STM32::SPI::REMAP_NONE; static const STM32::SPI::Divisor InitialDivisor = STM32::SPI::SPI_DIV_2; // BusClk = 9 MHz, SPI clock = 4.5 MHz static const STM32::SPI::Cpol InitialCPOL = STM32::SPI::CPOL_L; static const STM32::SPI::Cpha InitialCPHA = STM32::SPI:: };
STM32::SPI::Spi<SpiProps> AccSPI; Что особенно непонятно, эти +40кило появляются только с опцией компилятора -Og. Все остальные уровни оптимизации (-O1, -O2, -O3, -Os) работают нормально, размер бинарника возрастает на адекватную величину. Сравнение map'ов показывает появление следующих функций при добавлении класса SPI: CODE .text 0x08004168 0x88c0 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libstdc++_nano.a(cp-demangle.o) 0x0800c944 __cxa_demangle 0x0800ca04 __gcclibcxx_demangle_callback .text 0x0800ca28 0x14 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-strcmp.o) 0x0800ca28 strcmp
.text.sprintf 0x0800d34c 0x20 ./Libraries/printf-stdarg.o 0x0800d34c sprintf .text._exit 0x0800d36c 0x4 ./Libraries/syscalls.o 0x0800d36c _exit .text._close 0x0800d370 0x8 ./Libraries/syscalls.o 0x0800d370 _close .text._fstat 0x0800d378 0xc ./Libraries/syscalls.o 0x0800d378 _fstat .text._getpid 0x0800d384 0x4 ./Libraries/syscalls.o 0x0800d384 _getpid .text._isatty 0x0800d388 0x18 ./Libraries/syscalls.o 0x0800d388 _isatty .text._kill 0x0800d3a0 0x10 ./Libraries/syscalls.o 0x0800d3a0 _kill .text._lseek 0x0800d3b0 0x4 ./Libraries/syscalls.o 0x0800d3b0 _lseek .text._sbrk 0x0800d3b4 0x3c ./Libraries/syscalls.o 0x0800d3b4 _sbrk .text._read 0x0800d3f0 0x34 ./Libraries/syscalls.o 0x0800d3f0 _read .text._write 0x0800d424 0x4c ./Libraries/syscalls.o 0x0800d424 _write
.text._ZN5STM323SPI3SpiINS0_8SpiPropsEE5BufRwEPhPKhj 0x0800e750 0xbc ./Drivers/Accelerometer.o 0x0800e750 STM32::SPI::Spi<STM32::SPI::SpiProps>::BufRw(unsigned char*, unsigned char const*, unsigned int)
.text._ZN5STM323SPI3SpiINS0_8SpiPropsEE6HwInitEv 0x0800e860 0x58 ./Drivers/Accelerometer.o 0x0800e860 STM32::SPI::Spi<STM32::SPI::SpiProps>::HwInit() .text._Z41__static_initialization_and_destruction_0ii 0x0800e8b8 0x34 ./Drivers/Accelerometer.o .text._GLOBAL__sub_I_AccSPI 0x0800e8ec 0x10 ./Drivers/Accelerometer.o
.text._ZN10__cxxabiv111__terminateEPFvvE 0x0800f064 0x8 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libstdc++_nano.a(eh_terminate.o) 0x0800f064 __cxxabiv1::__terminate(void (*)()) .text._ZSt13get_terminatev 0x0800f06c 0x10 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libstdc++_nano.a(eh_terminate.o) 0x0800f06c std::get_terminate() .text._ZSt9terminatev 0x0800f07c 0xa c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libstdc++_nano.a(eh_terminate.o) 0x0800f07c std::terminate() *fill* 0x0800f086 0x2 .text._ZN9__gnu_cxx27__verbose_terminate_handlerEv 0x0800f088 0x98 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libstdc++_nano.a(vterminate.o) 0x0800f088 __gnu_cxx::__verbose_terminate_handler() .text.__cxa_current_exception_type 0x0800f120 0x1a c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libstdc++_nano.a(eh_type.o) 0x0800f120 __cxa_current_exception_type *fill* 0x0800f13a 0x2 .text.__cxa_get_globals 0x0800f13c 0x8 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libstdc++_nano.a(eh_globals.o) 0x0800f13c __cxa_get_globals .text.abort 0x0800f144 0xe c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-abort.o) 0x0800f144 abort *fill* 0x0800f152 0x2 .text._fputs_r 0x0800f154 0xa8 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-fputs.o) 0x0800f154 _fputs_r .text.fputs 0x0800f1fc 0x14 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-fputs.o) 0x0800f1fc fputs
.text.realloc 0x0800f258 0x14 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-realloc.o) 0x0800f258 realloc .text._raise_r 0x0800f26c 0x50 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-signal.o) 0x0800f26c _raise_r .text.raise 0x0800f2bc 0x10 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-signal.o) 0x0800f2bc raise .text._kill_r 0x0800f2cc 0x24 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-signalr.o) 0x0800f2cc _kill_r .text._getpid_r 0x0800f2f0 0x4 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-signalr.o) 0x0800f2f0 _getpid_r
.text.__swbuf_r 0x0800f338 0xa8 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-wbuf.o) 0x0800f338 __swbuf_r .text.__swsetup_r 0x0800f3e0 0xd8 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-wsetup.o) 0x0800f3e0 __swsetup_r .text.__sflush_r 0x0800f4b8 0x106 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-fflush.o) 0x0800f4b8 __sflush_r *fill* 0x0800f5be 0x2 .text._fflush_r 0x0800f5c0 0x54 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-fflush.o) 0x0800f5c0 _fflush_r .text._cleanup_r 0x0800f614 0xc c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-findfp.o) 0x0800f614 _cleanup_r .text.std.isra.0 0x0800f620 0x48 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-findfp.o) .text.__sfmoreglue 0x0800f668 0x2c c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-findfp.o) 0x0800f668 __sfmoreglue .text.__sinit 0x0800f694 0x60 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-findfp.o) 0x0800f694 __sinit .text.__sfp 0x0800f6f4 0x74 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-findfp.o) 0x0800f6f4 __sfp .text._fwalk_reent 0x0800f768 0x3c c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-fwalk.o) 0x0800f768 _fwalk_reent .text.__smakebuf_r 0x0800f7a4 0x98 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-makebuf.o) 0x0800f7a4 __smakebuf_r .text._free_r 0x0800f83c 0x88 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-nano-freer.o) 0x0800f83c _free_r .text._malloc_r 0x0800f8c4 0xac c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-nano-mallocr.o) 0x0800f8c4 _malloc_r .text._realloc_r 0x0800f970 0x4c c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-nano-reallocr.o) 0x0800f970 _realloc_r .text._sbrk_r 0x0800f9bc 0x20 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-sbrkr.o) 0x0800f9bc _sbrk_r .text.__sread 0x0800f9dc 0x22 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-stdio.o) 0x0800f9dc __sread .text.__swrite 0x0800f9fe 0x38 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-stdio.o) 0x0800f9fe __swrite .text.__sseek 0x0800fa36 0x24 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-stdio.o) 0x0800fa36 __sseek .text.__sclose 0x0800fa5a 0x8 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-stdio.o) 0x0800fa5a __sclose *fill* 0x0800fa62 0x2 .text._write_r 0x0800fa64 0x24 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-writer.o) 0x0800fa64 _write_r .text._close_r 0x0800fa88 0x20 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-closer.o) 0x0800fa88 _close_r .text._fstat_r 0x0800faa8 0x24 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-fstatr.o) 0x0800faa8 _fstat_r .text._isatty_r 0x0800facc 0x20 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-isattyr.o) 0x0800facc _isatty_r .text._lseek_r 0x0800faec 0x24 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-lseekr.o) 0x0800faec _lseek_r .text._malloc_usable_size_r 0x0800fb10 0x14 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-nano-msizer.o) 0x0800fb10 _malloc_usable_size_r .text._read_r 0x0800fb24 0x24 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libg_nano.a(lib_a-readr.o) 0x0800fb24 _read_r *(.rodata) .rodata 0x0800fb48 0x738 c:/program files/gnu tools arm embedded/4.9 2015q1/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv7-m\libstdc++_nano.a(cp-demangle.o)
Аналогично, эти функции пропадают при включении оптимизации (там, правда, сложнее понять - меняется размер всех функций, и линкер зачем-то меняет порядок сборки). Что это?!
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
May 7 2015, 18:39
|

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

|
Цитата(esaulenka @ May 7 2015, 17:58)  Что это?! Такое случается, когда компилятор подтягивает обработку исключений. Почему он это делает - каждый раз загадка  В данном случае, насколько я могу судить, подключилась раскрутка стека (и деманглинг имён). Добавьте ключи g++: -fno-exceptions -fno-rtti. (Бывает, что обработка исключений подтягивается и с этими ключами. Тогда может помочь файлик из этого сообщения). ЗЫ. Чтобы быстрее отлавливать такие случаи, я применяю ключ линкера -nostartfiles. В этом случае он просто не находит все эти добавочные функции, и обламывается при линковке.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 8 2015, 06:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
О, спасибо большое. Хватило одной __cxa_pure_virtual(). На хабре, кстати, довольно подробно расписано, что это такое: http://habrahabr.ru/post/149683/. Всем, кто на эти грабли наступит, рекомендую :-) PS -fno-exceptions и -fno-rtti установлены, не помогают.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|