Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: свежак KGP win32/arm/avr/mips/m68k
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26
klen
Цитата(Genadi Zawidowski @ Jun 8 2016, 20:19) *
A9 сырой (командная строка видна).
А при чём тут MMU? Какие библиотеки? Это обвалилось задолго до линковки - я же дал листинг...
Чтобы долго не копать - какой ключ сохраняет препроцессированный исходник?
зы: хотеть/не хотеть... сборка от ланчпада собирает всё без проблем.


gcc -E .. должен дать препроцесиированый исходник. у Вас косяг вылазит в ../usbd.c
соответсвенно мне нужно

arm-kgp-eabi-gcc -E -c -mcpu=cortex-a9 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -fno-math-errno -funroll-loops -fgraphite -ffunction-sections -fdata-sections -ffat-lto-objects -Ofast -flto -gdwarf-2 -fomit-frame-pointer -Wall -Wstrict-prototypes -DNDEBUG=1 -DCPUSTYLE_R7S721=1 -DCPUSTYLE_R7S721020=1 -MD -MP -MF ./dep/usbd.o.d -I../ -I../rza1x_inc ../usbd.c -o usbd.i

далее я попрбую скомпилировать и посмотреть в то место кода где компиллер падает
Genadi Zawidowski
Ловите...
klen
Цитата(Genadi Zawidowski @ Jun 9 2016, 08:23) *
Ловите...

да! , выпаlает в осадок при -Ofast, выпадает в оптимизаторе. попробую поправить как нибудь.

для разнообразия попробуйте пересобрать все с -Os, так у меня Ваш исходник благополучно компиляется , хорошо бы проверит что код работает. сможете проверить?
Genadi Zawidowski
В проекте много real time обработки звука (это software defined radio)... честно говоря, не хотелось бы заморачиваться с -Os - скорее всего перестанет работать по причине того, что не успеет. Диагностика этой ситуации у меня есть.
После Ваших правок протестирую уже на рабочем железе.

Потом как-нибудь поясните свою мысль про MMU, libc и процессоры, заточенные под Linux и связь этого с проблемами компилятора.
klen
Цитата(Genadi Zawidowski @ Jun 9 2016, 13:16) *
Потом как-нибудь поясните свою мысль про MMU, libc и процессоры, заточенные под Linux и связь этого с проблемами компилятора.

нету связи, я думал проблема при линковке. не все можно слинковать. здесь чисто косяк оптимизатора, судя по файлу где вылезло - оптимизатор SSA(Static Single Assignment (SSA) form) дерева в которое преобразуется входной код.
ну как то так.

я бы всетки попробывал -Оs, иногда выдает такоьй же по скорости код.
Шаманъ
Цитата(klen @ Jun 9 2016, 23:15) *
я бы всетки попробывал -Оs, иногда выдает такоьй же по скорости код.

Вот и по моим наблюдениям -Os не особо проигрывает другим вариантам.

По сборкам я регулярно использую для ARM Cortex-M0/M3/M4F под win64. Проблемы были, но их устранили (ну за исключением мелочей, одну я обошел переписав скрипт компоновщика, вторая не доставляет неудобств т.к. к генерации кода не относится).
klen
свежак arm
хост x86_64-linux-gnu
http://klen.org//Files/DevTools/x86_64-kgp...0723_COMARUM.7z
klen
свежак для arm
теперь пакет содержит фортран, мне понадобился для кода который я пишу для stm32, может еще кому понадобится.

