-
Постов
1 459 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Весь контент esaulenka
-
Хочется странного
esaulenka ответил nanorobot тема в GNU/OpenSource средства разработки
Ещё один вопрос почти в тему. Eclipse Luna не понимает новомодную инициализацию структур struct AStruct { int a; int b; } AStruct = { .a = 1, .b = 2, }; Парсер такую конструкцию не ест. Компилятор понимает. Где у него галка?.. Что спросить у гугла, не придумал :-) -
У меня такое подозрение, что с "нискоамперными" разъемами всё просто. Конструкция, которая не развалится от автомобильных вибраций, должна быть достаточно кондовой. А это позволяет пропустить через каждый контакт как минимум 1А. Если для серии, можно погуглить "molex automotive connectors" - их много разных. Правда, кто их привезёт, я не знаю - всё подобное добро под заказ. "Для себя" можно какую-нибудь банальщину. Только нужное честное слово, что на этот разъем ничего капать не будет :-)
-
Вычисление CRC с помощью sRecord
esaulenka ответил alex1985 тема в ARM, 32bit
Решал аналогичную задачу. Во-первых, CRC по алгоритму от ST - это -STM32_Little_Endian. Странно, что у Вас совпало. Переворачивали вручную, что-ли?.. А во-вторых, лучше прикрутить переворачивалку битов в нужное положение и использовать стандартный алгоритм CRC32. /** * stm32tpl -- STM32 C++ Template Peripheral Library * * Copyright © 2015 Anton B. Gusev aka AHTOXA * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * * * file : stm32_crc.h * description : STM32 Hardware CRC32 calculator * */ #ifndef STM32TPL_STM32_CRC_H_INCLUDED #define STM32TPL_STM32_CRC_H_INCLUDED namespace STM32 { class CrcCalculator { public: CrcCalculator() { RCC->AHBENR |= RCC_AHBENR_CRCEN; __DSB(); CRC->CR = 1; __asm__ volatile ("nop"); __asm__ volatile ("nop"); __asm__ volatile ("nop"); } ~CrcCalculator() { RCC->AHBENR &= ~RCC_AHBENR_CRCEN; } void Add(uint32_t w) { CRC->DR = w; } uint32_t Result() { return CRC->DR; } // вычисление по нестандартному алгоритму ST // длина буфера указывается в uint32_t ! static uint32_t Calc(void const* buf, size_t len) { CrcCalculator crc; uint32_t const * p = reinterpret_cast<uint32_t const *>(buf); for (size_t i = 0; i < len; ++i) crc.Add (p[i]); return crc.Result (); } // вычисление по стандартному алгоритму Ethernet/ZLib/... // длина буфера указывается в uint32_t ! static uint32_t CalcStd (void const* buf, size_t len) { CrcCalculator crc; uint32_t const * p = reinterpret_cast<uint32_t const *>(buf); for (size_t i = 0; i < len; ++i) crc.Add (__RBIT (p[i])); //crc.Add (__RBIT (crc.Result ())); return ~ __RBIT (crc.Result ()); } }; } // namespace STM32 #endif // STM32TPL_STM32_CRC_H_INCLUDED Это микро-библиотека подсчёта, автор - присутствующий тут AHTOXA (ещё раз спасибо!) Я дописал CalcStd(), которая переворачивает байты, чтобы результат совпадал со стандартными реализациями. -
Сергей, спасибо. Корректно Ваш пример заработал только после изъятия AT() у секции .data Без этого линкер пытался наложить .data и .CheckSum и падал с ошибкой. А скрипт с "совершенно лишними AT()" написал не я. Вот он, виновник :-) //* FULLNAME: Single-Chip Microcontroller Real-Time Operating System //* NICKNAME: scmRTOS //* PROCESSOR: ARM Cortex-M3 //* TOOLKIT: ARM GCC //* PURPOSE: Port Test File //* gcc port by Anton B. Gusev aka AHTOXA, Copyright (c) 2009-2012 /************************************************* * linker script for STM32F10x Connectivity Line Devices ************************************************/ ENTRY(Reset_Handler) _Minimum_Stack_Size = 0x100 ; MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K } /* higher address of the user mode stack */ PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); SECTIONS { .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) . = ALIGN(4); } > FLASH .text : { __ctors_start__ = .; KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */ __ctors_end__ = .; __dtors_start__ = .; __dtors_end__ = .; . = ALIGN(4); *(.text) /* remaining code */ *(.text.*) *(.rodata) /* read-only data (constants) */ *(.rodata*) *(.eh_frame_hdr) *(.eh_frame) *(.ARM.extab* .gnu.linkonce.armextab.*) *(.gcc_except_table) *(.eh_frame_hdr) *(.eh_frame) *(.glue_7) *(.glue_7t) . = ALIGN(4); } > FLASH /* .ARM.exidx is sorted, so has to go in its own output section. */ __exidx_start = .; .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > FLASH __exidx_end = .; .text.align : { . = ALIGN(8); _etext = .; _sidata = _etext; /* start of initialized data label */ } > FLASH .data : AT ( _sidata ) /* AT makes the LMA follow on in the binary image */ { . = ALIGN(4); _sdata = .; /* start of .data label */ KEEP( *(.data) ) KEEP( *(.data.*) ) . = ALIGN(4); _edata = .; /* end of .data label */ } > RAM /* .bss section - uninitialized data */ .bss : { . = ALIGN(4); _sbss = .; /* start of .bss label (for startup) */ *(.bss) *(.bss.*) *(COMMON) . = ALIGN(4); _ebss = .; /* end of .bss label (for startup) */ _end = .; /* end of used ram (start of free memory, for malloc) */ __end = .; /* the same */ } > RAM /* * This is the user stack section * This is just to check that there is enough RAM left for the User mode stack * It should generate an error if it's full. */ ._usrstack : { . = ALIGN(4); _susrstack = . ; . = . + _Minimum_Stack_Size ; . = ALIGN(4); _eusrstack = . ; } >RAM PROVIDE( _heap = _ebss ); PROVIDE ( _eheap = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); /* * after that it's only debugging information. */ /* remove the debugging information from the standard libraries */ DISCARD : { libc.a ( * ) libm.a ( * ) libgcc.a ( * ) } /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } /* * DWARF debug sections. * Symbols in the DWARF debugging sections are relative to the beginning * of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } }
-
Захотелось мне разместить переменную в самом конце используемой области флеш - после секций .text и .data. И я не придумал ничего лучшего, как в скрипте линкера написать /*выше - секция .data */ /* конец данных во флеш - кладём сюда контрольную сумму */ .CheckSum : /*AT ( _sidata + SIZEOF ( .data ) )*/ AT ( _sidata + (_edata - _sdata) ) { . = ALIGN(4); KEEP(*(.CheckSum)) } > FLASH /*ниже - секция .bss*/ (пробовал оба варианта AT(), работает одинаково) __attribute__ ((section(".CheckSum"))) const uint32_t gCoreChksum = 0xAABBCCDD; И получил следующее: - в map-файле моя переменная имеет тот же адрес, что и начало .data - в программе взятие адреса также возвращает адрес начала .data - в скомпилированном бинарнике переменную явно видно в самом конце, как я и хотел. Адрес её при этом с не совпадает с тем, что написано в map'е. Собственно, вопросы: - я правильно понимаю, что нашёл баг в линкере? C:\Program Files\GNU Tools ARM Embedded\4.9 2015q1\bin>arm-none-eabi-ld.exe --version GNU ld (GNU Tools for ARM Embedded Processors) 2.24.0.20150304 По хорошему, он должен работать единообразно. Или же единообразно не работать :-) - (более насущный) как по-человечески сделать? UPDATE Вот так работает: /* конец данных во флеш - кладём сюда контрольную сумму */ .CheckSum (_sidata + SIZEOF(.data)) : { . = ALIGN(4); KEEP(*(.CheckSum)) } > FLASH Плохо, что я никак концепцию этого странного скрипта не пойму...
-
FatFS от Чена
esaulenka ответил toweroff тема в В помощь начинающему
Так у Чена и написано: http://elm-chan.org/fsw/ff/en/appnote.html -
С++ Объявить вариантное перечисление.
esaulenka ответил AHTOXA тема в Программирование
О, спасибо большое. Хватило одной __cxa_pure_virtual(). На хабре, кстати, довольно подробно расписано, что это такое: http://habrahabr.ru/post/149683/. Всем, кто на эти грабли наступит, рекомендую :-) PS -fno-exceptions и -fno-rtti установлены, не помогают. -
С++ Объявить вариантное перечисление.
esaulenka ответил AHTOXA тема в Программирование
С автодополнением я понял, почему у меня не работает. Он показывает всё, что есть в текущей области видимости. При моём способе объявления она куда больше - туда в т.ч. попадают все объекты, которые имеют глобальную область видимости. Переписал на явное указание области, стало приятнее: За мультик спасибо :-) У меня теперь другой вопрос, слегка поважнее. В прошлый раз как-то просмотрел, что дебаг-версия прошивки увеличилась аж на 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: .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) Аналогично, эти функции пропадают при включении оптимизации (там, правда, сложнее понять - меняется размер всех функций, и линкер зачем-то меняет порядок сборки). Что это?! -
Старт STM32
esaulenka ответил Immortal_Buka тема в ARM, 32bit
Опять же, отошлю к гуглу. Атрибут constructor сделан для того, чтобы функция (самая обычная, не член класса) "автоматически" вызывалась до старта main. Для чего это может понадобится, я, честно говоря, не знаю. Если нет статических с++ классов и нет этих странных функций, то __libc_init_array(), действительно, ничего не делает. -
Старт STM32
esaulenka ответил Immortal_Buka тема в ARM, 32bit
ek74 давал же ссылку, где расписывается, как работают конструкторы для статических объектов. И пока в SystemInit ничего подобного нет (а в примерах STM он написан на Си), всё работает. И это правильный порядок - SystemInit выставляет корректную частоту ядра, включает внешнюю память (если есть), а только потом выполняются эти конструкторы. -
Старт STM32
esaulenka ответил Immortal_Buka тема в ARM, 32bit
Это надо читать в описании библиотек, прилагаемых к используемому компилятору. STM там, или EFM - разницы никакой. Где почитать это про GCC - самому интересно, собирал информацию по кусочкам, помогает гугл и stackoverflow. Можно задавать более конкретные вопросы, народ тут (или на соседнем подфоруме про opensource средства разработки) на них отвечает. -
С++ Объявить вариантное перечисление.
esaulenka ответил AHTOXA тема в Программирование
Это некорректный пример, так у меня тоже работает :-) Ведь если "CH_SEL_" затереть, там появится ещё с полсотни вариантов. У меня, правда, в обратном порядке всё работает - проект конфигурируется галками, и эклипс сам генерирует make-файлы. Какой-то супер-гибкости мне не надо, а потешить самолюбие (я тут всё контролирую!) и так можно - make-файлы лежат себе на видном месте. Я просто думал, что есть какая-то галка, чтобы эклипс подставлял для enum'а только значения, которые в нём разрешены. Ну, нет так нет... -
С++ Объявить вариантное перечисление.
esaulenka ответил AHTOXA тема в Программирование
Во-первых, спасибо. Получилось довольно аккуратно, микро-классы для пинов - вообще отличные. А во-вторых, как всем этим пользоваться? 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'ы. Это тоже не работает, даже в вышеприведённом варианте - предлагает всё подряд. Где-то есть галка? -
У меня предложение - выкинуть ВСЁ и сделать правильно. Полез в гугл посмотреть, что такое этот HT1621, и наткнулся на весьма внятное описание у... ардуинщиков. Рекомендую . ht1621.writeMem придётся самому делать, но, кажется мне, он уже готов.
-
Вычисление CRC с помощью sRecord
esaulenka ответил alex1985 тема в ARM, 32bit
srecord использует CCITT по умолчанию, так что результат эксперимента, скорее всего, получился некорректный. -
За годы форумной войны с реализацией уарта в STM можно было б матчасть и подтянуть... Прерывание IDLE есть, срабатывает при паузе, равной одному байту (длина не настраивается).
-
Вычисление CRC с помощью sRecord
esaulenka ответил alex1985 тема в ARM, 32bit
Пользовался только "стандартным" CRC, так что мысли чисто теоретические, но... Документация сообщает нам, что значение полинома надо передавать просто числом, без -poly. Ключ poly - это ИМЯ полинома. Сергей, crc16-l-e / -b-e в документации есть (http://srecord.sourceforge.net/man/man1/srec_input.html, искать "crc16"). Другой вопрос, что документации могло бы быть и побольше, без чЮдных фразочек "и вообще, это опенсорс, смотрите в исходниках". -
Не надо ничего руками трогать, оно и так хорошо работает. Линкер создаёт специальные символы, по которым этот __main() инициализирует RAM. Помнится, в скаттер-файле можно легко ошибиться - всё собирается, но этот __main() копирует данные вечно. PS почти всегда пользовался автоматическим scatter'ом. Максимум, что мне надо было - "откусить" кусочек flash под загрузчик, это галками сделать легко. Для более сложной конфигурации (вспомнить бы, зачем мне потребовалось раскидывать функции по RAM, да ещё с жёстко заданными адресами..) пришлось изрядно почитать, и заработало оно не сразу.
-
Обработка сигналов
esaulenka ответил lytmax54 тема в В помощь начинающему
У меня подозрение, что это курсовая работа "собери детекторный приемник" :-) Соответственно, "кирпичики" сложнее И-НЕ, Шмитта и т.д., скорее всего, под запретом. -
У топикстартера - может, о чём написано в первом же сообщении темы. Учитесь читать.
-
STM32CubeF0 - USB CDC - Неизвестное устройство
esaulenka ответил Alt.F4 тема в ARM, 32bit
Рекомендую пристально посмотреть в сторону стека libopencm3. Красивых GUI-конфигураторов там не дают, зато код красиво пишут :-) CDC там есть, поддержка STM32F10x (у них такой же USB, как и у F042) - тоже. -
STM32f4 discovery прерывания
esaulenka ответил Silber тема в ARM, 32bit
Какой вариант лучше - вопрос предпочтений. В первом случае процессор чуть меньше загружен. К тому же, если почему-то заблокируется прерывание от таймера в момент прихода ответного импульса, значение переднего фронта потеряется (можно проанализировать флаг переполнения и что-то сделать). Во втором случае экономится один канал таймера (актуально, если датчиков много). Во втором случае, кстати, не обязательно ждать переполнения таймера - можно использовать прерывание по заднему фронту импульса. -
STM32f4 discovery прерывания
esaulenka ответил Silber тема в ARM, 32bit
Ну... Надо учитывать, что Шенжень находится достаточно далеко от Оксфорда :-) Соответственно, язык там знают неидеально... Правильное описание алгоритма этого датчика, кстати, есть в разделе product features. А как трактовать "not suggested to connect directly to electric"... Видимо, "не втыкать при наличии питания" (и это правильно!) -
STM32f4 discovery прерывания
esaulenka ответил Silber тема в ARM, 32bit
За неимением осциллографа можно пользоваться лог.анализатором. Самый дешёвый вариант - китайский. Тем не менее, работает хорошо, периодически заменяя осциллограф ценой в несколько тыс. $. Аналоговые подробности сигнала там не видно, конечно. Но просто посмотреть, как ножки контроллера дёргаются - очень полезно. А собственно осциллограф... 200..300$ - это самое-самое начало... Не понял, что это. Полная документация есть? Могу предположить, что "длительность высокого уровня на выходе echo". Почему в описании предлагают измерять длительность от входного сигнала... Видимо, ошибка. -
STM32f4 discovery прерывания
esaulenka ответил Silber тема в ARM, 32bit
Как нарисовано, так и работает. По входу "триггер" датчик формирует пачку импульсов. По окончанию отправки пачки датчик выставляет "эхо" в единичку (у него это занимает ПРИМЕРНО 468 мкс). По окончанию приёма пачки датчик выставляет "эхо" в ноль (длительность импульса - именно то, что нам надо). Слово "примерно" я подчеркнул не зря - скорее всего, за цифру 468 производитель не ручается. Соответственно, ПРАВИЛЬНЫЙ алгоритм - померять время обоих фронтов (благо, Вы это делать умеете - нужно задействовать ещё один канал таймера) и вычитать одно из другого.