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

[STM32] [STM32][Eclipse][OpenOCD] - Gdzie zadeklarować `vi16 __errno` dla acos i sqrt?

infospec 27 Maj 2014 10:41 3504 26
REKLAMA
  • #1 13637869
    infospec
    Poziom 10  
    Posty: 46
    Próbuję użyć funkcji acos oraz sqrt dostaję taki komunikat:
    
    ...thumb2\libm.a(lib_a-w_acos.o): In function `acos':w_acos.c:(.text+0x94): undefined reference to `__errno'
    ...lib/thumb2\libm.a(lib_a-w_sqrt.o): In function `sqrt':w_sqrt.c:(.text+0x78): undefined reference to `__errno'
    
    

    próbowałem zgodnie ze wskazówkami dodać opcje -lm -lc właśnie w takiej kolejności
    
    arm-none-eabi-gcc -T"C:\workspaceSTM\usb\startup\stm32f4xx_flash.ld" -Wl,-Map,usb.map -lm -lc -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "usb.elf"  ./usb/otg/src/usb_bsp.o ./usb/otg/src/usb_.....
    

    efekt jest taki sam. Znalazłem wątek
    Link
    w którym kolega wikktor rozwiązał problem poprzez deklarację
    vi16 __errno; 

    Pytanie gdzie tę deklaracje wpisać?
  • REKLAMA
  • #2 13637876
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Cytat:
    [STM32][Eclipse][OpenOCD]

    Absolutnie każda z tych informacji które podałeś nie ma żadnego znaczenia dla Twojego problemu. Jedyne co jest istotne to kompilator (toolchain) jakiego używasz i komendy jakimi kompilujesz całość.

    P.S. "Rozwiązanie" które ktoś znalazł to nie żadne rozwiązanie, bo __errno to funkcja, a nie zmienna.

    4\/3!!
  • #3 13637887
    infospec
    Poziom 10  
    Posty: 46
    kompilator to arm-none-eabi-gcc a komenda
    
    -DSTM32F4XX -I"C:\workspaceSTM\usb\base" -I"C:\workspaceSTM\usb\usb\dev\core\inc" -I"C:\workspaceSTM\usb\usb\dev\class\hid\inc" -I"C:\workspaceSTM\usb\usb\otg\inc" -O0 -Wall -std=gnu99 -Wa,-adhlns="$@.lst" -c -fmessage-length=0 -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2
    .

    P.S.
    to dlaczego ta deklaracja niby zadziałała?
  • #4 13637898
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    infospec napisał:
    kompilator to arm-none-eabi-gcc

    Są setki wersji takiego kompilatora.

    infospec napisał:
    P.S.
    to dlaczego ta deklaracja niby zadziałała?

    To że nie pokazuje się błąd linkowania nie oznacza że problem jest rozwiązany. No bo nic nie stoi na przeszkodzie, żeby "wywołać" zmienną, czego efekt oczywiście będzie tragiczny.

    4\/3!!
  • REKLAMA
  • #5 13637908
    infospec
    Poziom 10  
    Posty: 46
    ARM Windows GCC (Sourcery G++ Lite)
  • #6 13637920
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Przestań używać tego kompilatora i problem zniknie.

    Kopiując z innego wątku - Jeśli nie jesteś z tym pakietem bardzo zżyty, to spróbuj albo "linaro" ( https://launchpad.net/gcc-arm-embedded ), albo bleeding-edge-toolchain ( http://www.freddiechopin.info/pl/artykuly/35-arm/87-bleeding-edge-toolchain-o-co-chodzi ).

    Przykładowo w jakimś moim projekcie:

    
    00015eb8 <__errno>:
       15eb8:	4b01      	ldr	r3, [pc, #4]	; (15ec0 <__errno+0x8>)
       15eba:	6818      	ldr	r0, [r3, #0]
       15ebc:	4770      	bx	lr
       15ebe:	bf00      	nop
       15ec0:	10005f3c 	.word	0x10005f3c


    4\/3!!
  • #7 13637975
    infospec
    Poziom 10  
    Posty: 46
    Ok zmienię na bleeding-edge-toolchain i zobaczymy. Nawiasem nie bardzo chce mi się wierzyć, że z moim kompilatorem nikt nie miał problemów z tymi funkcjami.
  • #8 13637994
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Nikt poza Tobą już chyba z niego nie korzysta :)

    Btw. Skoro masz STMF4 to polecam korzystać z FPU...
  • #9 13638091
    infospec
    Poziom 10  
    Posty: 46
    Ok. Po zmianie dam znać o efektach

    Dodano po 1 [godziny] 40 [minuty]:

    no i jest problem
    undefined reference to `_exit'
    

    /gcc/arm-none-eabi/4.8.3/../..
    oraz to co wcześniej
  • REKLAMA
  • #10 13638583
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    syscalls......
  • #11 13638664
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    1. Dodaj do swojego projektu syscalls, np. z mojej stronki > Download > ARM > Różne. Zapewne będziesz musiał wyłączyć tymczasowo funkcję _sbrk_r().

    2. Wrzuć pełny log kompilacji.

    4\/3!!
  • #12 13640577
    infospec
    Poziom 10  
    Posty: 46
    dołączam loga z kompilacji przed dodaniem syscalls
    23:57:28 **** Incremental Build of configuration Debug for project usb_spi_master2 ****
    cs-make all 
    'Building target: usb_spi_master2.elf'
    'Invoking: ARM Sourcery Windows GCC C Linker'
    arm-none-eabi-gcc -T"C:\workspaceSTM\usb_spi_master2\startup\stm32f4xx_flash.ld" -Wl,-Map,usb_spi_master2.map -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "usb_spi_master2.elf"  ./usb/otg/src/usb_bsp.o ./usb/otg/src/usb_core.o ./usb/otg/src/usb_dcd.o ./usb/otg/src/usb_dcd_int.o  ./usb/dev/core/src/usbd_core.o ./usb/dev/core/src/usbd_desc.o ./usb/dev/core/src/usbd_ioreq.o ./usb/dev/core/src/usbd_req.o ./usb/dev/core/src/usbd_usr.o  ./usb/dev/class/hid/src/usbd_hid_core.o  ./startup/startup_stm32f40xx.o  ./base/init.o ./base/scara.o ./base/stm32f4_discovery.o ./base/system_stm32f4xx.o  ./main.o   
    c:/arm/toolchain/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a(lib_a-exit.o): In function `exit':
    exit.c:(.text.exit+0x16): undefined reference to `_exit'
    c:/arm/toolchain/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7e-m\libm.a(lib_a-w_acos.o): In function `acos':
    w_acos.c:(.text.acos+0x82): undefined reference to `__errno'
    w_acos.c:(.text.acos+0x8c): undefined reference to `__errno'
    c:/arm/toolchain/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7e-m\libm.a(lib_a-w_sqrt.o): In function `sqrt':
    w_sqrt.c:(.text.sqrt+0x90): undefined reference to `__errno'
    w_sqrt.c:(.text.sqrt+0x9a): undefined reference to `__errno'
    collect2.exe: error: ld returned 1 exit status
    cs-make: *** [usb_spi_master2.elf] Error 1
    
    23:57:30 Build Finished (took 1s.351ms)
    

    oraz po dodaniu syscalls
    
    00:02:03 **** Incremental Build of configuration Debug for project usb_spi_master2 ****
    cs-make all 
    'Building file: ../base/syscalls.c'
    'Invoking: ARM Sourcery Windows GCC C Compiler'
    arm-none-eabi-gcc -DSTM32F4XX -I"C:/workspaceSTM/usb_spi_master2\base" -I"C:/workspaceSTM/usb_spi_master2\usb\dev\class\hid\inc" -I"C:/workspaceSTM/usb_spi_master2\usb\otg\inc" -I"C:/workspaceSTM/usb_spi_master2\usb\dev\core\inc" -O0 -Wall -std=gnu99 -Wa,-adhlns="base/syscalls.o.lst" -c -fmessage-length=0 -MMD -MP -MF"base/syscalls.d" -MT"base/syscalls.d" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "base/syscalls.o" "../base/syscalls.c"
    'Finished building: ../base/syscalls.c'
    ' '
    'Building target: usb_spi_master2.elf'
    'Invoking: ARM Sourcery Windows GCC C Linker'
    arm-none-eabi-gcc -T"C:\workspaceSTM\usb_spi_master2\startup\stm32f4xx_flash.ld" -Wl,-Map,usb_spi_master2.map -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "usb_spi_master2.elf"  ./usb/otg/src/usb_bsp.o ./usb/otg/src/usb_core.o ./usb/otg/src/usb_dcd.o ./usb/otg/src/usb_dcd_int.o  ./usb/dev/core/src/usbd_core.o ./usb/dev/core/src/usbd_desc.o ./usb/dev/core/src/usbd_ioreq.o ./usb/dev/core/src/usbd_req.o ./usb/dev/core/src/usbd_usr.o  ./usb/dev/class/hid/src/usbd_hid_core.o  ./startup/startup_stm32f40xx.o  ./base/init.o ./base/scara.o ./base/stm32f4_discovery.o ./base/syscalls.o ./base/system_stm32f4xx.o  ./main.o   
    ./base/syscalls.o: In function `_sbrk_r':
    C:\workspaceSTM\usb_spi_master2\Debug/../base/syscalls.c:409: undefined reference to `__heap_end'
    ./base/syscalls.o:(.data+0x4): undefined reference to `__heap_start'
    c:/arm/toolchain/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7e-m\libm.a(lib_a-w_acos.o): In function `acos':
    w_acos.c:(.text.acos+0x82): undefined reference to `__errno'
    w_acos.c:(.text.acos+0x8c): undefined reference to `__errno'
    c:/arm/toolchain/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7e-m\libm.a(lib_a-w_sqrt.o): In function `sqrt':
    w_sqrt.c:(.text.sqrt+0x90): undefined reference to `__errno'
    w_sqrt.c:(.text.sqrt+0x9a): undefined reference to `__errno'
    collect2.exe: error: ld returned 1 exit status
    cs-make: *** [usb_spi_master2.elf] Error 1
    
    00:02:05 Build Finished (took 2s.683ms)
    


    jak wyłączyć funkcję _sbrk_r()?

    ten błąd `__heap_end' i `__heap_start' jest właśnie w funkcji `_sbrk_r'
  • #13 13640908
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    infospec napisał:
    jak wyłączyć funkcję _sbrk_r()?

    Zajrzałeś choć do tego pliku syscalls.c?

    Co do meritum - u mnie to co chcesz osiągnąć "po prostu działa" i nie było z tym nigdy żadnego problemu. Tyle że ja nie używam plugina który generuje Makefile - mam swój plik Makefile, stworzony "ręcznie". Z drugiej strony u mnie kompilacja wygląda podobnie:

     97) [0.248s] lwIP\apps\telnet: arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -Os -f
    function-sections -fdata-sections -Wall -Wextra -Wshadow -std=gnu++11 -g -ggdb3
    -fno-rtti -fno-exceptions -I. -I..\..\.. -I..\..\../FatFS -I..\..\../FreeRTOS/in
    clude -I..\..\../FreeRTOS/portable/GCC/ARM_CM3 -I..\..\../hash/blake256 -I..\..\
    ../inc -I..\..\../lwIP/include -I..\..\../lwIP/include/ipv4  -c telnet.cpp -o ..
    \..\../out\telnet.o
     98) [0.890s] arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -TLPC1758_59_67_68_69_ro
    m.ld -g -Wl,-Map=./out/xxx.map,--cref -Wl,--gc-sect
    ions <pliki obiektowe> -o ./out\xxx.elf


    Zacznij może od zredukowania problemu do minimum - czyli do stworzenia mini-projektu w którym jest minimalna ilość kodu powodująca błąd. Taki projekt możesz wtedy tutaj wrzucić.

    4\/3!!
  • #14 13643965
    infospec
    Poziom 10  
    Posty: 46
    No i wyszło szydło z worka. Tak ja mi doradziłeś zrobiłem nowy projekt i tylko wstawiłem te dwie funkcje. Okazało się, że jak kod wygląda jak niżej to jest ok, program kompiluje się prawidłowo
    
    double test1 = acos(0.5);
    double test2 = sqrt(0.5);
    

    a jak tak to zaczynają się problemy i błędy jak wcześniej
    
    double temp=0.5;
    double test1 = acos(temp);
    double test2 = sqrt(temp);
    

    o co w tym biega? Jak więc do powyższych funkcji wstawiać wartości poprzez zmienne? Może jakiś przykład który u ciebie działał.

    P.S.

    
    Zajrzałeś choć do tego pliku syscalls.c? 
    

    tak i #if SYSCALLS_HAVE_SBRK_R == 1 na 0 nie wpływa na błędy są takie same
  • #15 13644086
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    infospec napisał:
    o co w tym biega?

    Pierwszy przykład jaki pokazałeś kompilator najprawdopodobniej optymalizuje, bo wie ile wynosi wynik, więc w ogóle nie ma żadnych wywołań funkcji.

    infospec napisał:
    Może jakiś przykład który u ciebie działał.

    Bierzesz z mojej stronki przykład-szablon (ja wziąłem ten dla stm32f103, ale to bez znaczenia - po prostu akurat był pod ręką), wrzucasz do niego Twój kod i działa...

    make all 
    Compiling file: main.c
    arm-none-eabi-gcc -c -mcpu=cortex-m3 -mthumb -O0 -ffunction-sections -fdata-sections -Wall -Wstrict-prototypes -Wextra -std=gnu89 -g -ggdb3 -fverbose-asm -Wa,-ahlms=out/main.lst -DSTM32F10X_MD -MD -MP -MF out/main.d -I.  main.c -o out/main.o
    main.c: In function 'main':
    main.c:90:9: warning: unused variable 'test2' [-Wunused-variable]
      double test2 = sqrt(temp);
             ^
    main.c:89:9: warning: unused variable 'test1' [-Wunused-variable]
      double test1 = acos(temp);
             ^
     
    Linking target: out/stm32_blink_led.elf
    arm-none-eabi-g++ -mcpu=cortex-m3 -mthumb -TSTM32F103xB_rom.ld -g -Wl,-Map=out/stm32_blink_led.map,--cref,--no-warn-mismatch -Wl,--gc-sections -nostartfiles  out/startup.o out/main.o out/vectors.o out/gpio.o    -o out/stm32_blink_led.elf
     
    Creating extended listing: out/stm32_blink_led.lss
    arm-none-eabi-objdump -S out/stm32_blink_led.elf > out/stm32_blink_led.lss
     
    Creating memory dump: out/stm32_blink_led.dmp
    arm-none-eabi-objdump -x --syms out/stm32_blink_led.elf > out/stm32_blink_led.dmp
     
    Creating IHEX image: out/stm32_blink_led.hex
    arm-none-eabi-objcopy -O ihex out/stm32_blink_led.elf out/stm32_blink_led.hex
     
    Creating binary image: out/stm32_blink_led.bin
    arm-none-eabi-objcopy -O binary out/stm32_blink_led.elf out/stm32_blink_led.bin
     
    Size of modules:
    arm-none-eabi-size -B -t --common out/startup.o out/main.o out/vectors.o out/gpio.o   
       text	   data	    bss	    dec	    hex	filename
        104	      0	      0	    104	     68	out/startup.o
        388	      0	      0	    388	    184	out/main.o
        320	      0	      0	    320	    140	out/vectors.o
        244	      0	      0	    244	     f4	out/gpio.o
       1056	      0	      0	   1056	    420	(TOTALS)
     
    Size of target .elf file:
    arm-none-eabi-size -B out/stm32_blink_led.elf
       text	   data	    bss	    dec	    hex	filename
       5340	    104	   1024	   6468	   1944	out/stm32_blink_led.elf
     
    
    08:16:32 Build Finished (took 1s.189ms)


    	double temp=0.5;
     80001b8:	f04f 0200 	mov.w	r2, #0
     80001bc:	4b18      	ldr	r3, [pc, #96]	; (8000220 <main+0x88>)
     80001be:	e9c7 2306 	strd	r2, r3, [r7, #24]
    	double test1 = acos(temp);
     80001c2:	e9d7 0106 	ldrd	r0, r1, [r7, #24]
     80001c6:	f000 f92b 	bl	8000420 <acos>
     80001ca:	e9c7 0104 	strd	r0, r1, [r7, #16]
    	double test2 = sqrt(temp);
     80001ce:	e9d7 0106 	ldrd	r0, r1, [r7, #24]
     80001d2:	f000 f979 	bl	80004c8 <sqrt>
     80001d6:	e9c7 0102 	strd	r0, r1, [r7, #8]
    ...
    080014bc <__errno>:
     80014bc:	4b01      	ldr	r3, [pc, #4]	; (80014c4 <__errno+0x8>)
     80014be:	6818      	ldr	r0, [r3, #0]
     80014c0:	4770      	bx	lr
     80014c2:	bf00      	nop
     80014c4:	20000064 	.word	0x20000064


    W moim przypadku syscalls nie są potrzebne.

    4\/3!!
  • #16 13644541
    infospec
    Poziom 10  
    Posty: 46
    Jest rozwiązanie. Należy
    
    #include<math.h>
    int __errno=0;
    

    i to w moim przypadku pomogło. Mam nadzieję, że komuś to również pomoże. Freddie Chopin wielkie dzięki za pomoc.
  • #17 13644557
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Tak jak napisałem w pierwszym poście - nie jest to żadne "rozwiązanie", bo jak widzisz po moim kodzie assemblera __errno to FUNKCJA, a nie zmienna. Więc jeśli kiedyś faktycznie trafi się w Twoich danych coś co wywoła błąd (np. obliczenia dla NAN czy INFINITY, pierwiastek dla liczby ujemnej czy coś takiego), to zaowocuje to "wywaleniem" się Twojego programu w sposób całkowicie niekontrolowany...

    4\/3!!
  • #18 13647857
    infospec
    Poziom 10  
    Posty: 46
    Na chwilę obecną nie mam innego więc po prostu trzeba będzie w programie zabezpieczać aby zmienna była we właściwym zakresie
  • #19 13647951
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    No jak nie chce Ci się szukać prawidłowego rozwiązania, to faktycznie go nie masz (; Wystarczyłoby np. wrzucić tutaj swój projekt (obcięty do minimum pokazującego błąd), albo spróbować zbudować testowy projekt w oparciu o przykład-szablon z mojej stronki, w którym to u mnie błąd nie występuje...

    4\/3!!
  • REKLAMA
  • #20 13650225
    infospec
    Poziom 10  
    Posty: 46
    Ok. Spróbuję w przyszłym tygodniu
  • #21 13658301
    infospec
    Poziom 10  
    Posty: 46
    Wracając do tematu stworzyłem nowy projekt i banalny programik
    Kod: text
    Zaloguj się, aby zobaczyć kod

    #include <math.h>
    int main(void)
    {
    double Temp1=4, Temp2=0.4;
    double E=acos(Temp2) ;
    double M=sqrt(Temp1);
    E=E+M;
    }
    [/syntax]
    i logi z kompilacji
    
    'Building target: f4_usb_timery.elf'
    'Invoking: ARM Sourcery Windows GCC C Linker'
    arm-none-eabi-gcc -T"C:\workspaceSTM\f4_usb_timery\startup\stm32f4xx_flash.ld" -L"C:\workspaceSTM\f4_usb_timery" -Wl,-Map,f4_usb_timery.map -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "f4_usb_timery.elf"  ./usb/otg/src/usb_bsp.o ./usb/otg/src/usb_core.o ./usb/otg/src/usb_dcd.o ./usb/otg/src/usb_dcd_int.o  ./usb/dev/core/src/usbd_core.o ./usb/dev/core/src/usbd_desc.o ./usb/dev/core/src/usbd_ioreq.o ./usb/dev/core/src/usbd_req.o ./usb/dev/core/src/usbd_usr.o  ./usb/dev/class/hid/src/usbd_hid_core.o  ./startup/startup_stm32f40xx.o  ./base/init.o ./base/scara.o ./base/stm32f4_discovery.o ./base/syscalls.o ./base/system_stm32f4xx.o  ./main.o   
    c:/arm/toolchain/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7e-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':
    /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk'
    c:/arm/toolchain/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7e-m\libm.a(lib_a-w_acos.o): In function `acos':
    /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libm/math/w_acos.c:108: undefined reference to `__errno'
    /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libm/math/w_acos.c:111: undefined reference to `__errno'
    c:/arm/toolchain/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/lib/armv7e-m\libm.a(lib_a-w_sqrt.o): In function `sqrt':
    /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libm/math/w_sqrt.c:83: undefined reference to `__errno'
    /home/freddie/bleeding-edge-toolchain/src/newlib/newlib/libm/math/w_sqrt.c:86: undefined reference to `__errno'
    collect2.exe: error: ld returned 1 exit status
    cs-make: *** [f4_usb_timery.elf] Error 1
    

    oczywiście funkcję _sbrk_r w pliku syscalls wyłączyłem
    
    SYSCALLS_HAVE_SBRK_R == 0
    

    dodam, że bez pliku syscalls log jest podobny tylko zamiast błędu funkcji `_sbrk' jest błąd funkcji `exit'. Dodam, że w pliku syscalls mam masę alarmów typu
    
    Assignment to itself 'signal = signal'	syscalls.c	/f4_usb_timery/base	line 271	Code Analysis Problem
    
  • #22 13658444
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    No to wyrzuć z projektu pozostałe 15 plików które teraz są zbędne i wrzuć tu cały ten projekt spakowany (bez plików wynikowych) - zobaczę u siebie.

    4\/3!!
  • #23 13658774
    infospec
    Poziom 10  
    Posty: 46
    zaraz wyślę

    Dodano po 5 [minuty]:

    idzie cały projekt
    Załączniki:
    • f4_usb_timery.zip (648.16 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #24 13659031
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Powiem tak... Jest dokładnie tak jak podejrzewałem - wziąłeś jakieś badziewne pliki (oczywiście od ST i z Atollica - czyli "najlepsze" co może być), no to nie dziwne że Ci nie działa...

    Na końcu skryptu linkera masz:

      /* Remove information from the standard libraries */
      /DISCARD/ :
      {
        libc.a ( * )
        libm.a ( * )
        libgcc.a ( * )
      }


    Czyli efekt jest całkowicie zgodny z oczekiwanym (; Niestety po wywaleniu tego dalej jest coś źle, ale nie chce mi się grzebać w tym projekcie, bo oczywiście żeby go skompilować to muszę w nim z 10 rzeczy zmieniać ciągle (swoją drogą - jak dla mnie ta magiczna wtyczka która tworzy Makefile jest również lewa całkowicie...).

    Tak jak napisałem wcześniej - gdy weźmiesz dobre pliki (mam na myśli np. pliki z mojego przykładu-szablonu - skrypt linkera, startup, ...) to problem nie istnieje. Jeśli chcesz bawić się z tymi plikami, to po support zgłoś się lepiej do twórców tego "dzieła", choć pewnie Cię oleją, bo:

    Cytat:
    ** Distribution: The file is distributed “as is,” without any warranty
    ** of any kind.


    A przy okazji:

    Cytat:
    ** (c)Copyright Atollic AB.
    ** You may use this file as-is or modify it according to the needs of your
    ** project. Distribution of this file (unmodified or modified) is not
    ** permitted
    .
    Atollic AB permit registered Atollic TrueSTUDIO(R) users the
    ** rights to distribute the assembled, compiled & linked contents of this
    ** file as part of an application binary file, provided that it is built
    ** using the Atollic TrueSTUDIO(R) toolchain
    .


    4\/3!!
  • #25 13662494
    infospec
    Poziom 10  
    Posty: 46
    Dzięki za zaangażowanie i cierpliwość co z kolei mnie zmobilizowało do poszukania rozwiązania. Jak zauważyłeś pliki konfiguracyjne pochodzą z biblioteki STM32F4xx_DSP_StdPeriph_Lib_V1.1.0 od ST więc podejrzewam, że powinny być w miarę poprane. To co napisałeś wskazywało dobrą drogę
    1. Dodaj do swojego projektu syscalls, ...

    okazuje się, że właśnie po dodaniu do projektu powyższego pliku projekt prawidłowo kompiluje się ale - jak zwykle - jest małe ale. Otóż prawidłowy plik syscalls jest właśnie w tej bibliotece. Nie wnikam czy Twój jest "lepszy" czy ten - najważniejsze, że działa.

    A swoją drogą zaciekawił mnie wątek
    Btw. Skoro masz STMF4 to polecam korzystać z FPU... 

    Mam pytanie jak procesor korzysta z FPU czy do wykorzystania tej jednostki do projektu trzeba dołączać dodatkowe biblioteki czy realizuje to automatycznie?. Jak to zrealizować, może jakiś mały przykładzik...
  • #26 13662854
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    infospec napisał:
    Jak to zrealizować, może jakiś mały przykładzik...

    Przykład-szablon dla STM32F4 z włączonym wszystkim co trzeba jest na mojej stronie (pewnie już od 3 lat) - jak dasz w nim obliczenia które są wspierane przez koprocesor (+, -, *, /, pierwiastek, ...) to zostaną one przeprowadzone przez koprocesor przy użyciu stosownych instrukcji. Użycie bardziej skomplikowanych rzeczy (np. funkcji trygonometrycznych) spowoduje użycie funkcji z biblioteki, ale skompilowanych tak aby korzystały z FPU.

    infospec napisał:
    Jak zauważyłeś pliki konfiguracyjne pochodzą z biblioteki STM32F4xx_DSP_StdPeriph_Lib_V1.1.0 od ST więc podejrzewam, że powinny być w miarę poprane

    Wiele osób wychodzi z tego założenia. Kod ten może i się kompiluje i nawet działa, jednak to wszystkie pozytywy jakie można o nim powiedzieć (;

    infospec napisał:
    Otóż prawidłowy plik syscalls jest właśnie w tej bibliotece.

    No jest tam taki plik - z taką samą formułką jak ta którą wkleiłem powyżej - zakaz dystrybucji i zakaz kompilacji czymś innym niż Atollic... Super pliki (;

    infospec napisał:
    Otóż prawidłowy plik syscalls jest właśnie w tej bibliotece.

    Funkcja _sbrk_r() musi być dostosowana do skryptu linkera, ponieważ potrzebuje ona definicji pamięci której ma używać.

    4\/3!!
  • #27 13678062
    infospec
    Poziom 10  
    Posty: 46
    Problem uważam za rozwiązany niemniej pobiorę sobie Twój szablon i postaram się skonfigurować środowisko do Twoich plików konfiguracyjnych. Dzięki za pomoc i pewnie jeszcze nie raz będę prosił o pomoc. Wielkie dzięki.

Podsumowanie tematu

✨ Użytkownik napotkał problem z funkcjami matematycznymi `acos` i `sqrt` w projekcie opartym na STM32, otrzymując komunikat o błędzie związanym z `__errno`. Po próbach dodania opcji kompilacji `-lm -lc`, które nie przyniosły rezultatu, zasugerowano, aby zadeklarować `int __errno=0;` w kodzie, co pomogło, ale nie było uznawane za prawidłowe rozwiązanie, ponieważ `__errno` jest funkcją, a nie zmienną. W trakcie dyskusji podano również, że użycie odpowiedniego kompilatora, takiego jak Linaro lub bleeding-edge-toolchain, może rozwiązać problem. Użytkownik odkrył, że optymalizacja kompilatora może wpływać na działanie funkcji, a także, że dodanie pliku `syscalls` do projektu jest kluczowe dla poprawnej kompilacji. Ostatecznie, po przetestowaniu różnych podejść, użytkownik uznał problem za rozwiązany, planując dalsze eksperymenty z FPU w STM32F4.
Wygenerowane przez model językowy.
REKLAMA