www.klen.org/Files/DevTools/x86_64-kgp-linux-gnu/arm-kgp-eabi_@_x86_64-kgp-linux-gnu_20160807_OXYCOCCUS.7z
Terminator
Внезапно захотелось использовать больше возможностей предоставляемых C++. Выкинул из проекта старые затычки типа переопределения new delete и т.п.. Качнул последний свежак.
Не собирается sad.gif
Вывод линкера
Код
../../../../../../src/gcc/libgcc/unwind-arm-common.inc:50:28: warning: type of '__cxa_begin_cleanup' does not match original declaration [-Wlto-type-mismatch]
../../../../../../../src/gcc/libstdc++-v3/libsupc++/eh_arm.cc:97:1: note: return value type mismatch
../../../../../../../src/gcc/libstdc++-v3/libsupc++/eh_arm.cc:97:1: note: type 'bool' should match type 'bool'
../../../../../../src/gcc/libgcc/unwind-arm-common.inc:39:23: note: the incompatible type is defined here
../../../../../../../src/gcc/libstdc++-v3/libsupc++/eh_arm.cc:97:1: note: '__cxa_begin_cleanup' was previously declared here
../../../../../../../src/gcc/libstdc++-v3/libsupc++/eh_arm.cc:97:1: note: code may be misoptimized unless -fno-strict-aliasing is used
../../../../../../src/gcc/libgcc/unwind-arm-common.inc:51:52: warning: type of '__cxa_type_match' does not match original declaration [-Wlto-type-mismatch]
../../../../../../../src/gcc/libstdc++-v3/libsupc++/eh_arm.cc:40:1: note: type mismatch in parameter 3
../../../../../../../src/gcc/libstdc++-v3/libsupc++/eh_arm.cc:40:1: note: type 'bool' should match type 'bool'
../../../../../../src/gcc/libgcc/unwind-arm-common.inc:39:23: note: the incompatible type is defined here
../../../../../../../src/gcc/libstdc++-v3/libsupc++/eh_arm.cc:40:1: note: '__cxa_type_match' was previously declared here
../../../../../../../src/gcc/libstdc++-v3/libsupc++/eh_arm.cc:40:1: note: code may be misoptimized unless -fno-strict-aliasing is used
/tmp/ccDWmOks.ltrans0.ltrans.o: In function `get_eit_entry':
<artificial>:(.text+0x298): undefined reference to `__exidx_start'
<artificial>:(.text+0x29c): undefined reference to `__exidx_end'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-writer.o): In function `_write_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/writer.c:58: undefined reference to `_write'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-signalr.o): In function `_kill_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/signalr.c:61: undefined reference to `_kill'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-signalr.o): In function `_getpid_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/signalr.c:97: undefined reference to `_getpid'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-closer.o): In function `_close_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/closer.c:53: undefined reference to `_close'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-fstatr.o): In function `_fstat_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/fstatr.c:62: undefined reference to `_fstat'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-isattyr.o): In function `_isatty_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/isattyr.c:58: undefined reference to `_isatty'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-lseekr.o): In function `_lseek_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/lseekr.c:58: undefined reference to `_lseek'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-readr.o): In function `_read_r':
/opt/home/arm-kgp-eabi/newlib/arm-kgp-eabi/thumb/cortex-m3/newlib/libc/reent/../../../../../../../../src/newlib/newlib/libc/reent/readr.c:58: undefined reference to `_read'
collect2: error: ld returned 1 exit status


Что делать?

P. S. startup и соответсвенно ld файл, самописные.
klen
2_Terminator
такое всегда бывает когда код приложения тянет некоторые функции newlib, они в свою очеред требют среда-спецефичных функций нижнего уровня таких как
_write _sbrk .... итд, которые необходимо реализовать в коде. в таком случае тут уже много раз выкладывали затычки на этот случай.

работает это типа так: 1) Вы слинкованы c newlib 2) например хотите использовать printf 3) newlib реализует все до самого низа где нужно писать байты в какойто девайс - тут то она вызывает _write. а "где он и чего" должен реализовать программист.

Ув. тов AHTOXA и другие тут неоднократно выкладывали исходник с затычками для этих функций.
это все нормально и понятно - непонятно чтоже собиралось до этого?

верните затычки. посмотрите что будет. мне очевидно что когда вы делали свой malloc через него new то все было хорошо, кодла Вы потянули их из newlib то malloc дернул (это можно в коде newlib посмотреть) _sbrk чтоб память выделить.


а вообще то лично мне очень надоела newlib, вещь хорошая но для "жесnко эбедеед" все это не нужно и вредно. я сейчас ваяю свою реализацию libc предназначенную для "маленьких систем" которая будет поддержывать минимально необходимый набор стандартных функций, реентрантность и многопоточность.
делал я так - если что то нужно из libc - переносил портировал в свою либу. цель получить легковесную libc для ембедерских проектов.
Terminator
Цитата(klen @ Sep 2 2016, 04:46) *

Что-то я так и не нашёл нормального способа определения этих лишних функций, тянущих всякие _write_sbrk и т.п. sad.gif
Затычки вернул. Файлик от AHTOXA нашёл, от моего отличается не сильно, __cxa_begin_cleanup и подобных (из ошибок выше) там нет.
Поковыряю исходники gcc ...

Печалит, что несмотря на явное указание -fno-exception, всякие unwind-ы всё равно тянутся sad.gif

Вернул переопределение операторов new и delete. Простые вещи вроде адекватно работают. Посмотрим что будет дальше ...
klen
2_Terminator

в моей сборке из исходников gcc я выдрал генерацию unwind. сам компиллер эту хрень не будет всовывать если библиотеки не потребуют.

если сможете урезать проект до куска котрый эту проблему создает то я поковыряюсь и найду в чем проблема.

сам использую фичи С++14 и все делал для того чтоб никаких "ушей и хвостов от больших машин" не прилазили в код (exeption,rtti, и прочие дряни) - только чистый С++14 без привязки к среде исполнения. как бы у меня работает - значит и у Вас заработает.
AHTOXA
Цитата(Terminator @ Sep 2 2016, 06:50) *
Файлик от AHTOXA нашёл, от моего отличается не сильно, __cxa_begin_cleanup и подобных (из ошибок выше) там нет.

Это не мой, а как раз ваш файлик sm.gif Я его изначально взял вот из этого вашего поста.
Terminator
Цитата(klen @ Sep 2 2016, 16:52) *
сам использую фичи С++14 и все делал для того чтоб никаких "ушей и хвостов от больших машин" не прилазили в код

операторы new и delete переопределены?


P. S. да, с lto проект не собирается (Error: offset out of range) sm.gif Собирается только маленькая часть, загрузчик (он по сути является сильно урезанной копией основной прошивки).
klen
соберу релизную версию 6.2.0
с LTO там должно быть без ошибок при линковке.

я заметил люди не очень хотят использовать свежие сборки, наверно боятся граблей. я же грабли ищу и настигаю sm.gif релизная сборка позволит не ходить по минному полю при возможности воспользоваться С++14

вот собрал 5.4.0
linux64:
http://klen.org/Files/DevTools/x86_64-kgp-....0_VACCINIUM.7z

win64:
http://klen.org/Files/DevTools/x86_64-kgp-....0_VACCINIUM.7z

линуксовую протестил на своих проектах. виндовую неначем. пробуйте.
Genadi Zawidowski
Компиляция прошла нормально, но линковка не срослась - что надо указать кроме libm?
И чего это memcpy/memset повылезали?

CODE
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans20.ltrans.o: In function `txmikeagc.part.7':
<artificial>:(.text.txmikeagc.part.7+0x9e): undefined reference to `powf'
<artificial>:(.text.txmikeagc.part.7+0x142): undefined reference to `log10f'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans20.ltrans.o: In function `trxparam_update.lto_priv.546':
<artificial>:(.text.trxparam_update.lto_priv.546+0x5a): undefined reference to `powf'
<artificial>:(.text.trxparam_update.lto_priv.546+0xe0): undefined reference to `log10f'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans0.ltrans.o: In function `ResetException.lto_priv.457':
<artificial>:(.text.ResetException.lto_priv.457+0x30e): undefined reference to `memcpy'
<artificial>:(.text.ResetException.lto_priv.457+0x31a): undefined reference to `memset'
<artificial>:(.text.ResetException.lto_priv.457+0x1e0c): undefined reference to `log10f'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans2.ltrans.o: In function `OTG_FS_IRQHandler':
<artificial>:(.text.OTG_FS_IRQHandler+0x1390): undefined reference to `memcpy'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans4.ltrans.o: In function `updateboard.isra.35.lto_priv.330':
<artificial>:(.text.updateboard.isra.35.lto_priv.330+0x8cc): undefined reference to `memcmp'
<artificial>:(.text.updateboard.isra.35.lto_priv.330+0x1148): undefined reference to `memset'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans6.ltrans.o: In function `wave_startrecording.lto_priv.347':
<artificial>:(.text.wave_startrecording.lto_priv.347+0x75c): undefined reference to `memset'
<artificial>:(.text.wave_startrecording.lto_priv.347+0x111e): undefined reference to `memset'
<artificial>:(.text.wave_startrecording.lto_priv.347+0x12c8): undefined reference to `memset'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans8.ltrans.o: In function `display_bars':
<artificial>:(.text.display_bars+0x2e): undefined reference to `log10f'
<artificial>:(.text.display_bars+0x4e): undefined reference to `log10f'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans9.ltrans.o: In function `dsp_extbuffer32rx':
<artificial>:(.text.dsp_extbuffer32rx+0x5c6): undefined reference to `atan2f'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans9.ltrans.o: In function `audio_update.lto_priv.545':
<artificial>:(.text.audio_update.lto_priv.545+0x492): undefined reference to `memset'
<artificial>:(.text.audio_update.lto_priv.545+0x56c): undefined reference to `sinf'
<artificial>:(.text.audio_update.lto_priv.545+0x578): undefined reference to `cosf'
<artificial>:(.text.audio_update.lto_priv.545+0x594): undefined reference to `sinf'
<artificial>:(.text.audio_update.lto_priv.545+0x5a0): undefined reference to `cosf'
<artificial>:(.text.audio_update.lto_priv.545+0x5c6): undefined reference to `sinf'
<artificial>:(.text.audio_update.lto_priv.545+0x5d2): undefined reference to `cosf'
<artificial>:(.text.audio_update.lto_priv.545+0x5fa): undefined reference to `sinf'
<artificial>:(.text.audio_update.lto_priv.545+0x606): undefined reference to `cosf'
<artificial>:(.text.audio_update.lto_priv.545+0x8a6): undefined reference to `memset'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans12.ltrans.o: In function `sync_fs.lto_priv.185':
<artificial>:(.text.sync_fs.lto_priv.185+0x36): undefined reference to `memset'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans12.ltrans.o: In function `dir_next.lto_priv.409':
<artificial>:(.text.dir_next.lto_priv.409+0xf6): undefined reference to `memset'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans14.ltrans.o: In function `fir_design_lowpass.lto_priv.484':
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x60): undefined reference to `sinf'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x86): undefined reference to `sinf'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0xa4): undefined reference to `sinf'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0xc2): undefined reference to `sinf'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0xe4): undefined reference to `sinf'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans14.ltrans.o:<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x100): more undefined references to `sinf' follow
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans14.ltrans.o: In function `fir_design_lowpass.lto_priv.484':
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x168): undefined reference to `memset'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x1c4): undefined reference to `cosf'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x1d0): undefined reference to `cosf'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x1dc): undefined reference to `cosf'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x208): undefined reference to `cosf'
<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x214): undefined reference to `cosf'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans14.ltrans.o:<artificial>:(.text.fir_design_lowpass.lto_priv.484+0x220): more undefined references to `cosf' follow
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans14.ltrans.o: In function `agc_times_update.lto_priv.463':
<artificial>:(.text.agc_times_update.lto_priv.463+0x4c): undefined reference to `powf'
<artificial>:(.text.agc_times_update.lto_priv.463+0x84): undefined reference to `powf'
<artificial>:(.text.agc_times_update.lto_priv.463+0xd6): undefined reference to `powf'
<artificial>:(.text.agc_times_update.lto_priv.463+0xfa): undefined reference to `log10f'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans14.ltrans.o: In function `agc_times_initialize.lto_priv.547':
<artificial>:(.text.agc_times_initialize.lto_priv.547+0x36): undefined reference to `log10f'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans14.ltrans.o: In function `DMA1_Stream4_IRQHandler':
<artificial>:(.text.DMA1_Stream4_IRQHandler+0x10a): undefined reference to `memset'
<artificial>:(.text.DMA1_Stream4_IRQHandler+0x11c): undefined reference to `memset'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans16.ltrans.o: In function `smanswer':
<artificial>:(.text.smanswer+0x16): undefined reference to `log10f'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans17.ltrans.o: In function `single_rate_out_write_mcv.constprop.156':
<artificial>:(.text.single_rate_out_write_mcv.constprop.156+0x18): undefined reference to `memset'
<artificial>:(.text.single_rate_out_write_mcv.constprop.156+0x26): undefined reference to `memcpy'
<artificial>:(.text.single_rate_out_write_mcv.constprop.156+0x32): undefined reference to `memcpy'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans17.ltrans.o: In function `fir_design_bandpass_scaled.constprop.140':
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x52): undefined reference to `sinf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x5e): undefined reference to `cosf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x7e): undefined reference to `sinf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x8a): undefined reference to `cosf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0xac): undefined reference to `sinf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0xb8): undefined reference to `cosf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0xdc): undefined reference to `sinf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0xe8): undefined reference to `cosf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x12c): undefined reference to `cosf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x138): undefined reference to `cosf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x144): undefined reference to `cosf'
<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x16a): undefined reference to `cosf'
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans17.ltrans.o:<artificial>:(.text.fir_design_bandpass_scaled.constprop.140+0x176): more undefined references to `cosf' follow
C:\Users\gena\AppData\Local\Temp\ccVWE887.ltrans19.ltrans.o: In function `agc_forvard_float.isra.10.constprop.4':
<artificial>:(.text.agc_forvard_float.isra.10.constprop.4+0xcc): undefined reference to `powf'
<artificial>:(.text.agc_forvard_float.isra.10.constprop.4+0x19e): undefined reference to `log10f'
collect2.exe: error: ld returned 1 exit status
make.exe: *** [tc1_stm32f746zg_rom.elf] Error 1
alx2
Цитата(Genadi Zawidowski @ Sep 5 2016, 03:53) *
Компиляция прошла нормально, но линковка не срослась - что надо указать кроме libm?
Кроме libm надо еще libc - там находятся memcpy/memset. Но Вы, похоже, и libm не указали, судя по тому, что линкер не находит powf, sinf и т.п., которые должны там быть...

