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

[Rozwiązano] FatFS R0.15 na Atmega 1284P: Błąd undefined reference to `mmc_disk_write`

Piernikowski.S 18 Lis 2024 17:26 147 6
  • #1 21308515
    Piernikowski.S
    Poziom 9  
    Witam
    Próbuje od jakiegoś czasu zaadoptować bibliotekę FatFSby ElmChan R0.15.
    Załączam oryginalną lib R0.15(zip) poniżej.
    Użyłem Atmegi 1284P Dip40 . Czytnik kart skonstruowałem sam (pod arduino libs działa).
    Jakie zmiany w kodzie zrobiłem:
    W oryginale Elm użył konfiguracji przez USART SPI – ja skonfigurowałem pod SPI
    W pliku ffconf.h:
    * dodałem dyrektywę „#define DRV_MMC 0” , żeby funkcje w diskio.c były wywoływane dla mmc_avr_spi.c i dodałem wpis „mmc_avr_spi.c” w sekcji: CSRC
    * zmieniłem #define FF_VOLUMES 2 na #define FF_VOLUMES 1
    W main. c używam funkcji:
    // Give a work area to the default drive
    if((f_mount(&FatFs[0], "", 1)) != FR_OK) { //if mount not succedes switch off the RED LED
    PORTA &= ~(1 << PA0);
    }

    , ale otrzymuje błąd jak build’uje :
    Compiling .pio\build\ATmega1284P\src\main.o
    Linking .pio\build\ATmega1284P\firmware.elf
    C:\Users\piern\AppData\Local\Temp\ccLykUVs.ltrans0.ltrans.o: In function `main':
    <artificial>.text.startup+0x4f0): undefined reference to `mmc_disk_write'
    <artificial>.text.startup+0x568): undefined reference to `mmc_disk_write'
    collect2.exe: error: ld returned 1 exit status
    *** [.pio\build\ATmega1284P\firmware.elf] Error 1

    Prześledziłem kolejność wywołań poszczególnych funkcji, aż do `mmc_disk_write' i wygląda to tak:
    f_mount(&FatFs[0], "", 1) -->
    res = mount_volume(&path, &fs, 0); -->
    fmt = find_volume(fs, LD2PT(vol)); -->
    fmt = check_fs(fs, 0); -->
    if (move_window(fs, sect) != FR_OK) -->
    res = sync_window(fs); -->
    if (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) -->
    DRESULT disk_write (BYTE pdrv, const BYTE *buff, LBA_t sector, UINT count) -->
    mmc_disk_write(buff, sector, count); - ta funkcja jest w pliku mmc_avr_spi.c

    Co może być przyczyną????
    Pozdrawiam
  • #2 21308867
    JacekCz
    Poziom 42  
    A masz plik źródłowy dołączony do projektu (na sposób stosownie do wersji środowiska C) ?
    Jakby to powiedzieć, elementarz C.
  • #3 21309833
    Piernikowski.S
    Poziom 9  
    Używam Platformio. Wszystkie pliki są w jednym worspace'u. Dyrektywy #include dodają odpowiednie nagłówki.
    diskio.h - jest interfacem dla poszczególnych rodzajów komunikacji (dla spi: mmc_avr_spi.c i mmc_avr.h oraz dla usart_spi: mmc_avr_usart.c i mmc_avr_h itd )z kartą SD - W mmc_avr.h są deklaracje funkcji, które są wywoływane w diskio.c zależnie od dodania dyrektywy #define DRV_MMC 0 lub #define DRV_CFC=0 w pliku konfiguracyjnym ffconf.h

    Dodano po 2 [minuty]:

    >>21308867
    Podaj więcej detali - jak to sprawdzić, zrobić.
  • Pomocny post
    #5 21310016
    JacekCz
    Poziom 42  
    @jarekgol

    Plik, który ma zawierać tę funkcję jest wynieniony z nazwy.
    A że tobie podobieństwo komunikatu sie kojarzy z math ...



    @Piernikowski.S
    Nie zrobię za ciebie, bo po pierwsze nie znam tej platformy budowania.
    Po drugie zrobiłbym ci krzywdę. Musisz poznać filozfię C, czym sie różni DEKLAROWANIE funkcji (np w *.h), czym jej DEFINIOWANIE (tu w oddzielnym pliku). To są oddzielne koncepty.
    U ciebie funkcja efektywnie nie jest zdefiniowana (choć jest zadeklarowana), zgadnij dlaczego.

    Weź coś solidnego do C, i/albo porządnie przeczytaj dokumentację do swojej platformy.
    Te problemy będziesz napotykał do końca używania C, wiec warto to zrozumieć

    (Wynika to z tego, jak archaiczny jest jezyk C. Żaden nowy język nie powtórzył tej głupoty z #include, rozbudowanymi makrami itd)
  • #6 21310136
    Piernikowski.S
    Poziom 9  
    Wystarczyło się dobrze przyjrzeć funkcji DRESULT mmc_disk_write(const BYTE *buff, LBA_t sector, UINT count) w pliku mmc_avr_spi.c.
    Przed definicją tej funkcji jest: #if _USE_WRITE . Wystarczyło dodać dyrektywę #define _USE_WRITE 1 do pliku ff_conf.h i wszystko jest ok.
    Bardzo pomocny okazał się pseudo debugger LED odpalany w ciele funkcji. LED się nie zapalał więc funkcja nie odpalała się. Dlaczego???? - #if _USE_WRITE .
    Pozdrawiam
  • #7 21310143
    Piernikowski.S
    Poziom 9  
    Dodałem dyrektywę #define_USE_WRITE 1 do pliku ff_conf.h
REKLAMA