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

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


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

Группа: Свой
Сообщений: 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 и т. д.) - ругается, мол, символ неопределён. Видимо, я что-то делаю неправильно, но вот что?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
esaulenka
сообщение May 7 2015, 12:58
Сообщение #2


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

Группа: Свой
Сообщений: 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)



Аналогично, эти функции пропадают при включении оптимизации (там, правда, сложнее понять - меняется размер всех функций, и линкер зачем-то меняет порядок сборки).

Что это?!


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 7 2015, 18:39
Сообщение #3


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

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



Цитата(esaulenka @ May 7 2015, 17:58) *
Что это?!

Такое случается, когда компилятор подтягивает обработку исключений. Почему он это делает - каждый раз загадкаsm.gif
В данном случае, насколько я могу судить, подключилась раскрутка стека (и деманглинг имён).
Добавьте ключи g++: -fno-exceptions -fno-rtti.
(Бывает, что обработка исключений подтягивается и с этими ключами. Тогда может помочь файлик из этого сообщения).

ЗЫ. Чтобы быстрее отлавливать такие случаи, я применяю ключ линкера -nostartfiles. В этом случае он просто не находит все эти добавочные функции, и обламывается при линковке.


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

Сообщений в этой теме
- AHTOXA   С++ Объявить вариантное перечисление.   Jul 1 2013, 10:49
- - neiver   Если строчка: typedef typename SpiEnumTraits<ch...   Jul 1 2013, 17:40
|- - AHTOXA   Это я уже от безысходности добавил. И без typename...   Jul 1 2013, 18:50
- - XVR   Цитата(AHTOXA @ Jul 1 2013, 14:49) Делаю ...   Jul 2 2013, 08:29
|- - AHTOXA   Так я тоже пробовал, и это тоже не работает: Кодif...   Jul 2 2013, 08:49
|- - XVR   Цитата(AHTOXA @ Jul 2 2013, 12:49) Так я ...   Jul 2 2013, 08:51
|- - AHTOXA   А, пардон, я невнимательно прочитал. Да, так работ...   Jul 2 2013, 09:10
- - Tahoe   Цитата(AHTOXA @ Jul 1 2013, 14:49) Кодenu...   Jul 5 2013, 19:29
|- - AHTOXA   Недавно вернулся к этой теме, но немного по другом...   Apr 11 2015, 07:25
|- - esaulenka   Цитата(AHTOXA @ Apr 11 2015, 10:25) Недав...   Apr 30 2015, 10:33
|- - AHTOXA   Цитата(esaulenka @ Apr 30 2015, 15:33) Во...   Apr 30 2015, 11:08
- - Сергей Борщ   Интересно, взял на заметку.   Apr 11 2015, 08:08
- - shreck   ОФФ. А мне вот интересно, IAR будет воплощать у се...   Apr 20 2015, 10:16
- - esaulenka   Это некорректный пример, так у меня тоже работает ...   Apr 30 2015, 12:54
|- - AHTOXA   Цитата(esaulenka @ Apr 30 2015, 17:54) Эт...   Apr 30 2015, 20:01
- - esaulenka   О, спасибо большое. Хватило одной __cxa_pure_virtu...   May 8 2015, 06:47


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

 


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


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