Цитата(Genadi Zawidowski @ Sep 5 2016, 03:53) *
И чего это memcpy/memset повылезали?

Если я правильно понял, memset требуется, например, функции wave_startrecording().
Смотрите map-файл - там должно быть написано, кто какой символ потребовал.
Genadi Zawidowski
Цитата(alx2 @ Sep 5 2016, 09:24) *
Кроме libm надо еще libc - там находятся memcpy/memset. Но Вы, похоже, и libm не указали, судя по тому, что линкер не находит powf, sinf и т.п., которые должны там быть...


Если я правильно понял, memset требуется, например, функции wave_startrecording().
Смотрите map-файл - там должно быть написано, кто какой символ потребовал.



Не, libm указана явно (ключил -lm компилятору):
Цитата
C:\user\arm-kgp-eabi_@_x86_64-kgp-mingw32_5.4.0_VACCINIUM\bin\arm-kgp-eabi-gcc -c -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -fno-math-errno -funroll-loops -fgraphite -ffunction-sections -fdata-sections -ffat-lto-objects -Ofast -flto -gdwarf-2 -fomit-frame-pointer -Wall -Wstrict-prototypes -DNDEBUG=1 -DCPUSTYLE_STM32F7XX=1 -DSTM32F746xx=1 -MD -MP -MF ./dep/tests.o.d -I../../CMSIS-SP-00300-r4p5-00rel0/CMSIS/Include -I../ ../tests.c -o tests.o
C:\user\arm-kgp-eabi_@_x86_64-kgp-mingw32_5.4.0_VACCINIUM\bin\arm-kgp-eabi-gcc bandfilters.o board.o usbd.o usbd_desc.o sequen.o elkey.o encoder.o serial.o hardware.o hd44780.o display.o display2.o keyboard.o keymaps.o nvram.o spifuncs.o formats.o
synthcalcs.o filters.o pcf8535.o uc1608.o uc1601s.o lph88.o ls020.o l2f50.o s1d13781.o ILI9320.o ili9225.o st7735.o st7565s.o graphltdc.o sdram.o ili8961.o twi.o pio.o tlv320aic23.o cs4272.o nau8822.o hardwarecodecs.o buffers.o audio.o spislave.o modems.o sdcard.o ff.o ccsbcs.o tc1.o tests.o -mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-sp-d16 -fno-math-errno -funroll-loops -fgraphite -ffunction-sections -fdata-sections -ffat-lto-objects -flto -Ofast -nostartfiles -T./STM32F746ZG_rom.ld -Wl,-Map=tc1_stm32f746zg_rom.map,--cref,--no-warn-mismatch -L../../CMSIS-SP-00300-r4p5-00rel0/CMSIS/Lib/GCC -lm -o tc1_stm32f746zg_rom.elf


Добавление -lc проблему не решило.
ПРи использовании компилятора с https://launchpad.net/gcc-arm-embedded всё нормально.
klen
Цитата(Genadi Zawidowski @ Sep 5 2016, 10:16) *
Не, libm указана явно (ключил -lm компилятору):


Добавление -lc проблему не решило.
ПРи использовании компилятора с https://launchpad.net/gcc-arm-embedded всё нормально.


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

просьба скачать и прверить ситуацию на выше выложенной сборке OXYCOCCUS
я за нее ручаюсь, все должжно захаваться.это проверенная рабочая моя.

мне наверно не поверят но всетаки lto оптимизатор в коде из транка лучше и устойчивей чем в "старых релизах"
также очень сильно все зависить как собирать, в своих сборках мултилиб, libstdc++ libsupc++, ... собираю руками, автоматом это невозможно.
с OXYCOCCUS я хорошенько потрахался чтоб все работало включая фортран.
Genadi Zawidowski
Хорошо, эта часть не менялась уже много месяцев. Устройство для тестирования рядом, на программаторе.

Цитата(klen @ Sep 5 2016, 10:50) *
просьба скачать и прверить ситуацию на выше выложенной сборке OXYCOCCUS

www.klen.org/Files/DevTools/x86_64-kgp-linux-gnu/arm-kgp-eabi_@_x86_64-kgp-linux-gnu_20160807_OXYCOCCUS.7z
Это линуховая версия... я ведь пигмей (по Вашей классификации пользователей), под виндами сижу...
Но когда Вы выкладываете виндовые версии, я их пытаюсь применить.
klen
2_'Genadi Zawidowski
хорошо, соберу для масдая. похоже OXYCOCCUS не та что я имел ввиду, после обеда пресс-конфенция sm.gif
alx2
Цитата(Genadi Zawidowski @ Sep 5 2016, 13:16) *
Не, libm указана явно (ключил -lm компилятору):

