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

[ATmega128][C][FatFS][SD] Problem z lokalizacją błędu

pubus 08 Lip 2009 23:12 3682 4
REKLAMA
  • #1 6756453
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 139
    Ocena: 32
    Witam...

    Walczę ostatnio z biblioteką FatFS i SD...
    W trakcie pojawił się błąd którego za Chiny ludowe nie mogę zlokalizować...
    Wrzucam cały katalog projektu z AVR-Studio...
    Byłbym bardzo wdzięczny jeśli ktoś mógłby rzucić na to okiem i opisać swoje "wrażenia"...
    Komunikat który ja dostaje przy kompilacji:

    "Build started 8.7.2009 at 23:05:46
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT AT128_FatFS_SD_S65.o -MF dep/AT128_FatFS_SD_S65.o.d -c ../AT128_FatFS_SD_S65.c
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT ff.o -MF dep/ff.o.d -c ../ff.c
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT disp.o -MF dep/disp.o.d -c ../disp.c
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT delay.o -MF dep/delay.o.d -c ../delay.c
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT sd.o -MF dep/sd.o.d -c ../sd.c
    ../sd.c: In function `get_cmd':
    ../sd.c:73: warning: array subscript has type `char'
    ../sd.c: In function `get_crc':
    ../sd.c:78: warning: array subscript has type `char'
    ../sd.c: In function `get_rsp':
    ../sd.c:83: warning: array subscript has type `char'
    ../sd.c: In function `get_tdata':
    ../sd.c:88: warning: array subscript has type `char'
    ../sd.c: In function `SendSDCCmd':
    ../sd.c:102: warning: right shift count >= width of type
    ../sd.c:103: warning: right shift count >= width of type
    ../sd.c:154: warning: control reaches end of non-void function
    ../sd.c: In function `MediaInitialize':
    ../sd.c:218: warning: passing arg 2 of `SectorRead' discards qualifiers from pointer target type
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT diskio.o -MF dep/diskio.o.d -c ../diskio.c
    ../diskio.c: In function `disk_write':
    ../diskio.c:64: warning: passing arg 2 of `SectorWrite' discards qualifiers from pointer target type
    avr-gcc.exe -mmcu=atmega128 AT128_FatFS_SD_S65.o ff.o disp.o delay.o sd.o diskio.o -o AT128_FatFS_SD_S65.elf
    diskio.o: In function `disk_initialize':
    ../diskio.c:8: multiple definition of `CmdTab'
    sd.o:../sd.c:45: first defined here
    make: *** [AT128_FatFS_SD_S65.elf] Error 1
    Build succeeded with 9 Warnings...
    "
    plus

    "gcc plug-in: Error: Object file not found on expected location D:\AVR-Programy\AVR_Studio\AT128_FatFS_SD_S65\default\AT128_FatFS_SD_S65.elf"

    Będę wdzięczny za wszelką pomoc...
    Pozdrawiam Rafał...
    Załączniki:
    • AT128_FatFS_SD_S65.zip (82.89 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #2 6757079
    chudybyk
    Poziom 32  
    Posty: 1538
    Pomógł: 196
    Ocena: 298
    pubus napisał:

    "Build started 8.7.2009 at 23:05:46
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT AT128_FatFS_SD_S65.o -MF dep/AT128_FatFS_SD_S65.o.d -c ../AT128_FatFS_SD_S65.c
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT ff.o -MF dep/ff.o.d -c ../ff.c
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT disp.o -MF dep/disp.o.d -c ../disp.c
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT delay.o -MF dep/delay.o.d -c ../delay.c
    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT sd.o -MF dep/sd.o.d -c ../sd.c
    ../sd.c: In function `get_cmd':
    ../sd.c:73: warning: array subscript has type `char'
    ../sd.c: In function `get_crc':
    ../sd.c:78: warning: array subscript has type `char'
    ../sd.c: In function `get_rsp':
    ../sd.c:83: warning: array subscript has type `char'
    ../sd.c: In function `get_tdata':
    ../sd.c:88: warning: array subscript has type `char'

    Indeksem tablicy jest char - czyli zmienna ze znakiem. Pomoże jawna konwersja do unsigned char, np. tak:
    return CmdTab[(unsigned char)sd_cmd][0]; //kod komendy
    Cytat:

    ../sd.c: In function `SendSDCCmd':
    ../sd.c:102: warning: right shift count >= width of type
    ../sd.c:103: warning: right shift count >= width of type

    Zmienna adress ma wielkość 16 bitów - unsigned int, a Ty ją przesuwasz o 24 i 16. Kompilator się zdenerwował. ;-)
    Cytat:

    ../sd.c:154: warning: control reaches end of non-void function

    funkcja SendSDCCmd() musi zwrócić jakąś wartość. Kompilator znalazł drogę, która pozwala na zakończenie funkcji bez instrukcji return. Dopisz return cośtam przed ostatnim nawiasem zamykającym.
    Cytat:

    ../sd.c: In function `MediaInitialize':
    ../sd.c:218: warning: passing arg 2 of `SectorRead' discards qualifiers from pointer target type

    niedopasowanie typów przy przekazywaniu argumentów. Spróbuj znowu jawnej konwersji:
    resp = SectorRead(0x0, (unsigned char*)msd_buffer);

    Cytat:

    avr-gcc.exe -mmcu=atmega128 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT diskio.o -MF dep/diskio.o.d -c ../diskio.c
    ../diskio.c: In function `disk_write':
    ../diskio.c:64: warning: passing arg 2 of `SectorWrite' discards qualifiers from pointer target type

    Jak wyżej, ale przy SectorWrite()
    Cytat:

    avr-gcc.exe -mmcu=atmega128 AT128_FatFS_SD_S65.o ff.o disp.o delay.o sd.o diskio.o -o AT128_FatFS_SD_S65.elf
    diskio.o: In function `disk_initialize':
    ../diskio.c:8: multiple definition of `CmdTab'
    sd.o:../sd.c:45: first defined here

    Masz tablicę zadeklarowaną w pliku dołączalnym, który jest wywoływany dwa razy - w sd.c i diskio.c. Przenieś tę tablicę z sd.h do sd.c i po kłopocie
    Cytat:

    make: *** [AT128_FatFS_SD_S65.elf] Error 1
    Build succeeded with 9 Warnings...
    "
  • REKLAMA
  • #3 6757815
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 139
    Ocena: 32
    Dzięki Ci dobry człowieku... pomogło... :]
    Swoją drogą zgłupiałem teraz...
    Wyszło na to, że dobrze zrozumiałem błąd a nie wiem jak działają dyrektywy preprocesora...
    Uznałem, że wpakowanie całości w...
    
    #ifndef SD_H
    ...
    ...
    #define SD_H
    #endif
    

    ... załatwi sprawę a tu d#pa...
    Mam więc rozumieć, że warunek ten dotyczy tylko i wyłącznie dyrektyw preprocesora a całkowicie olewa klasyczne deklaracje tablic itp...?.!.?
  • REKLAMA
  • #4 6757944
    chudybyk
    Poziom 32  
    Posty: 1538
    Pomógł: 196
    Ocena: 298
    Dyrektywy są ok, ale umieściłeś w pliku *.h deklarację, która rezerwuje pamięć dla tablicy. Ten sam plik nagłówkowy był kompilowany dla dwóch różnych plików obiektowych i w obu przydzielił pamięć. To było problemem.
  • #5 6758175
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 139
    Ocena: 32
    No i właśnie o to chodzi...
    Byłem przekonany, że dyrektywa warunkowej kompilacji załatwi sprawę...
    Warunek z założenia powinien powodować, że treść sd.h jest brana pod uwagę tylko raz... a tu wychodzi na to, że jest to pic na wodę, fotomontaż...
REKLAMA