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.

[AtmelStudio][c] uint32_t FUNKCJA();

rafiks 27 Mar 2017 02:20 660 7
  • #1 27 Mar 2017 02:20
    rafiks
    Poziom 18  

    Napotkałem pewien problem. Poniżej przedstawiam fragment kodu w c.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dlaczego otrzymuję wartość 0xFFFF8000 zamiast 0x80008000? W którymś etapie następuje konwersja z uint do int ( ze znakiem).

    0 7
  • #2 27 Mar 2017 02:44
    djtst
    Poziom 9  

    W drugiej linijce od.konca masz literówkę zapomniales.dac podlogi "_" przez co kompilator moze inaczej przeliczac zmienną. Po za tym ja bym zamiast uint32_t zapisal bym jako unsigned int na to samo by wyszlo a o literowke trudniej

    0
  • #3 27 Mar 2017 08:41
    Sparrowhawk
    Poziom 21  

    djtst napisał:
    Po za tym ja bym zamiast uint32_t zapisal bym jako unsigned int na to samo by wyszlo a o literowke trudniej
    Akurat literówka zapewne powstała w wyniku przepisywania kodu tutaj. Po za tym nie wyszło by na to samo, bo w gcc dla AVR typ unsigned int ma wielkość 16 bitów, a nie 32 bitów. Źródło: avr-libc: <stdint.h>: Standard Integer Types. Dlatego lepiej używać aliasy typów, dzięki czemu mamy pewność co do ich wielkości na danej architekturze.

    @rafiks: Skąd wiesz, jaka jest wartość w funkcji? Skąd wiesz jaka jest wartość zmiennej? Pokaż jaki kod asemblerowy dla tej funkcji wygenerował kompilator.

    1
  • #4 27 Mar 2017 10:40
    rafiks
    Poziom 18  

    Wykonałem nawet symulację bardzo prostego kodu. I widać wyraźnie że funkcja FT_Read32a zwraca wartość niepoprawną. ( załączone zdjęcia )

    [AtmelStudio][c] uint32_t FUNKCJA(); [AtmelStudio][c] uint32_t FUNKCJA();

    Natomiast martwi mnie jeden komunikat: "assignment makes integer from pointer without a cast" bo nie wiem co mam zmienić aby funkcje zwracała liczbę 32 bitową.

    0
  • #5 27 Mar 2017 11:10
    malcompl
    Poziom 12  

    Jesteś pewny, że w ogóle ta funkcja się wywołuje? Spróbuj zdebugować/symulować bez optymalizacji. Jest wielka szansa, że kompilator wywalił zbędne instrukcje, w tym ``taga = FT_Read32a();`` z Twojego kodu, bo jest w nim niepotrzebne ;)

    Ten komunikat, zapewne warning, pokazuje również zapewne numer linii, którego dotyczy...

    0
  • #6 27 Mar 2017 11:44
    rafiks
    Poziom 18  

    funkcja się wywołuje ale kompilator wywalił wszystko z wnętrza tej funkcji. Tak się zastanawiam czy to jest ten sam problem o którym pisałem na początku. Optymalizację mam wyłączoną i debugowanie na najwyższym priorytecie.

    Dodano po 24 [minuty]:

    Rozwiązałem problem. Tyle że nie wiem dlaczego tak się dzieje. Musiałem stworzyć nowy plik o takiej samej nazwie jednak z rozszerzeniem "h" zamiast "c". I tam powtórzyć tą funkcję Read32 ( już bez kodu) i wszystko zaczęło działać poprawnie. Widać kompilator potrzebuje pliku z nagłówkiem.

    0
  • #7 27 Mar 2017 13:57
    rajszym
    Poziom 19  

    rafiks napisał:
    Dlaczego otrzymuję wartość 0xFFFF8000 zamiast 0x80008000?

    Jeżeli funkcja SpiReceive zwraca signed char, to tak właśnie może być.

    0
  • #8 29 Mar 2017 01:05
    LED5W
    Poziom 32  

    rafiks napisał:
    Natomiast martwi mnie jeden komunikat: "assignment makes integer from pointer without a cast" bo nie wiem co mam zmienić aby funkcje zwracała liczbę 32 bitową.
    Komunikat wynika z przypisania do zmiennej taga adresu funkcji FT_Read32a zamiast wartości zwróconej przez funkcję. Brakuje nawiasów.

    0