Ну тогда либо у Вас в libm нет sinf/cosf (что вряд ли), либо баг линкера.
Terminator
Попытался на радостях использовать std::vector ...
Код
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_algobase.h: In instantiation of 'void std::fill(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = long unsigned int*; _Tp = int]':
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_bvector.h:402:55:   required from here
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_algobase.h:729:37: error: '__glibcxx_requires_valid_range' was not declared in this scope
       __glibcxx_requires_valid_range(__first, __last);
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
compilation terminated due to -Wfatal-errors.

Безнадёга wacko.gif
klen
Цитата(Terminator @ Sep 6 2016, 08:41) *
Попытался на радостях использовать std::vector ...
Код
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_algobase.h: In instantiation of 'void std::fill(_ForwardIterator, _ForwardIterator, const _Tp&) [with _ForwardIterator = long unsigned int*; _Tp = int]':
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_bvector.h:402:55:   required from here
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/7.0.0/include/c++/bits/stl_algobase.h:729:37: error: '__glibcxx_requires_valid_range' was not declared in this scope
       __glibcxx_requires_valid_range(__first, __last);
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
compilation terminated due to -Wfatal-errors.

Безнадёга wacko.gif


безнадега это когда белые тапочки и деревянный макинтош! и то наукой не доказано что это не фазовый переход....
для линуха собрал проверил, для масдая оставил на сборку и побежад домой. если собралось выложу.


klen
Цитата(klen @ Sep 6 2016, 10:07) *
безнадега это когда белые тапочки и деревянный макинтош! и то наукой не доказано что это не фазовый переход....
для линуха собрал проверил, для масдая оставил на сборку и побежад домой. если собралось выложу.



нужно пробовать!

linux64
http://klen.org/Files/DevTools/x86_64-kgp-...05_VACCINIUM.7z

win64
http://klen.org/Files/DevTools/x86_64-kgp-...06_VACCINIUM.7z

с векторами сейчас проверю и отпишусь - у меня все работало.
Genadi Zawidowski
win64 - проект собрался, работает нормально. измерениями ускорения/замедляния оптимизации вычислений не занимался. 580184 байт кода против 572812 намекают, что должно стать шустрее.
klen
Цитата(Genadi Zawidowski @ Sep 6 2016, 12:54) *
win64 - проект собрался, работает нормально. измерениями ускорения/замедляния оптимизации вычислений не занимался. 580184 байт кода против 572812 намекают, что должно стать шустрее.



по поводу C++14, проверил - мое работает.
накидал примерчик

проверяем работу стд вектора и некоторые фичи с++11/14

CODE
#include "console.h"
#include "engine.h"
#include "rt_counter.h"
#include "vdt/vdtMath.h"

#include <vector>

TEngineTask* EngineTask ;

typedef struct
{
float real ;
float image ;
} signal_t ;


typedef std::vector<signal_t,KgpAllocator<signal_t>> signal_vec_t ;


void TEngineTask::Code()
{
TickType_t xLastWakeTime = TTaskUtilities::GetTickCount();

signal_vec_t signal_vec ;

signal_vec.resize( 32 ) ;

// range-base циклы
for(auto &element: signal_vec)
{
element = {0 , -1} ;
}

// энумерация по итераторам, вычисление индекса элемента и присваивание
for( auto it = signal_vec.begin() ; it != signal_vec.end() ; it++ )
{
auto pos = std::distance(signal_vec.begin(),it);
signal_t tmp ;
vdt::fast_sincosf( vdt::details::VDT_PI_F * pos / 32 , tmp.real , tmp.image) ;
*it = tmp ;
}

while(1)
{

if( !active )
Suspend();

DelayUntil( &xLastWakeTime, 1000 ) ;

for(auto &element: signal_vec)
{
rmsg("{%3.3 %1.3}\n", element.real , element.image );
}
}
}


вывод в консольку:
CODE
{000.000 1.000}
{000.098 0.995}
{000.195 0.980}
{000.290 0.956}
{000.382 0.923}
{000.471 0.881}
{000.555 0.831}
{000.634 0.773}
{000.707 0.707}
{000.773 0.634}
{000.831 0.555}
{000.881 0.471}
{000.923 0.382}
{000.956 0.290}
{000.980 0.195}
{000.995 0.098}
{001.000 -0.000}
{000.995 -0.098}
{000.980 -0.195}
{000.956 -0.290}
{000.923 -0.382}
{000.881 -0.471}
{000.831 -0.555}
{000.773 -0.634}
{000.707 -0.707}
{000.634 -0.773}
{000.555 -0.831}
{000.471 -0.881}
{000.382 -0.923}
{000.290 -0.956}
{000.195 -0.980}
{000.098 -0.995}


нужно сделать важный коментарий - если посмотреть повнимательней в мой код то Вы заметите что стандартный аллокатор по умолчанию я не использую - это злое зло для машин с терабайтами озу и терагерцами в процессорах. у меня свой легковесный аллокатор который я подсовываю STL, далее нужно сказать что это аллокатор НЕ использует стандартный new/delete - а использует мои враgеры lдля этих С++ операторов которые НЕ используют стандартные malloc/free - а используют мою обертку вокруг TLSF

все эти танцы с бубном необходимы для обхода слежующих двух граблей
1. new и delete c танадартной реализации могут генерить эксепшены которыя мы выпиливаем - в микроэмбедет оно плохо ложится, поэтому свой врапер на эти операторы
2. malloc и free которые нужны для new и delete из newlib лично у меня вызывают печаль поэтому я их отправил к TLSF который линкуется во все мои проекты.

но Вы не обязаны использовать ни враперы по типу моих ни вообще stdlibc для использования чистого C++14, но без STL теряется изящность - там много написано и писать заново свое корявое не интересно. тем немение использую контейнеры прийдется реализовать работу с памятью о чем выше сообщено.

все эти мысои оформлены в виде нескольких мален7ьких хидеров - вот их реализация:

supc++.h
CODE
#ifndef __SUPC++_H__
#define __SUPC++_H__

// KGP tools embedded SDK
// Chernov S.A. aka klen
// klen_s@mail.ru

#include <stddef.h> // define size_t
#include <bits/c++config.h> // nedded for _GLIBCXX_NOEXCEPT macro and c++ exception handler redefinition

extern "C" void *malloc( size_t WantedSize );
extern "C" void free( void* pv );


// see referense of 'noexcept' in $TARGET/lib/gcc/$TARGET/X.X.X/include/c++/$TARGET/bits/c++config.h
// _GLIBCXX_NOEXCEPT is macro wrap of noexcept

//------------------------------------------------------------------
// определение функции оператор new
inline void* operator new(size_t size) _GLIBCXX_NOEXCEPT
{
return malloc( size );
}
//------------------------------------------------------------------
// определение функции оператор delete
inline void operator delete(void* ptr) _GLIBCXX_NOEXCEPT
{
free(ptr);
}
inline void operator delete(void* ptr , size_t size) _GLIBCXX_NOEXCEPT
{
free(ptr);
}
//------------------------------------------------------------------
// определение функции оператор new[]
inline void* operator new[] (size_t size) _GLIBCXX_NOEXCEPT
{
return malloc( size );
}
//------------------------------------------------------------------
// определение функции оператор delete[]
inline void operator delete[] (void* ptr) _GLIBCXX_NOEXCEPT
{
free(ptr);
}
inline void operator delete[] (void* ptr, size_t size) _GLIBCXX_NOEXCEPT
{
free(ptr);
}
//------------------------------------------------------------------
// default throw catchers
__attribute__((__noreturn__)) inline void throw_exeption_catcher()
{
while(1)
asm volatile("nop");
}

