logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[STM32F4] Nieprawidłowo działająca funkcja atof()

kris_audi 25 Kwi 2013 11:25 2202 14
REKLAMA
  • #1 12237491
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    #include <stdlib.h>

    volatile float fliczba;
    volatile long lliczba;

    int main(void)
    {
    lliczba=atol("1000.0");
    fliczba=atof("1000.0");

    }

    Mam problem ponieważ funkcja atof zwraca cały czas wartość zero zamiast 1000.0.
    Natomiast funkcja atol działa prawidłowo zwracając wartość 1000.
    W czym tkwi problem?
  • REKLAMA
  • #2 12249108
    Marico
    Poziom 20  
    Posty: 409
    Pomógł: 28
    Ocena: 60
    Opisywane zachowanie może być spowodowane zlinkowaniem z (alernatywnym) libc , która z powodów objętościowych nie ma pełnej obłsugi double/float (zresztą atof powinien zwrócić double, nie float). Sprawdź, czy twój kompilator/środowisko/biblioteki są prawidłowo skonfigurowane/użyte do pracy z float/double.
  • #3 12336798
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    Nie mogę sobie sam poradzić z konfiguracją Eclipse Juno. Próbowałem dodać opcje linkera w Makefile "LD_FLAGS -lm, -u" ale nic to nie pomogło.
  • #4 12354194
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    Dodam, że działanie w programie

    fliczba=1.234+2.457;

    działa prawidłowo.
  • REKLAMA
  • #5 12354213
    imarszi
    Poziom 14  
    Posty: 150
    Pomógł: 6
    Ocena: 6
    Może napisz jeszcze jaki kompilator.
  • REKLAMA
  • #6 12354233
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    Używam kompilatora Linaro Bare-Metal wersja 4.7-2012.q4.
  • #7 12354265
    imarszi
    Poziom 14  
    Posty: 150
    Pomógł: 6
    Ocena: 6
    Włączasz FPU ? Jakie opcje kompilatora i linkiera ?
  • #8 12354289
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    Włączam obsługę FPU

    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));

    oraz opcje kompilatora i linkera

    # core flags
    CORE_FLAGS = -mcpu=$(CORE) -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math

    # flags for C++ compiler
    CXX_FLAGS = -std=$(CXX_STD) -g -ggdb3 -fno-rtti -fno-exceptions -fverbose-asm -Wa,-ahlms=$(OUT_DIR_F)$(notdir $(<:.$(CXX_EXT)=.lst))

    # flags for C compiler
    C_FLAGS = -std=$(C_STD) -g -ggdb3 -fverbose-asm -Wa,-ahlms=$(OUT_DIR_F)$(notdir $(<:.$(C_EXT)=.lst))

    # flags for assembler
    AS_FLAGS = -g -ggdb3 -Wa,-amhls=$(OUT_DIR_F)$(notdir $(<:.$(AS_EXT)=.lst))

    # flags for linker
    LD_FLAGS = -T$(LD_SCRIPT) -g -Wl,-Map=$(OUT_DIR_F)$(PROJECT).map,--cref,--no-warn-mismatch

    # process option for removing unused code
    ifeq ($(REMOVE_UNUSED), 1)
    LD_FLAGS += -Wl,--gc-sections
    OPTIMIZATION += -ffunction-sections -fdata-sections
    endif
  • #9 12354316
    imarszi
    Poziom 14  
    Posty: 150
    Pomógł: 6
    Ocena: 6
    $(CORE) == cortex-m4 ?

    U mnie działa , a wszystko wygląda tak samo. Ja mam tylko nowsze Linaro (4.7-2013-q1-update)
  • #10 12354359
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    Tak CORE = cortex-m4.
  • REKLAMA
  • #12 12354470
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    Niestety po zainstalowaniu nowego kompilatora Linaro 4.7-2013q1 dalej jest źle.

    Dodano po 2 [godziny] 1 [minuty]:

    Okazało się, że mam jednak zainstalowany kompilator CodeSourcery. Myślałem, że
    jak zmienię ścieżki w Eclipse to wystarczy. Teraz zmieniłem ścieżkę systemową do kompilatora Linaro ale jest problem bo nie ma pliku cs-make.exe.

    Dodano po 21 [minuty]:

    Jak zmienię cs-make na make, to otrzymuję błędy:

    make all
    MAKE Version 5.2 Copyright (c) 1987, 1999 Inprise Corp.
    Error makefile 123: Command syntax error
    Error makefile 125: Command syntax error
    Error makefile 127: Command syntax error
    Error makefile 149: Command syntax error
    Error makefile 152: Command syntax error
    Error makefile 157: Command syntax error
    Error makefile 159: Command syntax error
    Error makefile 161: Command syntax error
    Error makefile 235: Too many rules for target ')/%.o'
    Error makefile 244: Too many rules for target ')/%.o'
    Error makefile 297: Command syntax error
    Error makefile 298: Command syntax error
    Error makefile 299: Command syntax error
    Error makefile 300: Command syntax error
    Error makefile 301: Command syntax error
    Error makefile 302: Command syntax error
    Error makefile 303: Command syntax error
    Error makefile 304: Command syntax error
    Error makefile 305: Command syntax error
    Error makefile 306: Command syntax error
    Error makefile 314: Colon expected
    Error makefile 317: Redefinition of target ','
    Error makefile 317: Redefinition of target '))'
    Error makefile 317: Redefinition of target ','
    Error makefile 317: Redefinition of target '))'
    Error makefile 317: Redefinition of target ','
    Error makefile 317: Redefinition of target '))'
    Error makefile 317: Command syntax error
    *** 28 errors during make ***
  • #13 12354970
    Konto nie istnieje
    Konto nie istnieje  
  • #15 12357819
    kris_audi
    Poziom 10  
    Posty: 40
    Pomógł: 1
    Coreutils miałem już zainstalowane ale okazało się, że mam jeszcze inny plik make, który używało sobie Eclipse. Teraz już funkcja atof działa prawidłowo. Dzięki za pomoc.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem z funkcją atof() w kontekście programowania na platformie STM32F4, gdzie funkcja ta zwracała wartość zero zamiast oczekiwanego 1000.0. Użytkownik zauważył, że funkcja atol() działała poprawnie. Odpowiedzi sugerowały, że problem mógł wynikać z nieprawidłowej konfiguracji środowiska kompilacji, w tym zlinkowania z alternatywną biblioteką libc, która nie obsługiwała float/double. Użytkownik używał kompilatora Linaro Bare-Metal 4.7-2012.q4 oraz włączał obsługę FPU. Po kilku próbach i zmianach w konfiguracji, w tym instalacji nowszej wersji kompilatora oraz poprawie ustawień makefile, problem został rozwiązany, a funkcja atof() zaczęła działać prawidłowo.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA