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.

Assembler + C, wstawki - Kompilator nie rozpoznaje dyrektyw

Bartosz36 15 Wrz 2015 11:07 708 9
  • #1 15 Wrz 2015 11:07
    Bartosz36
    Poziom 12  

    Witam,
    Mam problem związany z funkcjami napisanymi w Asemblerze, zawartymi w pliku .S. Kompilacja projektu w Atmel Studio 6.2 nie przebiega prawidłowo ze względu na błąd:
    Error 1 expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
    A chodzi tu o linijkę w której jest pierwsza funkcja, załóżmy

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    Przy dołączeniu na początku programu linijki:
    Kod: avrasm
    Zaloguj się, aby zobaczyć kod
    a także w pliku .h linijki:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    kompilator zgłasza błąd:
    Error 1 expected identifier or '(' before '.' token
    Czyli nie rozumie czegoś takiego jak .global, co ciekawe jakąkolwiek dyrektywę dodam przed samą funkcją kompilator kłóci się, że coś powinno znaleźć się przed znakiem kropki...
    O co może chodzić? Podejrzewam, że to kwestia kompilatora, nie kodu ale co dokładnie?

    Pozdrawiam :)

    0 9
  • #2 15 Wrz 2015 13:20
    zagwizdow
    Poziom 17  

    A sekcje masz zdefiniowana przed funkcja?

    Code:
       .section .text

    0
  • #3 15 Wrz 2015 18:56
    Bartosz36
    Poziom 12  

    Tak, ale kompilator uważa, że przed .section powinno znaleźć się:
    Error 1 expected identifier or '(' before '.' token

    W całym kodzie przed linijką

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod
    nie ma żadnego kodu, więc nie wiem skąd może brać się ten błąd.

    0
  • #4 16 Wrz 2015 01:15
    Bartosz36
    Poziom 12  

    Spróbowałem w pliku .c usunąć linijkę dołączającą plik .S do programu, i okazało się, że wszystko zadziałało. Kompilacja przebiegła bez problemu. Jednak procesor nie reaguje na funkcje, które przekazuję mu z pliku .S w sposób zaczerpnięty z książki: AVR Układy peryferyjne

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czy takie odwoływanie się do funkcji utworzonych w pliku .S poprzez:
    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    jest prawidłowe? Dlaczego mikrokontroler nie reaguje na te funkcje, mimo iż w pliku .LSS są one widoczne i kompilator wykorzystał je?

    Pozdrawiam :)

    0
  • #5 16 Wrz 2015 10:06
    -psiak-
    Poziom 32  

    Spróbuj dodać znak podkreślenia przed nazwą funkcji (tylko w .S)

    0
  • #6 16 Wrz 2015 12:31
    Bartosz36
    Poziom 12  

    Dodałem już wcześniej, ale w obu plikach (nie zamieściłem tego w przykładzie - moja wina :P) ale bez skutku. Kompilacja przebiega prawidłowo, w wygenerowanym kodzie jest skok

    Kod: arvasm
    Zaloguj się, aby zobaczyć kod

    Ale procesor na nią nie reaguje, to co powinno dziać się przy wywołaniu funkcji nie dzieje się "na płytce".
    Natomiast przy znakach podkreślenia tylko w .S mam błąd:
    Error 2 undefined reference to `FunkcjaASM'
    który dotyczy pliku .c

    0
  • #7 16 Wrz 2015 12:59
    -psiak-
    Poziom 32  

    Czy pod tym przesunięciem 0x6C jest ta funkcja?
    Na podstawie czego stwierdzasz że "procesor na nią nie reaguje"?

    0
  • #8 16 Wrz 2015 13:06
    Bartosz36
    Poziom 12  

    -psiak- napisał:
    Czy pod tym przesunięciem 0x6C jest ta funkcja?
    Co masz na myśli "pod tym przesunięciem"?

    Co do drugiego: załóżmy, że w funkcji miało być zapalenie diody - dioda się nie zaświeca, milczy.
    Jeszcze (na marginesie) co do podkreślników... szukałem trochę i znalazłem to:
    http://www.atmel.com/Images/doc1234.pdf
    gdzie Atmel nie używa znaku podkreślenia, a u mnie podkreślenie funkcji jedynie w .S powodowało wspomniany błąd. Więc jak to jest? :(

    0
  • #9 16 Wrz 2015 20:48
    zagwizdow
    Poziom 17  

    Ja dolaczalem to tak mialem:

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod


    W pliku .h była zwykłą deklaracja
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a w pliku .c normalnie wywolywalem bez zmian nazwy.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pokaż może plik map całości i pliki lst dla maina i pliku asemblerowego. Wyglada jakby w tym czyms "założny ze robi" nie działało coś skoro prawdopodobnie jest wywołanie w main-ie.
    --
    Cos mi zjadło wczesniej pół posta.

    0
  • #10 18 Wrz 2015 03:16
    Bartosz36
    Poziom 12  

    Witam,
    Problem został rozwiązany: Podpiąłem diodę pod jedną nóżkę i napisałem prostą funkcję w .S zapalającą tą diodę. Chciałem sprawdzić, czy procek reaguje na jakąkolwiek funkcję, nawet najprostszą. Dioda zaświeciła się, ale bardzo słabym światłem - pull up. Czyli w kodzie:

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    brakło właśnie makra: _SFR_IO_ADDR() przy DDRD. Po dołączeniu potrzebnych makr program ruszył bez problemu.
    Zamykam i dziękuję :)

    1