SergeyVas 0 15 апреля, 2010 Опубликовано 15 апреля, 2010 · Жалоба Где можно посмотреть исходник sprintf, библиотечная работает, только с целыми значениями, а если нужно %f зависает все ,где искать причину не знаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 15 апреля, 2010 Опубликовано 15 апреля, 2010 · Жалоба Где можно посмотреть исходник sprintf, библиотечная работает, только с целыми значениями, а если нужно %f зависает все ,где искать причину не знаю? ЧТо за компилятор, что за среда, какие настройки библиотеки? Подсказка - по умолчанию, для экономии программной памяти, в библиотеках часто предусматривается вывод только целых значений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
baralgin 0 15 апреля, 2010 Опубликовано 15 апреля, 2010 · Жалоба Или нехватка стэка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 15 апреля, 2010 Опубликовано 15 апреля, 2010 (изменено) · Жалоба >ЧТо за компилятор, что за среда, какие настройки библиотеки? >Подсказка - по умолчанию, для экономии программной памяти, в библиотеках часто предусматривается вывод только целых значений. Компилятор Gcc yagarto eclipse код из макефайла: Что где нужно изменить , что бы выводил с точкой?, собирать с нужными ключами? <code>ASFLAGS = $(MCFLAGS) -Wa,-amhls=$(<:.s=.lst) $(ADEFS) CPFLAGS = $(MCFLAGS) $(OPT) -mthumb-interwork -mlong-calls -ffunction-sections -DNDEBUG -Wall -fverbose-asm -Wa,-ahlms=$(<:.c=.lst) $(DEFS) LDFLAGS_RAM = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT_RAM) -Wl,-Map=$(PROJECT)_ram.map,--cref,--no-warn-mismatch $(LIBDIR) LDFLAGS_ROM = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT_ROM) -Wl,-Map=$(PROJECT)_rom.map,--cref,--no-warn-mismatch $(LIBDIR) </code> <code> heapsize 5000байт Вот мап. Heap вроде не маленький .heap 0x00207e50 0x1388 0x00207e50 _heap = . 0x00001388 . = HEAP_SIZE *fill* 0x00207e50 0x1388 00 0x002091d8 . = ALIGN (0x4) 0x002091d8 _eheap = . Изменено 15 апреля, 2010 пользователем sergey sva Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 15 апреля, 2010 Опубликовано 15 апреля, 2010 · Жалоба Вот что говорит на -target-help , может нужно еще добавить какие опции?, камень at91sam7x. в скрипте стек выровнен aling(8). The following options are target specific: -mabi= Specify an ABI -mabort-on-noreturn Generate a call to abort if a noreturn function returns -mapcs-float Pass FP arguments in FP registers -mapcs-frame Generate APCS conformant stack frames -mapcs-reentrant Generate re-entrant, PIC code -march= Specify the name of the target architecture -mbig-endian Assume target CPU is configured as big endian -mcallee-super-interworking Thumb: Assume non-static functions may be called from ARM code -mcaller-super-interworking Thumb: Assume function pointers may go to non- Thumb aware code -mcirrus-fix-invalid-insns Cirrus: Place NOPs to avoid invalid instruction combinations -mcpu= Specify the name of the target CPU -mfix-cortex-m3-ldrd Avoid overlapping destination and address registers on LDRD instructions that may trigger Cortex-M3 errata. -mfloat-abi= Specify if floating point hardware should be used -mfpu= Specify the name of the target floating point hardware/format -mhard-float Alias for -mfloat-abi=hard -mlittle-endian Assume target CPU is configured as little endian -mlong-calls Generate call insns as indirect calls, if necessary -mpic-register= Specify the register to be used for PIC addressing -mpoke-function-name Store function names in object code -msched-prolog Permit scheduling of a function's prologue sequence -msingle-pic-base Do not load the PIC register in function prologues -msoft-float Alias for -mfloat-abi=soft -mstructure-size-boundary= Specify the minimum bit alignment of structures -mthumb Compile for the Thumb not the ARM -mthumb-interwork Support calls between Thumb and ARM instruction sets -mtp= Specify how to access the thread pointer -mtpcs-frame Thumb: Generate (non-leaf) stack frames even if not needed -mtpcs-leaf-frame Thumb: Generate (leaf) stack frames even if not needed -mtune= Tune code for the given processor -mvectorize-with-neon-quad Use Neon quad-word (rather than double-word) registers for vectorization -mword-relocations Only generate absolute relocations on word sized values. -mwords-little-endian Assume big endian bytes, little endian words Known ARM CPUs (for use with the -mcpu= and -mtune= options): cortex-m1, cortex-m3, cortex-r4f, cortex-r4, cortex-a9, cortex-a8, arm1156t2-s, mpcore, mpcorenovfp, arm1176jzf-s, arm1176jz-s, arm1136jf-s, arm1136j-s, arm1026ej-s, arm926ej-s, iwmmxt2, iwmmxt, xscale, arm1022e, arm1020e, arm10e, arm968e-s, arm966e-s, arm946e-s, arm9e, arm1020t, arm10tdmi, ep9312, arm940t, arm922t, arm920t, arm920, arm9tdmi, arm9, arm740t, arm720t, arm710t, arm7tdmi-s, arm7tdmi, strongarm1110, strongarm1100, strongarm110, strongarm, arm810, arm8, arm7dmi, arm7dm, arm7m, arm7500fe, arm7500, arm7100, arm710c, arm720, arm710, arm700i, arm700, arm70, arm7di, arm7d, arm7, arm620, arm610, arm600, arm60, arm6, arm3, arm250, arm2 Known ARM architectures (for use with the -march= option): iwmmxt2, iwmmxt, ep9312, armv7-m, armv7-r, armv7-a, armv7, armv6-m, armv6t2, armv6zk, armv6z, armv6k, armv6j, armv6, armv5te, armv5e, armv5t, armv5, armv4t, armv4, armv3m, armv3, armv2a, armv2 ARM-specific assembler options: -k generate PIC code -mthumb assemble Thumb code -mthumb-interwork support ARM/Thumb interworking -mapcs-32 code uses 32-bit program counter -mapcs-26 code uses 26-bit program counter -mapcs-float floating point args are in fp regs -mapcs-reentrant re-entrant code -matpcs code is ATPCS conformant -mbig-endian assemble for big-endian -mlittle-endian assemble for little-endian -mapcs-frame use frame pointer -mapcs-stack-check use stack size checking -mno-warn-deprecated do not warn on use of deprecated feature -mcpu=<cpu name> assemble for CPU <cpu name> -march=<arch name> assemble for architecture <arch name> -mfpu=<fpu name> assemble for FPU architecture <fpu name> -mfloat-abi=<abi> assemble for floating point ABI <abi> -meabi=<ver> assemble for eabi version <ver> -mimplicit-it=<mode> controls implicit insertion of IT instructions -EB assemble code for a big-endian cpu -EL assemble code for a little-endian cpu --fix-v4bx Allow BX in ARMv4 code Linker options ============== Use "-Wl,OPTION" to pass "OPTION" to the linker. armelf: --build-id[=STYLE] Generate build ID note -Bgroup Selects group name lookup rules for DSO --disable-new-dtags Disable new dynamic tags --enable-new-dtags Enable new dynamic tags --eh-frame-hdr Create .eh_frame_hdr section --hash-style=STYLE Set hash style to sysv, gnu or both -z combreloc Merge dynamic relocs into one section and sort -z defs Report unresolved symbols in object files. -z execstack Mark executable as requiring executable stack -z initfirst Mark DSO to be initialized first at runtime -z interpose Mark object to interpose all DSOs but executable -z lazy Mark object lazy runtime binding (default) -z loadfltr Mark object requiring immediate process -z muldefs Allow multiple definitions -z nocombreloc Don't merge dynamic relocs into one section -z nocopyreloc Don't create copy relocs -z nodefaultlib Mark object not to use default search paths -z nodelete Mark DSO non-deletable at runtime -z nodlopen Mark DSO not available to dlopen -z nodump Mark DSO not available to dldump -z noexecstack Mark executable as not requiring executable stack -z now Mark object non-lazy runtime binding -z origin Mark object requiring immediate $ORIGIN processing at runtime -z max-page-size=SIZE Set maximum page size to SIZE -z common-page-size=SIZE Set common page size to SIZE -z KEYWORD Ignored for Solaris compatibility --thumb-entry=<sym> Set the entry point to be Thumb symbol <sym> --be8 Output BE8 format image --target1=rel Interpret R_ARM_TARGET1 as R_ARM_REL32 --target1=abs Interpret R_ARM_TARGET1 as R_ARM_ABS32 --target2=<type> Specify definition of R_ARM_TARGET2 --fix-v4bx Rewrite BX rn as MOV pc, rn for ARMv4 --fix-v4bx-interworking Rewrite BX rn branch to ARMv4 interworking veneer --use-blx Enable use of BLX instructions --vfp11-denorm-fix Specify how to fix VFP11 denorm erratum --no-enum-size-warning Don't warn about objects with incompatible enum sizes --no-wchar-size-warning Don't warn about objects with incompatible wchar_t sizes --pic-veneer Always generate PIC interworking veneers --stub-group-size=N Maximum size of a group of input sections that can be handled by one stub section. A negative value locates all stubs after their branches (with a group size of -N), while a positive value allows two groups of input sections, one before, and one after each stub section. Values of +/-1 indicate the linker should choose suitable defaults. --[no-]fix-cortex-a8 Disable/enable Cortex-A8 Thumb-2 branch erratum fi x С такими параметрами собираю: все собирается без ошибок и предупреждений, работает, пока в sprintf(buf"%f" fldat); %f , после этого устройство запускается как доходит до этой функции,зависает. Свою сделать мне такая универсальная как библиотечная не нужна, где бы посмотреть какой там алгоритм, что бы не изобретать велосипед. ASFLAGS = $(MCFLAGS) -Wa,-amhls=$(<:.s=.lst) $(ADEFS) CPFLAGS = $(MCFLAGS) $(OPT) -mthumb-interwork -mlong-calls -ffunction-sections -DNDEBUG -Wall -fverbose-asm -Wa,-ahlms=$(<:.c=.lst) $(DEFS) LDFLAGS_RAM = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT_RAM) -Wl,-Map=$(PROJECT)_ram.map,--cref,--no-warn-mismatch $(LIBDIR) LDFLAGS_ROM = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT_ROM) -Wl,-Map=$(PROJECT)_rom.map,--cref,--no-warn-mismatch $(LIBDIR) # -g -gdwarf-2 # Generate dependency information CPFLAGS += -MD -MP -MF .dep/$(@F).d Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amater 0 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба У меня тоже висло все из за printf %f в keil. Помогло увеличение стека. Но потом чтобы за зря слишком много памяти не расходовать стал обходится без printf %f Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 27 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба printf() обычно имеет несколько "градаций" функционала, которые определяются заданными ключами при компиляции. Почитайте документацию на библиотеки heapsize 5000байт Хип и стек - вообще-то не одно и то же, скорее даже совершенно параллельные вещи, так что проверьте ещё и стек Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба Хип и стек - вообще-то не одно и то же, скорее даже совершенно параллельные вещи, так что проверьте ещё и стек Понимаю, в стек сохраняются содержимое регистров , регистра указателя, режим ядра. В heap выделяется память для malloc. Или я что то не правильно понимаю? Вот так настроено в скрипте, сколько нужно для того чтобы работал sprintf? C_STACK_SIZE = 20000; IRQ_STACK_SIZE = 10000; FIQ_STACK_SIZE = 10; SVC_STACK_SIZE = 10; ABT_STACK_SIZE = 10; UND_STACK_SIZE = 10; HEAP_SIZE = 5000; heap Расположен после стека, может наооборот сделать, как правильнее? .stack : { __stack_start__ = .; . = ALIGN(4); . += IRQ_STACK_SIZE; . = ALIGN (4); __irq_stack_top__ = .; . = ALIGN(4); . += FIQ_STACK_SIZE; . = ALIGN (4); __fiq_stack_top__ = .; . = ALIGN(4); . += SVC_STACK_SIZE; . = ALIGN (4); __svc_stack_top__ = .; . = ALIGN(4); . += ABT_STACK_SIZE; . = ALIGN (4); __abt_stack_top__ = .; . = ALIGN(4); . += UND_STACK_SIZE; . = ALIGN (4); __und_stack_top__ = .; . = ALIGN(4); . += C_STACK_SIZE; . = ALIGN (4); __c_stack_top__ = .; . = ALIGN(4); __stack_end__ = .; . = ALIGN(4); } >RAM . = ALIGN(8); _end = .; . = ALIGN(4); __end = .; . = ALIGN(4); PROVIDE(end = .); . = ALIGN(8); .heap : { _heap = .; . = ALIGN(4); . = HEAP_SIZE; . = ALIGN(4); _eheap = .; . = ALIGN(4); }>RAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба Навскидку - все правильно. Совет - на IRQ_STACK_SIZE = 10000 - не многовато ли? Какие такие локальные массивы и структуры используются в прерываниях? HEAP_SIZE = 5000 - не слишком много. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба Навскидку - все правильно. Совет - на IRQ_STACK_SIZE = 10000 - не многовато ли? Какие такие локальные массивы и структуры используются в прерываниях? HEAP_SIZE = 5000 - не слишком много Не знаю сколько использует HEAP_SIZE sprintf , да и для irq 500 байт хватит, Увеличил когда возникли проблемы с sprintf, Проблемы похоже у многих с этим sprintf возникали из за не выровненного стека, маленького стека, вот и прибавил все. Как узнать с какими ключами собран gcc ?, какой ключ отвечает за работу "градаций" функционала printf? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба А у вас вообще malloc() работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба Странно получается не работает, а sprintf с целыми числами и строками работает. dynamic_array = malloc(100 * sizeof(float)); if(!dynamic_array) {sprintf(&BufLcdBot[0],"%s","malloc ne rabotaet"); LCD_Print(&BufLcdBot[0],24,0x40, FLAGCSRTYPE_CSRNO_BLINKNO); }else{ sprintf(&BufLcdBot[0],"%s","malloc rabotaet"); LCD_Print(&BufLcdBot[0],24,0x40, FLAGCSRTYPE_CSRNO_BLINKNO); } free(dynamic_array); dynamic_array = NULL; Вот функция sbrk может она неправильный адрес возвращает, как проверить,уже не знаю ? caddr_t _sbrk(int incr) { caddr_t prevHeap; caddr_t nextHeap; if (heap == NULL) { // first allocation heap = (caddr_t) & _heap; } prevHeap = heap; // Always return data aligned on a 8 byte boundary nextHeap = (caddr_t) (((unsigned int) (heap + incr) + 7) & ~7); // Check enough space and there is no collision with stack coming the other way // if stack is above start of heap if (nextHeap >= (caddr_t) & _eheap) { errno = ENOMEM; return NULL; // error - no more memory } else { heap = nextHeap; return (caddr_t) prevHeap; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба .heap : { _heap = .; . = ALIGN(4); . = HEAP_SIZE; . = ALIGN(4); _eheap = .; . = ALIGN(4); }>RAM Попробуйте заменить строчку . = HEAP_SIZE; на . += HEAP_SIZE; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба heap Расположен после стека, может наооборот сделать, как правильнее?Буквально вчера применил printf и sprintf. Голый yagarto 20091223. Сналала выругался на отсутствие _sbrk. Спросил гуглю, гугля посоветовал вот такое: http://embdev.net/topic/129753. sprintf заработал, но мама дорогая! Он добавил 40 килограммов кода, откусил около кило ОЗУ, подтянул динамическое распределение памяти и прочее. sscanf в AT91SAM7S64 уже не влез - он позвал с собой lseek и кучу других функций. Нахрена в sscanf lseek? Сижу, чешу репу - есть ли более легковесный вариант библиотеки или придется свой vsprintf подцеплять? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 16 апреля, 2010 Опубликовано 16 апреля, 2010 · Жалоба В кейле для кортексов юзаю vsprintf постоянно. Полновесный вариант весит около 8 килобайт, урезанный _vsprintf без поддержки плавучки 5 кило. Что то сомневаюсь, что эта функция пользуется malloc и кучей, ей стёка что ли мало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться