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

[at89c51][c][sdcc] Ostrzeżenia przy kompilacji programu

02 Gru 2008 00:20 2751 5
  • Poziom 2  
    Witam, jestem dopiero studentem i dość słabo się znam na mikrokontrolerach. Mam projekt do zrealizowania z płytką uruchomieniowa(chyba tak to się nazywa) zakupioną razem z wygenerowanym programem z rozszerzeniem .hex i w postaci programu w C(w kilku plikach)- wszystko napisane dla mikrokontrolera at89c51ed2. Problem wygląda następująco: przy kompilacji pliku głównego w C(do pliku main dodałem pozostałe pliki instrukcją #include plus bibliotekę at89c51ed2.h) za pomocą kompilatora SDCC versja 2.8.0 w edytorze MIDE-51 (z opcjami: --code-loc 0x0000 --stack-auto --vc takie były standardowo po zainstalowaniu, w opcji select device mam ustawione 8051) wyrzuca mi następujące warningi:
    Cytat:
    SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.8.2 #5199 (Jul 29 2008) (MINGW32)

    Compiling...
    C:\RSK100\scr\/ISO14443A.c(86) : warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
    C:\RSK100\scr\/ISO14443B.c(90) : warning 59: function 'ISO14443B_REQB' must return value
    C:\RSK100\scr\/ISO14443B.c(90) : warning 59: function 'ISO14443B_REQB' must return value
    C:\RSK100\scr\/ISO14443B.c(90) : warning 59: function 'ISO14443B_REQB' must return value
    C:\RSK100\scr\/UART.c(61) : warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
    C:\RSK100\scr\/UART.c(118) : warning 94: comparison is always true resp. false due to limited range of data type
    C:\RSK100\scr\/UART.c(118) : warning 94: comparison is always true resp. false due to limited range of data type
    C:\RSK100\scr\/UART.c(118) : warning 94: comparison is always true resp. false due to limited range of data type
    C:\RSK100\scr\/UART.c(118) : warning 94: comparison is always true resp. false due to limited range of data type
    C:\RSK100\scr\/UART.c(118) : warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
    C:\RSK100\scr\/UART.c(118) : warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
    C:\RSK100\scr\/UART.c(118) : warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
    C:\RSK100\scr\/UART.c(118) : warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
    C:\RSK100\scr\/UART.c(121) : warning 84: 'auto' variable 'Rxdata' may be used before initialization
    C:\RSK100\scr\/UART.c(147) : warning 84: 'auto' variable 'CheckSum' may be used before initialization
    C:\RSK100\scr\/UART.c(121) : warning 126: unreachable code
    C:\RSK100\scr\/UART.c(121) : warning 126: unreachable code
    C:\RSK100\scr\/UART.c(128) : warning 126: unreachable code
    C:\RSK100\scr\/UART.c(133) : warning 126: unreachable code
    C:\RSK100\scr\/UART.c(138) : warning 126: unreachable code
    C:\RSK100\scr\/UART.c(143) : warning 126: unreachable code

    Done. "C:\RSK100\scr\main.hex" had been generated.

    ten program powinien działać, ponieważ po skompilowaniu go przy użyciu Keil mikroVision nie ma żadnych warningów i po wgraniu HEX'a na płytkę wszystko działa, natomiast po wgraniu programu wygenerowanego przez SDCC program się uruchamia, ale jakby się zawiesza w pewnym miejscu(wyświetla na LCD tylko tekst powitalny). Prosiłbym o pomoc w rozwiązaniu tego problemu, lub jakieś nakierowanie, domyślam się, że trzeba odpowiednio ustawić parametry kompilatora, lecz pomimo poszukiwań jak narazie nie znalazłem nic co by rozwiązywało ten problem. Byłbym również wdzięczny gdyby ktoś mógłby mi wyjaśnić na czym polegają powyższe warningi jak np
    Cytat:
    warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG
    warning 126: unreachable code
    warning 94: comparison is always true resp. false due to limited range of data type

    i ew. jak można zmodyfikować kod żeby się pozbyć tych warningów.
    Z góry dziękuję za odpowiedzi.

    Regulamin pkt 8.3 - przeniosłem do właściwego działu.
    Poprawiłem temat.

    Dr.Vee



    EDIT:
    dzisiaj jeszcze raz próbowałem kompilować i wgrać na płytkę, niestety tym razem nie udało się nawet wyświetlić komunikatu powitalnego. sprawdziłem kod dołączony do zestawu i zauważyłem, że adres programu jest 0x0000, czyli taki jaki mam w opcjach kompilatora. po dodaniu do kompilatora opcji --less-pedantic pozostają tylko dwa błędy:
    Cytat:

    C:\RSK100\scr\/UART.c(121) : warning 84: 'auto' variable 'Rxdata' may be used before initialization
    C:\RSK100\scr\/UART.c(147) : warning 84: 'auto' variable 'CheckSum' may be used before initialization


    Proszę używać przycisku "Zmień" - wiadomości scaliłem
    [zumek]
  • Computer Controls
  • VIP Zasłużony dla elektroda
    Jak Ci się wydaje, czy bez oglądania kodu źródłowego umiałbyś sam sobie odpowiedzieć na postawione pytania? :)

    Pozdrawiam,
    Dr.Vee
  • Computer Controls
  • Poziom 2  
    Dr.Vee napisał:
    Jak Ci się wydaje, czy bez oglądania kodu źródłowego umiałbyś sam sobie odpowiedzieć na postawione pytania? :)

    Pozdrawiam,
    Dr.Vee


    oto link do kodów źródłowych, jak już wcześniej pisałem dodałem tylko do pliku main.c instrukcją include pozostałe pliki(nazwy plików wpisałem w cudzysłów):
    Link
    Proszę o nie rozpowszechnianie powyższych kodów źródłowych, prawdopodobnie są chronione prawami autorskimi.

    Co do tego czy potrafiłbym sam sobie odpowiedzieć na moje pytania bez oglądania kodu źródłowego, to wydaje mi się, że gdybym się na tym znał i dużo podobnych przypadków bym rozwiązywał to pewnie bym umiał odpowiedzieć na te pytania. Kilka warningów potrafię sobie przetłumaczyć z języka angielskiego i wiem o co chodzi bez zaglądania do kodu źródłowego, np:
    Cytat:
    warning 59: function 'ISO14443B_REQB' must return value

    oznacza, że podana funkcja nie zwraca wartości, czyli np w jakiejś pętli, czy poza nią brakuje linijki: return x;
    Cytat:
    warning 84: 'auto' variable 'Rxdata' may be used before initialization

    oznacza, że istnieje możliwość że zmienna 'Rxdata' będzie użyta zanim przypisze do niej jakąś wartość
    Cytat:
    warning 126: unreachable code

    oznacza, że dana linijka z jakichś względów nieosiągalna, prawdopodobnie jest to wewnątrz warunku if, który nie zostanie spełniony
    Cytat:
    warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG

    co do tego mogę się tylko domyślać, słyszałem oczymś takim jak WATCHDOG, dokładnie nie wiem jak to działa, ale podobno służy do debugowania, więc z tego co się domyślam, ten debuger zmienia w jakiś sposób wykonywanie programu
    Cytat:
    warning 94: comparison is always true resp. false due to limited range of data type

    początek tego warningu oznacza, że porównujemy coś czego wynikiem zawsze jest prawda, a w drugiej części nie mam pojęcia o co chodzi.

    Prawdopodobnie trzy ostatnio opisane warningi odnoszą się tylko do wykonywanego programu "zmienionego" przez WATCHDOG'a, więc raczej nie trzeba się nimi zajmować. Z pozostałymi warningami wiedziałbym jak się uporać. Więc jak widać bez oglądania kodu potrafiłbym sobie odpowiedzieć na pytania odnośnie warningów (oprócz tych z WATCHDOG'iem), jednak nie to jest moim głównym problemem. Prawdziwym problemem jest odpowiednia konfiguracja kompilatora SDCC wraz z edytorem MIDE-51, gdyż jak już wcześniej pisałem kod jest poprawny, ponieważ po skompilowaniu go za pomocą KEIL microVision wszystko działa poprawnie(z tego względu uważam, że oglądanie kodu źródłowego nic nie da, ale w razie czego zamieściłem go wyżej w linku). Nawet pytałem się o to jednego doktora z uczelni i powiedział mi, że to najprawdopodobniej "wina" linkera, jednak nie mam pojęcia jak się za niego zabrać.
    Jedynej rzeczy, której chyba nie napisałem, to że w kompilatorze SDCC zamiast biblioteki REG51xD2.h ,która była początkowo zaimplementowana(kompilator SDCC nie ma takiej biblioteki), użyłem biblioteki reg51.h plus biblioteki at89c51ed2.h, jednak nawet gdy skopiowałem ową bibliotekę REG51xD2.h do katalogu SDCC i skompilowałem wszystko w wersji pierwotnej, dalej program nie działał.
    Sprawdzałem też format HEX'a generowanego przez Keil'a i jest ustawione na HEX-80, takiej opcji nie znalazłem w kompilatorze SDCC, ale znalazłem opcje linkera SDCC:
    Cytat:
    --out-fmt-ihx Output in Intel hex format
    --out-fmt-s19 Output in S19 hex format

    z tą drugą opcją program wgrany na płytkę wogóle nie działa, a z tą pierwszą na pewno jest wykonywana pierwsza funkcja programu, która inicjalizuje wyświetlacz LCD i wyświetla komunikat, później niestety znowu się zawiesza. Powoli zaczyna mi brakować pomysłów jak podejść do tego kompilatora. Jeżeli ktoś kto czyta tego posta potrafi skompilować przy użyciu SDCC program napisany w kilku plikach źródłowych w dodatku do kontrolera at89c51ed2, to prosiłbym o szczegółowe napisanie jak to się robi. Możliwe też, że chodzi o to, że w programie używam połączenia szeregowego RS232, może trzeba go uwzględnić w parametrach kompilatora, ale jak na razie nie wiem jak. Z góry dziękuję i pozdrawiam.
  • Specjalista - Mikrokontrolery
    adamoo87 napisał:
    dodałem tylko do pliku main.c instrukcją include pozostałe pliki(nazwy plików wpisałem w cudzysłów)

    znaczy ze dolaczyles pliki *.c do pliku main.c?

    EDIT: swoja droga swietny kod [; takie superowe nazwy jak: 'RSKRunFucntions()' <:

    4\/3!!
  • Poziom 2  
    Cytat:
    znaczy ze dolaczyles pliki *.c do pliku main.c?

    EDIT: swoja droga swietny kod [; takie superowe nazwy jak: 'RSKRunFucntions()' <:

    4\/3!!


    tak, dokładnie dołączyłem do pliku main.c wszystkie pliki *.c i wszystkie *.h które były w katalogu. A co do nazw to już pisałem, to nie jest mój program, tylko jakiejś firmy(chyba koreańskiej) i ja go mam tylko pozmieniać, ale jak na razie nawet bez zmian program nie działa poprawnie.
  • VIP Zasłużony dla elektroda
    adamoo87 napisał:
    Kilka warningów potrafię sobie przetłumaczyć z języka angielskiego i wiem o co chodzi bez zaglądania do kodu źródłowego

    Skoro wiesz, to po co pytasz? ;)

    adamoo87 napisał:
    Cytat:
    warning 59: function 'ISO14443B_REQB' must return value

    oznacza, że podana funkcja nie zwraca wartości, czyli np w jakiejś pętli, czy poza nią brakuje linijki: return x;

    Właśnie, w podanej funkcji w gałęzi else brakuje return.

    adamoo87 napisał:
    Cytat:
    warning 84: 'auto' variable 'Rxdata' may be used before initialization

    oznacza, że istnieje możliwość że zmienna 'Rxdata' będzie użyta zanim przypisze do niej jakąś wartość

    Dokładnie. Tutaj akurat Rxdata nie jest problemem, problemem jest zmienna CheckSum, która powinna być zadeklarowana jako static.

    adamoo87 napisał:
    Cytat:
    warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG

    co do tego mogę się tylko domyślać, słyszałem oczymś takim jak WATCHDOG, dokładnie nie wiem jak to działa, ale podobno służy do debugowania, więc z tego co się domyślam, ten debuger zmienia w jakiś sposób wykonywanie programu

    Chyba w zamierzeniu autorów kompilatora druga część komunikatu miała być żartem - a na pewno nie ma to nic wspólnego z watchdogiem :D
    Po prostu optymalizator zmienił kolejność, w jakiej są wyliczane części wyrażenia warunkowego.

    adamoo87 napisał:
    Cytat:
    warning 94: comparison is always true resp. false due to limited range of data type

    początek tego warningu oznacza, że porównujemy coś czego wynikiem zawsze jest prawda, a w drugiej części nie mam pojęcia o co chodzi.


    To akurat jest błąd, którego nie można lekceważyć. Np. w funkcji UART.c:serial() pan Koreański Programista porównuje zmienną typu BYTE (unsigned char) z ujemnymi liczbami. Ze względów na reguły promocji typów w C takie coś nie będzie działać (tj. porównanie jest zawsze fałszywe). Reszta warningów z UART.c ma związek właśnie z tym faktem.

    adamoo87 napisał:
    po skompilowaniu go za pomocą KEIL microVision wszystko działa poprawnie(z tego względu uważam, że oglądanie kodu źródłowego nic nie da, ale w razie czego zamieściłem go wyżej w linku).

    W takim razie trzymaj się KEILa, skoro tam działa. Nie mi oceniać, który kompilator jest "bardziej" zgodny z ANSI C. Jeśli nie wiesz, czy masz poprawne opcje dla kompilatora/linkera, to wypadałoby zacząć od podania opcji, z którymi wszystko się dobrze kompiluje w KEILu.

    Widać, że idziesz po omacku, skoro nie wiesz czym się różni format motorola s19 od intel hex...

    Tak się dzisiaj rozpisałem, że dam Ci nawet linka do dokumentacji:
    http://sdcc.sourceforge.net/doc/sdccman.html/
    Zwróć uwagę na sekcje: 3.1, 3.2.3, 3.2.4, 6.1, 8.2.

    PS. Aha, na 99% użycie --stack-auto może być problemem. Domyślnie i sdcc i keil przyjmują, że funkcje nie są "reentrant" i przydzielają pamięć dla wszystkich zmiennych lokalnych nie na stosie, tylko w pamięci tak samo jak dla zmiennych statycznych i globalnych.

    Pozdrawiam,
    Dr.Vee