__attribute__((__noreturn__)) inline void throw_exeption_catcher(const char* msg)
{
// save mgs addr to r0 for avoid GCC optimisation
asm volatile ("ldr r0 , %[msg]" : : [msg]"m" (msg) : );
while(1)
asm volatile("nop");
}

__attribute__((__noreturn__)) inline void throw_exeption_catcher(int val)
{
// save mgs addr to r0 for avoid GCC optimisation
asm volatile ("ldr r0 , %[val]" : : [val]"m" (val) : );
while(1)
asm volatile("nop");
}


// переопределение обработчиков исключений
#include <bits/exception_defines.h>

#define THROW_CATCHER_ARG(ret_t,name,arg_t,arg_v) __attribute__((__noreturn__)) inline ret_t name(arg_t arg_v) {throw_exeption_catcher(arg_v);}
#define THROW_CATCHER_FMT(name) __attribute__((__noreturn__)) __attribute__((__format__(__printf__, 1, 2))) \
inline void name(const char* fmt, ...) {throw_exeption_catcher(fmt);}

namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

THROW_CATCHER_ARG(void,__throw_bad_exception,void,) // Helper for exception objects in <except>
THROW_CATCHER_ARG(void,__throw_bad_alloc,void,) // Helper for exception objects in <new>
THROW_CATCHER_ARG(void,__throw_bad_cast,void,) // Helper for exception objects in <typeinfo>
THROW_CATCHER_ARG(void,__throw_bad_typeid,void,)
THROW_CATCHER_ARG(void,__throw_logic_error,const char*,msg) // Helpers for exception objects in <stdexcept>
THROW_CATCHER_ARG(void,__throw_domain_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_invalid_argument,const char*,msg)
THROW_CATCHER_ARG(void,__throw_length_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_out_of_range,const char*,msg)
THROW_CATCHER_ARG(void,__throw_runtime_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_range_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_overflow_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_underflow_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_ios_failure,const char*,msg) // Helpers for exception objects in <ios>
THROW_CATCHER_ARG(void,__throw_system_error,int,val)
THROW_CATCHER_ARG(void,__throw_future_error,int,val)
THROW_CATCHER_ARG(void,__throw_bad_function_call,void,) // Helpers for exception objects in <functional>
THROW_CATCHER_FMT(__throw_out_of_range_fmt)

_GLIBCXX_END_NAMESPACE_VERSION
} // namespace


namespace __gnu_cxx
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

THROW_CATCHER_ARG(void,__verbose_terminate_handler,void,)

_GLIBCXX_END_NAMESPACE_VERSION
};

#endif /* __SUPC++_H__ */


supstl.h
CODE
#ifndef __SUPSTL_H__
#define __SUPSTL_H__

// KGP tools embedded SDK
// Chernov S.A. aka klen
// klen_s@mail.ru

#include <limits>
#include <algorithm>
#include <cstring>

extern "C" void* malloc( size_t );
extern "C" void free( void* );

namespace std
{


using std::size_t;
using std::ptrdiff_t;

/**
* @brief An allocator that uses malloc.
* @ingroup allocators
*
* This is precisely the allocator defined in the C++ Standard.
* - all allocation calls malloc
* - all deallocation calls free
*/
template<typename _Tp>
class KgpAllocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;

template<typename _Tp1>
struct rebind
{ typedef KgpAllocator<_Tp1> other; };

KgpAllocator() _GLIBCXX_USE_NOEXCEPT { }

KgpAllocator(const KgpAllocator&) _GLIBCXX_USE_NOEXCEPT { }

template<typename _Tp1>
KgpAllocator(const KgpAllocator<_Tp1>&)
_GLIBCXX_USE_NOEXCEPT { }

~KgpAllocator() _GLIBCXX_USE_NOEXCEPT { }

pointer
address(reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }

const_pointer
address(const_reference __x) const _GLIBCXX_NOEXCEPT
{ return std::__addressof(__x); }

// NB: __n is permitted to be 0. The C++ standard says nothing
// about what the return value is when __n == 0.
pointer
allocate(size_type __n, const void* = 0)
{
if (__n > this->max_size())
std::__throw_bad_alloc();

pointer __ret = static_cast<_Tp*>(malloc(__n * sizeof(_Tp)));
if (!__ret)
std::__throw_bad_alloc();
return __ret;
}

// __p is not permitted to be a null pointer.
void
deallocate(pointer __p, size_type)
{ free(static_cast<void*>(__p)); }

size_type
max_size() const _GLIBCXX_USE_NOEXCEPT
{ return size_t(-1) / sizeof(_Tp); }

#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _Up, typename... _Args>
void
construct(_Up* __p, _Args&&... __args)
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

template<typename _Up>
void
destroy(_Up* __p) { __p->~_Up(); }
#else
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 402. wrong new expression in [some_] allocator::construct
void
construct(pointer __p, const _Tp& __val)
{ ::new((void *)__p) value_type(__val); }

void
destroy(pointer __p) { __p->~_Tp(); }
#endif
};

template<typename _Tp>
inline bool
operator==(const KgpAllocator<_Tp>&, const KgpAllocator<_Tp>&)
{ return true; }

template<typename _Tp>
inline bool
operator!=(const KgpAllocator<_Tp>&, const KgpAllocator<_Tp>&)
{ return false; }

}


//-------- KGP utils & support ------------
#include <string> //need for basic_string
namespace kgp
{
//-------------------------------------------------------------------------------------
typedef std::basic_string<char, std::char_traits<char>, std::KgpAllocator<char> > emb_string; /// A string of @c char

class compare
{
public:
inline bool operator() (const char lhs, const char rhs) const {return lhs < rhs;}
inline bool operator() (const int& lhs, const int& rhs) const {return lhs < rhs;}
inline bool operator() (const float& lhs, const float& rhs) const {return lhs < rhs;}
inline bool operator() (const double& lhs, const double& rhs) const {return lhs < rhs;}
inline bool operator() (const char* lhs, const char* rhs) const {return strcmp(lhs,rhs) < 0 ;}
inline bool operator() (const emb_string& lhs, const emb_string& rhs) const {return lhs==rhs;}
};
}

using namespace std;
using namespace kgp;

#endif /* __SUPSTL_H__ */


__cxa_impl.h
CODE
/*
* __cxa_impl.h
*
* Created on: 28 янв. 2016 г.
* Author: klen
*/

#ifndef __CXA_IMPL_H__
#define __CXA_IMPL_H__

// KGP tools embedded SDK
// Chernov S.A. aka klen
// klen_s@mail.ru

#ifdef __cplusplus
extern "C" {
#endif

__extension__ typedef int __guard __attribute__((mode (__DI__)));

int __attribute__((__noreturn__)) inline __cxa_atexit(void (*func) (void *), void * arg, void * dso_handle)
{
throw_exeption_catcher();
}

int __attribute__((__noreturn__)) inline __cxa_guard_acquire(__guard* g)
{
throw_exeption_catcher();
//return !*g;
}

void __attribute__((__noreturn__)) inline __cxa_guard_release (__guard* g)
{
throw_exeption_catcher();
*g = 1;
}

void __attribute__((__noreturn__)) inline __cxa_guard_abort (__guard*)
{
throw_exeption_catcher();
}

void __attribute__((__noreturn__)) inline __cxa_pure_virtual()
{
throw_exeption_catcher();
}

#ifdef __cplusplus
}
#endif

#endif


__aeabi_impl.h
CODE
/*
* __aeabi_impl.h
*
* Created on: 28 янв. 2016 г.
* Author: klen
*/

#ifndef __AEABI_IMPL_H__
#define __AEABI_IMPL_H__

// KGP tools embedded SDK
// Chernov S.A. aka klen
// klen_s@mail.ru

#include "__cxa_impl.h"

#ifdef __cplusplus
extern "C" {
#endif

int inline __aeabi_atexit(void* object, void (*destroyer)(void*), void* dso_handle)
{
// atexit(f) should call __aeabi_atexit (NULL, f, NULL)
// The meaning of this function is given by the following model implementation...
return __cxa_atexit(destroyer, object, dso_handle);
// 0 ⇒ OK; non - 0 ⇒ failed
}

#ifdef __cplusplus
}
#endif

#endif /* __AEABI_IMPL_H__ */


заинклудте эти хидеры и реализуйте хоть как нибудь malloc/free, можно из newlib (он есть по умолчанию в сборке в виде libc)

и кстате да! забыл что тут же уменя есть класс emb_string - использовать как std::string sm.gif
Genadi Zawidowski
Количественно точно пока не скажу, но в программе, скомпилированной последней протестированной мною версии от klen, фильтр (fir, float) работает по ощущениям быстрее процентов на 15, чем в текущей версии с launchpad (gcc-arm-none-eabi-5_4-2016-q2-update).
klen
все тоже самое для win32
www.klen.org/Files/DevTools/i686-kgp-mingw32/arm-kgp-eabi_@_i686-kgp-mingw32_20160907_VACCINIUM.7z
Genadi Zawidowski
win64:
на том же файле (с изменениями), что и раньше падало - случай с Cortex-A9:

../usbd.c: In function 'usb0_function_SetDescriptor':
../usbd.c:2410:13: internal compiler error: tree check: expected ssa_name, have integer_cst in ptr_deref_may_alias_decl_p, at tree-ssa-alias.c:211
static void usb0_function_SetDescriptor(uint_fast8_t ReqTypeRecip, uint_fast16_t ReqValue, uint_fast16_t ReqIndex, uint_fast16_t ReqLength)
^~~~~~~~~~~~~~~~~~~~~~~~~~~
libbacktrace could not find executable to open
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

klen
Цитата(Genadi Zawidowski @ Sep 7 2016, 21:08) *
win64:
на том же файле (с изменениями), что и раньше падало - случай с Cortex-A9:

../usbd.c: In function 'usb0_function_SetDescriptor':
../usbd.c:2410:13: internal compiler error: tree check: expected ssa_name, have integer_cst in ptr_deref_may_alias_decl_p, at tree-ssa-alias.c:211
static void usb0_function_SetDescriptor(uint_fast8_t ReqTypeRecip, uint_fast16_t ReqValue, uint_fast16_t ReqIndex, uint_fast16_t ReqLength)
^~~~~~~~~~~~~~~~~~~~~~~~~~~
libbacktrace could not find executable to open
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.


непонятно, падало раньше, падает сейчас или падает но не всегда...
Genadi Zawidowski
Падало раньше, Вы поправили и перестало падать. Сейчас опять. Диагностика совпадает.
Обсуждалось тут http://electronix.ru/forum/index.php?showt...t&p=1430750

Препроцессированный файл, вызывающий падение - в аттаче.
Terminator
Цитата(klen @ Sep 6 2016, 17:41) *
...

это всё конечно круто, спасибо за код.
Но меня тут начали беспокоить внезапные сомнения в применении переопределённого оператора new без исключений.
Судя по asm листингам, сразу после вызова оператора new идёт выполнение конструктора, т.е. всё "весело" грохнется если вдруг new вернёт null ...

По теории можно применить placement new, сначала выделить память, проверить что её хватило, а потом уже new на эту память.
Остаётся вопрос о возможных последствиях выполнения delete на созданный объект. Вероятно всё сработает как надо, вызовется деструктор, а потом память освободится, но везде в примерах пишут явный вызов деструктора и затем явное освобождение памяти.
klen
это же по месту делается ....
применительно к моим хидерам такой вариант:
CODE

#ifndef __SUPC++_H__
#define __SUPC++_H__

// KGP tools embedded SDK
// Chernov S.A. aka klen
// klen_s@mail.ru

#include <stddef.h> // define size_t
#include <bits/c++config.h> // nedded for _GLIBCXX_NOEXCEPT macro and c++ exception handler redefinition


//------------------------------------------------------------------
// default throw catchers
__attribute__((__noreturn__)) inline void throw_exeption_catcher()
{
while(1)
asm volatile("nop") ;
}

__attribute__((__noreturn__)) inline void throw_exeption_catcher(const char* msg)
{
// save mgs addr to r0 for avoid GCC optimisation
asm volatile ("ldr r0 , %[msg]" : : [msg]"m" (msg) : ) ;
while(1)
asm volatile("nop") ;
}

__attribute__((__noreturn__)) inline void throw_exeption_catcher(int val)
{
// save mgs addr to r0 for avoid GCC optimisation
asm volatile ("ldr r0 , %[val]" : : [val]"m" (val) : ) ;
while(1)
asm volatile("nop") ;
}


// переопределение обработчиков исключений
#include <bits/exception_defines.h>

#define THROW_CATCHER_ARG(ret_t,name,arg_t,arg_v) __attribute__((__noreturn__)) inline ret_t name(arg_t arg_v) {throw_exeption_catcher(arg_v);}
#define THROW_CATCHER_FMT(name) __attribute__((__noreturn__)) __attribute__((__format__(__printf__, 1, 2))) \
inline void name(const char* fmt, ...) {throw_exeption_catcher(fmt);}

namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

THROW_CATCHER_ARG(void,__throw_bad_exception,void,) // Helper for exception objects in <except>
THROW_CATCHER_ARG(void,__throw_bad_alloc,void,) // Helper for exception objects in <new>
THROW_CATCHER_ARG(void,__throw_bad_cast,void,) // Helper for exception objects in <typeinfo>
THROW_CATCHER_ARG(void,__throw_bad_typeid,void,)
THROW_CATCHER_ARG(void,__throw_logic_error,const char*,msg) // Helpers for exception objects in <stdexcept>
THROW_CATCHER_ARG(void,__throw_domain_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_invalid_argument,const char*,msg)
THROW_CATCHER_ARG(void,__throw_length_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_out_of_range,const char*,msg)
THROW_CATCHER_ARG(void,__throw_runtime_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_range_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_overflow_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_underflow_error,const char*,msg)
THROW_CATCHER_ARG(void,__throw_ios_failure,const char*,msg) // Helpers for exception objects in <ios>
THROW_CATCHER_ARG(void,__throw_system_error,int,val)
THROW_CATCHER_ARG(void,__throw_future_error,int,val)
THROW_CATCHER_ARG(void,__throw_bad_function_call,void,) // Helpers for exception objects in <functional>
THROW_CATCHER_FMT(__throw_out_of_range_fmt)

_GLIBCXX_END_NAMESPACE_VERSION
} // namespace


namespace __gnu_cxx
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

THROW_CATCHER_ARG(void,__verbose_terminate_handler,void,)

_GLIBCXX_END_NAMESPACE_VERSION
};


extern "C" void *malloc( size_t WantedSize ) ;
extern "C" void free( void* pv );


// see referense of 'noexcept' in $TARGET/lib/gcc/$TARGET/X.X.X/include/c++/$TARGET/bits/c++config.h
// _GLIBCXX_NOEXCEPT is macro wrap of noexcept

