Перейти к содержанию
    

Где можно посмотреть исходник sprintf, библиотечная работает, только с целыми значениями, а если нужно %f зависает все ,где искать причину не знаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где можно посмотреть исходник sprintf, библиотечная работает, только с целыми значениями, а если нужно %f зависает все ,где искать причину не знаю?

ЧТо за компилятор, что за среда, какие настройки библиотеки?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>ЧТо за компилятор, что за среда, какие настройки библиотеки?

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

 

Компилятор 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 = .

Изменено пользователем sergey sva

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот что говорит на -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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня тоже висло все из за printf %f в keil. Помогло увеличение стека. Но потом чтобы за зря слишком много памяти не расходовать стал обходится без printf %f

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

printf() обычно имеет несколько "градаций" функционала, которые определяются заданными ключами при компиляции.

Почитайте документацию на библиотеки

heapsize 5000байт

Хип и стек - вообще-то не одно и то же, скорее даже совершенно параллельные вещи, так что проверьте ещё и стек

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хип и стек - вообще-то не одно и то же, скорее даже совершенно параллельные вещи, так что проверьте ещё и стек

Понимаю, в стек сохраняются содержимое регистров , регистра указателя, режим ядра.

В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Навскидку - все правильно. Совет - на IRQ_STACK_SIZE = 10000 - не многовато ли? Какие такие локальные массивы и структуры используются в прерываниях? HEAP_SIZE = 5000 - не слишком много.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Навскидку - все правильно. Совет - на IRQ_STACK_SIZE = 10000 - не многовато ли? Какие такие локальные массивы и структуры используются в прерываниях? HEAP_SIZE = 5000 - не слишком много

Не знаю сколько использует HEAP_SIZE sprintf , да и для irq 500 байт хватит, Увеличил когда возникли проблемы с sprintf,

Проблемы похоже у многих с этим sprintf возникали из за не выровненного стека, маленького стека, вот и прибавил все.

Как узнать с какими ключами собран gcc ?, какой ключ отвечает за работу "градаций" функционала printf?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно получается не работает, а 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;
    }
}

 

 

post-27923-1271422170_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

     .heap : {
                 _heap = .;
                 . = ALIGN(4);
                 . = HEAP_SIZE;
                 . = ALIGN(4);
                _eheap = .;
                 . = ALIGN(4);
         }>RAM

 

Попробуйте заменить строчку

         . = HEAP_SIZE;

на

         . += HEAP_SIZE;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

heap Расположен после стека, может наооборот сделать, как правильнее?
Буквально вчера применил printf и sprintf. Голый yagarto 20091223. Сналала выругался на отсутствие _sbrk. Спросил гуглю, гугля посоветовал вот такое: http://embdev.net/topic/129753. sprintf заработал, но мама дорогая! Он добавил 40 килограммов кода, откусил около кило ОЗУ, подтянул динамическое распределение памяти и прочее. sscanf в AT91SAM7S64 уже не влез - он позвал с собой lseek и кучу других функций. Нахрена в sscanf lseek? Сижу, чешу репу - есть ли более легковесный вариант библиотеки или придется свой vsprintf подцеплять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В кейле для кортексов юзаю vsprintf постоянно.

Полновесный вариант весит около 8 килобайт, урезанный _vsprintf без поддержки плавучки 5 кило.

 

Что то сомневаюсь, что эта функция пользуется malloc и кучей, ей стёка что ли мало?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...