Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

lpc1114 - printf nie działa

DokDaniel1993 26 Mar 2017 18:13 903 13
  • #1 26 Mar 2017 18:13
    DokDaniel1993
    Poziom 3  

    Mam problem by użyć funkcje printf, dodałem bibliotekę stdio.h i nadal w konsoli lpcxpresso pełno błedów

    Code:
    18:04:31 **** Incremental Build of configuration Debug for project HC-SR04 ****
    
    make -r all
    Building file: ../src/HC-SR04.c
    Invoking: MCU C Compiler
    arm-none-eabi-gcc -DDEBUG -D__CODE_RED -DCORE_M0 -D__USE_CMSIS=CMSIS_CORE_LPC11xx -D__LPC11XX__ -D__REDLIB__ -I"D:\Programowanie\LPC1114\CMSIS_CORE_LPC11xx\inc" -O0 -fno-common -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m0 -mthumb -specs=redlib.specs -MMD -MP -MF"src/HC-SR04.d" -MT"src/HC-SR04.o" -MT"src/HC-SR04.d" -o "src/HC-SR04.o" "../src/HC-SR04.c"
    ../src/HC-SR04.c: In function 'main':
    ../src/HC-SR04.c:55:18: warning: pointer targets in passing argument 1 of 'UARTSend' differ in signedness [-Wpointer-sign]
             UARTSend(bufor, ile_znakow); // wysyla string przez UART
                      ^
    In file included from ../src/HC-SR04.c:16:0:
    ../src/uart.h:66:6: note: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'char *'
     void UARTSend(uint8_t *BufferPtr, uint32_t Length);
          ^
    Finished building: ../src/HC-SR04.c
     
    Building target: HC-SR04.axf
    Invoking: MCU Linker
    arm-none-eabi-gcc -nostdlib -L"D:\Programowanie\LPC1114\CMSIS_CORE_LPC11xx\Debug" -Xlinker -Map="HC-SR04.map" -Xlinker --gc-sections -Xlinker -print-memory-usage -mcpu=cortex-m0 -mthumb -T "HC-SR04_Debug.ld" -o "HC-SR04.axf"  ./src/HC-SR04.o ./src/cr_startup_lpc11xx.o ./src/crp.o ./src/uart.o   -lCMSIS_CORE_LPC11xx
    Memory region         Used Size  Region Size  %age Used
            MFlash32:       11736 B        32 KB     35.82%
    c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(fpprintf.o): In function `printf':
    fpprintf.c:(.text.printf+0x38): undefined reference to `__sys_write'
    c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(_deferredlazyseek.o): In function `__flsbuf':
    _deferredlazyseek.c:(.text.__flsbuf+0x88): undefined reference to `__sys_istty'
    c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(_writebuf.o): In function `_Cwritebuf':
    _writebuf.c:(.text._Cwritebuf+0x16): undefined reference to `__sys_flen'
    _writebuf.c:(.text._Cwritebuf+0x26): undefined reference to `__sys_seek'
    _writebuf.c:(.text._Cwritebuf+0x3c): undefined reference to `__sys_write'
    c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(alloc.o): In function `_Csys_alloc':
             RamLoc8:         416 B         8 KB      5.08%
    alloc.c:(.text._Csys_alloc+0xe): undefined reference to `__sys_write'
    alloc.c:(.text._Csys_alloc+0x12): undefined reference to `__sys_appexit'
    c:/nxp/lpcxpresso_8.2.2_650/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(fseek.o): In function `fseek':
    fseek.c:(.text.fseek+0x18): undefined reference to `__sys_istty'
    fseek.c:(.text.fseek+0x3c): undefined reference to `__sys_flen'
    collect2.exe: error: ld returned 1 exit status
    make: *** [HC-SR04.axf] Error 1

    18:04:31 Build Finished (took 394ms)

    mój program
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Chciałbym pozbyć się w main funkcji UARTSend i uzywać tylko printf, wtedy nie musiałbym sam formatować stringu.

    0 13
  • #2 26 Mar 2017 20:42
    BlueDraco
    Specjalista - Mikrokontrolery

    1. stdio.h NIE jest żadną biblioteką. Nie dodałeś biblioteki, tylko włączyłeś plik nagłówkowy.
    2. Funkcja printf pisze na urządzenie standardowe STDOUT. W komputerze z Linuksem czy Windows jest to konsola - okno na ekranie. Jak zdefiniowałeś urządzenie STDOUT w swoim projekcie?
    3. Tego pytania by nie było, gdybyś poczytał cokolwiek o implementacji printf w środowisku, którego używasz. Z całą pewnością jest opisane w dokumentacji, co musi zrobić programista, żeby printf zadziałał. Pewnym naprowadzeniem jest lektura raportów o błędach, które zacytowałeś. Wyciągnąłeś z nich jakieś wnioski?

    0
  • Pomocny post
    #3 26 Mar 2017 21:13
    grko
    Poziom 32  

    2. Jak już się czepiamy szczegołów to funkcja printf pisze do pliku (o nazwie stdout) a nie do urządzenia.

    @DokDaniel1993 Z tych błędów, które pokazałeś wynika, że brakuje Ci implemenacji tak zwanych syscalls wymaganych przez bibliotekę libcr_c.a.
    https://www.lpcware.com/content/forum/error-in-compiling-but-i-dont-understand-where
    http://www.support.code-red-tech.com/CodeRedWiki/UndefinedReference

    Z tego co widze, to możesz zamienić bibliotekę standardową na newlib. Wtedy będziesz mógł wziąć sobie implementację syscalls ze strony FCh.

    0
  • Pomocny post
    #4 26 Mar 2017 21:47
    michalko12
    Specjalista - Mikrokontrolery

    grko napisał:
    2. Jak już się czepiamy szczegołów to funkcja printf pisze do pliku (o nazwie stdout) a nie do urządzenia.


    Ja bym odstawał przy strumieniach, a strumienie mogą być kierowane do plików, urządzeń itp.

    https://community.nxp.com/thread/389140
    Cytat:
    Redlib

    To retarget Redlib's printf(), you need to provide your own implementations of the function __sys_write():
    int __sys_write(int iFileHandle, char *pcBuffer, int iLength)
    Function returns number of unwritten bytes if error, otherwise 0 for success
    Similarly if you want to retarget scanf(), you need to provide your own implementations of the function __sys_readc():
    int __sys_readc(void)
    Function returns character read
    Note that these two functions effectively map directly onto the underlying "semihosting" operations.

    Newlib

    To retarget printf(), you will need to provide your own implementation of the Newlib system function _write():
    int _write(int iFileHandle, char *pcBuffer, int iLength)
    Function returns number of unwritten bytes if error, otherwise 0 for success
    To retarget scanf, you will need to provide your own implementation of the Newlib system function _read():
    int _read(int iFileHandle, char *pcBuffer, int iLength)
    Function returns number of characters read, stored in pcBuffer


    https://www.lpcware.com/faq

    0
  • #5 26 Mar 2017 23:43
    2675900
    Użytkownik usunął konto  
  • Pomocny post
    #6 27 Mar 2017 00:11
    michalko12
    Specjalista - Mikrokontrolery

    Using printf()

    Cytat:
    By default, the printf function outputs text to the debug console using the "semihosting" mechanism.




    How to use ITM Printf

    0
  • #7 28 Mar 2017 18:55
    DokDaniel1993
    Poziom 3  

    Dzięki za podpowiedzi ale nie do końca pomogły bo w terminalu są śmieci jak używam printf.
    Mój kod wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    program skompilował się tak
    Code:
    18:41:39 **** Incremental Build of configuration Debug for project HC-SR04 ****
    
    make -r all
    Building file: ../src/HC-SR04.c
    Invoking: MCU C Compiler
    arm-none-eabi-gcc -DDEBUG -D__CODE_RED -DCORE_M0 -D__USE_CMSIS=CMSIS_CORE_LPC11xx -D__LPC11XX__ -D__REDLIB__ -I"D:\Programowanie\LPC1114\CMSIS_CORE_LPC11xx\inc" -O0 -fno-common -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m0 -mthumb -specs=redlib.specs -MMD -MP -MF"src/HC-SR04.d" -MT"src/HC-SR04.o" -MT"src/HC-SR04.d" -o "src/HC-SR04.o" "../src/HC-SR04.c"
    ../src/HC-SR04.c: In function '__sys_write':
    ../src/HC-SR04.c:44:18: warning: passing argument 1 of 'UARTSend' makes pointer from integer without a cast [-Wint-conversion]
             UARTSend(pcBuffer[i], 1); // wysyla znak na UART
                      ^
    In file included from ../src/HC-SR04.c:16:0:
    ../src/uart.h:66:6: note: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'char'
     void UARTSend(uint8_t *BufferPtr, uint32_t Length);
          ^
    Finished building: ../src/HC-SR04.c
     
    Building file: ../src/cr_startup_lpc11xx.c
    Invoking: MCU C Compiler
    arm-none-eabi-gcc -DDEBUG -D__CODE_RED -DCORE_M0 -D__USE_CMSIS=CMSIS_CORE_LPC11xx -D__LPC11XX__ -D__REDLIB__ -I"D:\Programowanie\LPC1114\CMSIS_CORE_LPC11xx\inc" -O0 -fno-common -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m0 -mthumb -specs=redlib.specs -MMD -MP -MF"src/cr_startup_lpc11xx.d" -MT"src/cr_startup_lpc11xx.o" -MT"src/cr_startup_lpc11xx.d" -o "src/cr_startup_lpc11xx.o" "../src/cr_startup_lpc11xx.c"
    Finished building: ../src/cr_startup_lpc11xx.c
     
    Building file: ../src/crp.c
    Invoking: MCU C Compiler
    arm-none-eabi-gcc -DDEBUG -D__CODE_RED -DCORE_M0 -D__USE_CMSIS=CMSIS_CORE_LPC11xx -D__LPC11XX__ -D__REDLIB__ -I"D:\Programowanie\LPC1114\CMSIS_CORE_LPC11xx\inc" -O0 -fno-common -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m0 -mthumb -specs=redlib.specs -MMD -MP -MF"src/crp.d" -MT"src/crp.o" -MT"src/crp.d" -o "src/crp.o" "../src/crp.c"
    Finished building: ../src/crp.c
     
    Building file: ../src/uart.c




    Invoking: MCU C Compiler
    arm-none-eabi-gcc -DDEBUG -D__CODE_RED -DCORE_M0 -D__USE_CMSIS=CMSIS_CORE_LPC11xx -D__LPC11XX__ -D__REDLIB__ -I"D:\Programowanie\LPC1114\CMSIS_CORE_LPC11xx\inc" -O0 -fno-common -g3 -Wall -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m0 -mthumb -specs=redlib.specs -MMD -MP -MF"src/uart.d" -MT"src/uart.o" -MT"src/uart.d" -o "src/uart.o" "../src/uart.c"
    ../src/uart.c: In function 'UARTInit':
    ../src/uart.c:288:19: warning: variable 'regVal' set but not used [-Wunused-but-set-variable]
     volatile uint32_t regVal;
                       ^
    Finished building: ../src/uart.c
     
    Building target: HC-SR04.axf
    Invoking: MCU Linker
    arm-none-eabi-gcc -nostdlib -L"D:\Programowanie\LPC1114\CMSIS_CORE_LPC11xx\Debug" -Xlinker -Map="HC-SR04.map" -Xlinker --gc-sections -Xlinker -print-memory-usage -mcpu=cortex-m0 -mthumb -T "HC-SR04_Debug.ld" -o "HC-SR04.axf"  ./src/HC-SR04.o ./src/cr_startup_lpc11xx.o ./src/crp.o ./src/uart.o   -lCMSIS_CORE_LPC11xx
    Memory region         Used Size  Region Size  %age Used
            MFlash32:       12408 B        32 KB     37.87%
             RamLoc8:         420 B         8 KB      5.13%
    Finished building target: HC-SR04.axf
     
    make --no-print-directory post-build
    Performing post-build steps
    arm-none-eabi-size "HC-SR04.axf" ; arm-none-eabi-objcopy -v -O binary "HC-SR04.axf" "HC-SR04.bin" ; checksum -p LPC1114_302 -d "HC-SR04.bin" ; arm-none-eabi-objcopy -v -O ihex "HC-SR04.axf" "HC-SR04.hex"
       text      data       bss       dec       hex   filename
      12400         8       412     12820      3214   HC-SR04.axf
    copy from `HC-SR04.axf' [elf32-littlearm] to `HC-SR04.bin' [binary]
    Written checksum 0xefffdb1d at offset 0x1c in file HC-SR04.bin
    Previous value 0xefffdb1d at offset 0x1c in file HC-SR04.bin
    copy from `HC-SR04.axf' [elf32-littlearm] to `HC-SR04.hex' [ihex]
     

    18:41:40 Build Finished (took 1s.109ms)

    kod za uart nie jest mój pobrałem go z tego miejsca https://www.lpcware.com/content/nxpfile/sampl...undle-lpc11xx-peripherals-using-keils-mdk-arm
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 28 Mar 2017 19:01
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Przecież masz odpowiedź przed oczami!

    DokDaniel1993 napisał:
    ../src/HC-SR04.c:44:18: warning: passing argument 1 of 'UARTSend' makes pointer from integer without a cast [-Wint-conversion]


    Kod który ma warningi nie jest "dobry" ani "prawie dobry". Zwykle jest błędny. Dokładnie tak jak w Twoim przypadku. Opcja -Werror powinna być domyślnie włączona, a kompilator powinien umożliwiać wyłączenie jej dopiero po zdaniu szybkiego testu z zaawansowanych aspektów języka C...

    0
  • #9 28 Mar 2017 19:40
    DokDaniel1993
    Poziom 3  

    Zaznaczyłem tą opcje to nie kompiluje się:(

    Code:
    Building file: ../src/HC-SR04.c
    
    Invoking: MCU C Compiler
    arm-none-eabi-gcc -DDEBUG -D__CODE_RED -DCORE_M0 -D__USE_CMSIS=CMSIS_CORE_LPC11xx -D__LPC11XX__ -D__REDLIB__ -I"D:\Programowanie\LPC1114\CMSIS_CORE_LPC11xx\inc" -O0 -fno-common -g3 -Wall -Werror -c -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m0 -mthumb -specs=redlib.specs -MMD -MP -MF"src/HC-SR04.d" -MT"src/HC-SR04.o" -MT"src/HC-SR04.d" -o "src/HC-SR04.o" "../src/HC-SR04.c"
    ../src/HC-SR04.c: In function '__sys_write':
    ../src/HC-SR04.c:45:18: error: passing argument 1 of 'UARTSend' makes pointer from integer without a cast [-Werror=int-conversion]
             UARTSend(pcBuffer[i], 1); // wysyla znak na UART
                      ^
    In file included from ../src/HC-SR04.c:16:0:
    ../src/uart.h:66:6: note: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'char'
     void UARTSend(uint8_t *BufferPtr, uint32_t Length);
          ^
    cc1.exe: all warnings being treated as errors
    make: *** [src/HC-SR04.o] Error 1

    19:39:06 Build Finished (took 244ms)

    0
  • Pomocny post
    #10 28 Mar 2017 19:51
    michalko12
    Specjalista - Mikrokontrolery

    Podmień funkcję __sys_write()
    na:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #12 28 Mar 2017 21:35
    Badmaneq
    Poziom 23  

    DokDaniel1993 napisał:
    Memory region Used Size Region Size %age Used
    MFlash32: 12408 B 32 KB 37.87%
    RamLoc8: 420 B 8 KB 5.13%

    Jak widzisz sporo printf zajmuję pamięci, dodaj do projektu symbol CR_INTEGER_PRINTF co spowoduje znaczne zmniejszenie objętości kodu wynikowego. Jednak nie ma nic za darmo, printf przestanie obsługiwać float ale bez liczb zmienno przecinkowych można się obejść korzystając wyłącznie z całkowitych.

    0
  • #13 29 Mar 2017 18:57
    DokDaniel1993
    Poziom 3  

    dałem na poczatku programu #define CR_INTEGER_PRINTF ale rozmiar nie został zmieniony.

    0
  • #14 29 Mar 2017 21:56
    Badmaneq
    Poziom 23  

    Symbol musisz przekazać kompilatorowi, np.
    gcc -DDEBUG -D__CODE_RED -DCORE_M0 -D__USE_CMSIS=CMSIS_CORE_LPC11xx -D__LPC11XX__ -D__REDLIB__

    0