//------------------------------------------------------------------
// определение функции оператор new
inline void* operator new(size_t size) _GLIBCXX_NOEXCEPT
{
void *p;

/* malloc (0) is unpredictable; avoid it. */
if (size == 0)
size = 1;

while (__builtin_expect ((p = malloc (size)) == 0, false))
{
std::__throw_bad_alloc();
}

return p;
}
//------------------------------------------------------------------
// определение функции оператор delete
inline void operator delete(void* ptr) _GLIBCXX_NOEXCEPT
{
free(ptr) ;
}
inline void operator delete(void* ptr , size_t size) _GLIBCXX_NOEXCEPT
{
free(ptr) ;
}
//------------------------------------------------------------------
// определение функции оператор new[]
inline void* operator new[] (size_t size) _GLIBCXX_NOEXCEPT
{
void *p;

/* malloc (0) is unpredictable; avoid it. */
if (size == 0)
size = 1;

while (__builtin_expect ((p = malloc (size)) == 0, false))
{
std::__throw_bad_alloc();
}

return p;
}
//------------------------------------------------------------------
// определение функции оператор delete[]
inline void operator delete[] (void* ptr) _GLIBCXX_NOEXCEPT
{
free(ptr) ;
}
inline void operator delete[] (void* ptr, size_t size) _GLIBCXX_NOEXCEPT
{
free(ptr) ;
}


#endif /* __SUPC++_H__ */


если хотите - всуньте свой обработчик.
но.... зачем, если конструктор упал все поехало уже не туда и в зад не вернешься. в hardfault все посмотрим для отладки проблемы. я так считаю что нужна писать чтобы отказа памяти не было - я разрабатываю в 99% случаев прилагухи жестко реального времени. поэтому обрабатывать ошибки и отказы уже поздно если они вылезли sm.gif
c delete b free тут вообще ничего не сделаешь, если прилетел ненулевой указатель ктож его знает валидный он или нет.
я как так вижу эти моменты...
Terminator
ну как бы да, можно жёстко ограничить число выделяемых объектов чтобы память 100% не закончилась.
А мне хочется и другой вариант попробовать, складывать команды в очередь пока есть свободная память, а потом, те что не влезают, выкидывать. С обычным new это невозможно.
Сергей Борщ
QUOTE (Terminator @ Sep 9 2016, 04:37) *
А мне хочется и другой вариант попробовать, складывать команды в очередь пока есть свободная память, а потом, те что не влезают, выкидывать.
У меня в таком случае в перегруженном operator new() из очереди удаляются самые старые события (которые, наверняка, уже мало кому интересны) и после каждого удаления производится повторная попытка выделить память для нового события. Если очередь уже пуста, а памяти все еще не хватает - то, значит, что-то уже сильно порушено и остается только перезагружаться.

QUOTE (Terminator @ Sep 9 2016, 04:37) *
С обычным new это невозможно.
А с operator new ( std::size_t count, const std::nothrow_t& tag) - возможно. В этом случае компилятор вставляет проверку возвращенного new(std::nothrow) указателя и вызывает конструктор только в том случае, если new вернул не 0.
Terminator
Цитата(Сергей Борщ @ Sep 9 2016, 14:57) *
У меня в таком случае в перегруженном operator new() из очереди удаляются самые старые события (которые, наверняка, уже мало кому интересны) и после каждого удаления производится повторная попытка выделить память для нового события. Если очередь уже пуста, а памяти все еще не хватает - то, значит, что-то уже сильно порушено и остается только перезагружаться.

Такой подход требует реализации собственного, аля, сборщика мусора.

Цитата(Сергей Борщ @ Sep 9 2016, 14:57) *
А с operator new ( std::size_t count, const std::nothrow_t& tag) - возможно. В этом случае компилятор вставляет проверку возвращенного new(std::nothrow) указателя и вызывает конструктор только в том случае, если new вернул не 0.

Почти так и сделал. С std::nothrow сделать не получилось. Сделал проще, operator new(size_t,void*). Кстати, компилятор никаких проверок не вставляет, конструктор вызывается в любом случае. Вставил проверку перед вызовом new.
Сергей Борщ
QUOTE (Terminator @ Sep 10 2016, 08:51) *
Почти так и сделал. С std::nothrow сделать не получилось. Сделал проще, operator new(size_t,void*).
Проще? Покажите, сравним. Это так по-русски - чуть что, придумывать свой велосипед. Причем почти всегда с квадратными колесами.

QUOTE (Terminator @ Sep 10 2016, 08:51) *
Кстати, компилятор никаких проверок не вставляет, конструктор вызывается в любом случае.
У меня вставляет, что я делаю неправильно?
CODE
#include    <new>

class a
{
public:
    a();
};

a * pA;

void test()
{
    pA = new(std::nothrow) a;

}

CODE
  18:main.cpp      **** void test()
  19:main.cpp      **** {
100                      .loc 1 19 0
101                      .cfi_startproc
102                      @ args = 0, pretend = 0, frame = 0
103                      @ frame_needed = 0, uses_anonymous_args = 0
104 0000 10B5             push    {r4, lr}    @
105                  .LCFI0:
106                      .cfi_def_cfa_offset 8
107                      .cfi_offset 4, -8
108                      .cfi_offset 14, -4
  20:main.cpp      ****     pA = new(std::nothrow) a;
109                      .loc 1 20 0
110 0002 0549             ldr    r1, .L7    @,
111 0004 0120             movs    r0, #1    @,
112 0006 FFF7FEFF         bl    _ZnwjRKSt9nothrow_t    @  <-------- new(std::nothrow)
113                  .LVL0:
114 000a 0446             mov    r4, r0    @ D.8513,
115 000c 08B1             cbz    r0, .L2    @,                  <------- проверка
116                      .loc 1 20 0 is_stmt 0 discriminator 1
117 000e FFF7FEFF         bl    _ZN1aC1Ev    @           <------- вызов конструктора
118                  .LVL1:
119                  .L2:
120                      .loc 1 20 0 discriminator 4
121 0012 024B             ldr    r3, .L7+4    @ tmp112,
122 0014 1C60             str    r4, [r3]    @ D.8513, pA
123 0016 10BD             pop    {r4, pc}    @
klen
кусочек кода и конструктор
CODE

int main(void)
{
EngineTask = new TEngineTask() ;
......


CODE

...........
class TEngineTask : public TTask
{
public:
TEngineTask ()
{
NOP();
active = false ;
NOP();
}
.........



ВАЖЕН атрибут которым оператор new помечен:

inline void* operator new(size_t size)
CODE

398 __libc_init_array() ;
0800a82a: bl 0x800aec0 <__libc_init_array>
0800a82e: movs r0, #12 <-------- выхов main()
0800a830: bl 0x800a394 <malloc(size_t)> <-------- EngineTask = new TEngineTask() ;
0800a834: movs r5, #0 <-------- вызов конструктора
0800a836: ldr r3, [pc, #248] ; (0x800a930 <ResetHandler()+744>)
0800a838: str r3, [r0, #0]
0800a83a: str r5, [r0, #4]
0800a83c: nop
14 active = false ;
0800a83e: strb r5, [r0, #8]
15 NOP();
0800a840: nop
0800a842: ldr r3, [pc, #240] ; (0x800a934 <ResetHandler()+748>)

нет проверки результата malloc , компилятор полагает механизм генерации исключений - при вызове по нулю конструктора код перехватит эксепшен и все ок.


inline void* operator new(size_t size) _GLIBCXX_NOEXCEPT
CODE

398 __libc_init_array() ;
0800a82a: bl 0x800aec4 <__libc_init_array>
0800a82e: movs r0, #12 <-------- выхов main()
0800a830: bl 0x800a394 <malloc(size_t)> <-------- EngineTask = new TEngineTask() ;
0800a834: cbz r0, 0x800a844 <ResetHandler()+508> <-------- проверка того что вернул malloc
12 {
0800a836: ldr r2, [pc, #252] ; (0x800a934 <ResetHandler()+748>) <- вызов конструктора
0800a83a: stmia.w r0, {r2, r3}
13 NOP();
0800a83e: nop
14 active = false ;
0800a840: strb r3, [r0, #8]
15 NOP();
0800a842: nop
0800a844: ldr r3, [pc, #240] ; (0x800a938 <ResetHandler()+752>)

компилятор полагает что new не генерит эксепшенов и поэтому нужно проверить результат malloc чтоб не улететь в космом
Сергей Борщ
CODE
EngineTask = new TEngineTask();

CODE
pA = new(std::nothrow) a;

Найдите десять отличий.
AHTOXA
Цитата(Сергей Борщ @ Sep 11 2016, 23:58) *
Найдите десять отличий.

Насколько я понял, klen привёл третий вариант, в котором
void* operator new(size_t size)
объявлен как noexcept. В этом случае компилятор тоже вставляет проверку результата выделения памяти перед вызовом конструктора.
Terminator
Цитата(Сергей Борщ @ Sep 10 2016, 14:09) *
Проще? Покажите, сравним. Это так по-русски - чуть что, придумывать свой велосипед. Причем почти всегда с квадратными колесами.

Согласен, с "проще" я несколько погорячился sm.gif
Просто с обычным new(std::nothrow) у меня проект не собирается, зачем-то тащит библиотечную "кучу" и что-то про исключения.

Вот мой код.
Код
                
void* __mem = malloc(sizeof(Packet));
if (__mem == nullptr)
{
        ...
}
else
{
    packet = new(__mem) Packet(...);
        ...


переопределение new
Код
void* operator new(size_t size, void* p)
{
    (void) size;
    return p;
}

Сергей Борщ
QUOTE (AHTOXA @ Sep 11 2016, 22:14) *
Насколько я понял, klen привёл третий вариант, в котором void* operator new(size_t size) объявлен как noexcept. В этом случае компилятор тоже вставляет проверку результата выделения памяти перед вызовом конструктора.
Но это же велосипед. Уже существующий new(std::nothrow_t) делает ровно то же самое, всегда есть в заголовочном файле <new> любого компилятора и к нему там всегда приписан нужный правильный атрибут. Используя его не нужно думать, _GLIBСXX или какой еще _NOEXCEPT туда надо дописывать (хватает, кстати, обычного переносимого throw() ). Каюсь, тоже использовал такое переопределение, хоть это и грязный хак. Знакомый со стандартом программист, глядя в такой исходник и не зная о переопределении, вправе ожидать совершенно другого поведения кода. Это примерно равносильно #define true false, поэтому советовать такое кому-то еще я никогда не буду.

QUOTE (Terminator @ Sep 12 2016, 05:44) *
Просто с обычным new(std::nothrow) у меня проект не собирается, зачем-то тащит библиотечную "кучу" и что-то про исключения.
Странно. Для new() ему нужен malloc(), для delete() - free(), если эти две функции определены в проекте - у меня ничего не тащит. Можете сделать и выложить простейший проект?
QUOTE (Terminator @ Sep 12 2016, 05:44) *
переопределение new
Велосипед, такой велосипед wink.gif
QUOTE
If placement_params are provided, they are passed to the allocation function as additional arguments. Such allocation functions are known as "placement new", after the standard allocation function void* operator new(std::size_t, void*), which simply returns its second argument unchanged. This is used to construct objects in allocated storage:


Кстати, чтобы не писать (void)size; вы можете опустить имя первого параметра в определении функции:
CODE
void* operator new(size_t, void* p)
{
    return p;
}



И попробуйте все же победить, ваш код станет еще проще:
CODE
                
packet = new(std::nothrow) Packet;
if (packet == nullptr)
{
        ...
}
else
{
        ...
klen
Цитата(Сергей Борщ @ Sep 12 2016, 09:06) *
Но это же велосипед. Уже существующий new(std::nothrow_t) делает ровно то же самое, всегда есть в заголовочном файле <new> любого компилятора и к нему там всегда приписан нужный правильный . Знакомый со стандартом программист, глядя в такой исходник и не зная о переопределении, вправе ожидать совершенно другого поведения кода. Это примерно равносильно #define true false, поэтому советовать такое кому-то еще я никогда не буду.

я с Вами полностью согласен - нужно правильно уметь использовать стандарт. если он позволяет сделать что то - то делать именно его инструментом а не велосипедом. но у меня следующие мысли, первое - переопределение сокращает запись - везде писать new(std::nothrow_t) вместо new.
второе более интересное. в принципе не сложно в своем коде писать new(std::nothrow_t) - это даже правильно как Вы заметили. нам повезло с STL - разработчтки контейнеров и прочего добра требующих динамического распределения памяти грамотно не стали пользоваться операторами new и delete - вместо этого каждый класс требует специальный класс аллокатора - который мы уже тут в хидере определили как нам нужно. все вроде бы хорошо ... остается вопорос - а что если в проект чужая либа в исходниках компилится и линкуется? там прийдется все new переправлять на new(std::nothrow_t), поэтому велосипед пока актуален на мой взгляд.
Genadi Zawidowski
klen, как там с падением компилятора на исходниках с ключами под Cortex-A9? Нужна ли дополнительная информация для лечения бага?
klen
Цитата(Genadi Zawidowski @ Sep 12 2016, 15:59) *
klen, как там с падением компилятора на исходниках с ключами под Cortex-A9? Нужна ли дополнительная информация для лечения бага?

еще не занимался, на работе жоппа, выходные ночевал на работе...я не забыл.
klen
релизная сборка 6.2.0
linux64:
http://klen.org/Files/DevTools/x86_64-kgp-....2.0_CORYLUS.7z

win64:
http://klen.org/Files/DevTools/x86_64-kgp-....2.0_CORYLUS.7z

2_Genadi Zawidowski
проверяйте! сборка под линух у меня пережевала Ваш фалик sm.gif сборка под масдай под wine тоже
wine ./arm-kgp-eabi-gcc.exe -c -mcpu=cortex-a9 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -fno-math-errno -funroll-loops -fgraphite -ffunction-sections -fdata-sections -ffat-lto-objects -Ofast -flto -gdwarf-2 -fomit-frame-pointer -Wall -Wstrict-prototypes -DNDEBUG=1 -DCPUSTYLE_R7S721=1 -DCPUSTYLE_R7S721020=1 -I../ -I../rza1x_inc usbd.c -o usbd.o
объектники бинарно идентичны sm.gif
должно взлететь!
Вы С++ используете? если да то используете ли исключения (try{} catch() )? если да то есть тонкие замечание пл кодогенерации.
Genadi Zawidowski
Цитата
С++ используете?

Не использую. Скачал, проверил - на компиляции для A9 не сыпется. Работоспособность пока неначем проверять.
klen
Цитата(Genadi Zawidowski @ Sep 19 2016, 08:09) *
Не использую. Скачал, проверил - на компиляции для A9 не сыпется. Работоспособность пока неначем проверять.

для A9 по хорошему собрать отдельную сборку. у меня самого есть рабочая машинка на i.MX6Q.
demiurg_spb
Решил попробовать Вашу сборку под винду.
Не находит либу: libc_nano.a

Вы по идеологическим причинам их не собираете?

Так невозможно сравнить Вашу сборку со сборками с ланчпада...

А вообще проект компилируется нормально, но не собирается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.