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

Jak połączyć pliki asm.S z C w WinAVR? Problem z m16def.inc i Makefile

wladziu 12 Lis 2006 22:21 1636 8
REKLAMA
  • #1 3218003
    wladziu
    Poziom 11  
    Posty: 38
    Ocena: 1
    Witam.
    Duzo czasu stracilem na szukanie jakiegos przykladu na dolaczenie pliku assemblerowego w z plikami z napisanymi w C.

    Wiem ze:
    - rozszerzenie pliku asm konczy sie ".S"
    -w Makefile trzeba dodac ASRC = nazwapliku.S

    Nie wiem jak ma wygladac taki plik. Przypuszczam ze plik:
    asm:

    .include "m16def.inc"

    .global nazwa_funkcji,nazwa_funkcji2;

    nazwa_funkcji:
    ;;;;;instrukcje asemblerowe
    ret

    nazwa_funkcji2:
    ;;;;;instrukcje asemblerowe
    ret

    --------------------------------------------------------------------------------------
    plik *.C

    extern void nazwa_funkcji(void);
    extern void nazwa_funkcji2(void);

    //wywolanie funkcji
    nazwa_funkcji();
    nazwa_funkcji2();

    -------------------------------------------------------------------------------------

    Tyle wiem......i czesciowo domyslam sie.
    Jednak nie dziala mi to :/
    1)
    Kompilator pluje sie najpierw do pliku "m16def.inc" ze nie moze znalezc sciezki dostepu. Nio to zalaczylem go w katalogu projektu i juz znalazl:)
    Ale teraz ma problem z jego odczytaniem bo pisze np:
    m16def.inc:374: Error: expected comma after "DDD6"
    Chodzi oczywiscie o kropke przed ".equ".

    2)
    Mam tez bledy typu:
    dodatek.S:38: Error: constant value required
    czuli do np kodu:
    in r18,PINC

    3)
    Chcialbym wiedzec jakimi rejestrami przakazywac (zwracac) dane i jakimi przyjmowac???

    Bede bardzo wdzieczny za udzielenie mi inforamcji i pomoc w tej sprawie.
    Z gory dziekuje bardzo.
  • REKLAMA
  • #2 3218104
    zolciak
    Poziom 15  
    Posty: 163
    Pomógł: 6
    Ocena: 9
    Słabo szukałeś bo na pierwszej stronce jest projekt konwertera rs-232 <-> usb i są tam wtrącane pliki *.S
  • REKLAMA
  • #3 3218158
    wladziu
    Poziom 11  
    Posty: 38
    Ocena: 1
    ciekawe bo nie ma na pierwszej stronie takiego tematu ani na drugiej...
  • REKLAMA
  • #4 3218212
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    wladziu napisał:
    ciekawe bo nie ma na pierwszej stronie takiego tematu ani na drugiej...

    To może popatrz na to:
    
    #include <avr/io.h>
    
    #define temp0 r0
    #define IOA(x) _SFR_IO_ADDR(x) 
    
    .global USART_FlushRX
    
     .func USART_FlushRX
    ;wypada to zrobić tak ...
    USART_FlushRX:
       sbis IOA(UCSRA),RXC
       ret
       lds r16,_SFR_MEM_ADDR(UDR) //przez adres
       in temp0,IOA(UDR)          //"normalnie"
       rjmp USART_FlushRX 
    .endfunc
    
    
    

    Sam kod jest bez sensu :D

    Piotrek
  • REKLAMA
  • #5 3218265
    chszanek
    Poziom 13  
    Posty: 122
    Pomógł: 5
    Ocena: 9
    Tak można fragmenty kodu asm wstawiać do C w WinAVR
    
    calc=(calc)/2;	
    
    	for(i=0;i<calc;i++) 
    		{
    		asm volatile("NOP");
    		asm volatile("NOP");
    		asm volatile(".EQU PORTD,0x12");
    		asm volatile("cbi PORTD,2");		// volatile= lotny , nie stabilny
    		}
    
    


    ale pewnie można inaczej :) . Co do Twoich problemów to pewnie musisz zadeklarować takie rzeczy jak porty np tak jak ja wyżej to zrobiłem z {PPRTD (lub też dodać plik .inc) pewnie się da tak jak ja pokazałem wyżej.


    POZDRAWIAM
  • #6 3218325
    wladziu
    Poziom 11  
    Posty: 38
    Ocena: 1
    nio wlasnie te fragmenty tak mozna robic ale dla kilku instr. Ja mam 60 instrukcji w assemblerze..zdeka dziwne to bedzie.
  • #7 3218400
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    wladziu napisał:
    nio wlasnie te fragmenty tak mozna robic ale dla kilku instr. Ja mam 60 instrukcji w assemblerze..zdeka dziwne to bedzie.

    Jak już nie chcesz bawić się z plikiem S(nie rozumiem dlaczego) , to zaoszczędź trochę klawiaturę :D
    
    asm volatile("\
    .EQU PORTD,0x12 \n\
    sbi PORTD,2 \n\
    cbi PORTD,3 \n\
                      ");
    


    Piotrek
  • #8 3218401
    wladziu
    Poziom 11  
    Posty: 38
    Ocena: 1
    Nio i nadal jestem w kropce :/
    Moze jeszcze jakies pomysly i odpowiedzi na moje pytania ?
    Bardzo prosilbym.....

    Dodano po 2 [minuty]:

    Chce sie nadal bawic i nauczyc uzwania pliku *.S ale to co napisales Piotrze w swoim pierwszym poscie raczej nie ma miejsca dla assemblera bo przeciez tam nie moze byc np #incude tylko .include jak juz.
  • #9 3218428
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    wladziu napisał:
    ...
    Chce sie nadal bawic i nauczyc uzwania pliku *.S ale to co napisales Piotrze w swoim pierwszym poscie raczej nie ma miejsca dla assemblera bo przeciez tam nie moze byc np #incude tylko .include jak juz.

    No to może zamiast zgadywania , co może być w pliku S , a co nie , spróbuj :D Nie myśl , że to co napisałem , tylko mi sie przyśniło , albo że wyczytałem w gwiazdach :D To i duuuużo więcej , można znaleźć w dokumentacji GCC AS i w sieci.To , na dowód: http://www.nongnu.org/avr-libc/user-manual/assembler.html


    Piotrek

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemów z integracją plików asemblerowych (*.S) z kodem w języku C w środowisku WinAVR, ze szczególnym uwzględnieniem błędów związanych z plikiem nagłówkowym "m16def.inc" oraz konfiguracją Makefile. Użytkownik próbuje dołączyć plik assemblerowy zawierający funkcje globalne, wywoływane z C, jednak kompilator zgłasza brak dostępu do "m16def.inc" mimo umieszczenia go w katalogu projektu. Wskazano, że rozszerzenie pliku asemblerowego powinno być ".S" oraz że w Makefile należy zadeklarować zmienną ASRC z nazwą pliku. W odpowiedziach zasugerowano korzystanie z dokumentacji GCC AS oraz przykładów dostępnych w sieci, a także stosowanie dyrektyw asemblera zgodnych z GCC (np. .include zamiast #include). Zaproponowano także alternatywne metody wstawiania kodu asemblerowego bezpośrednio w plikach C za pomocą asm volatile, co może być wygodne dla krótkich fragmentów, ale mniej praktyczne przy większej liczbie instrukcji. Podkreślono konieczność prawidłowego definiowania symboli i adresów portów (np. za pomocą .EQU lub odpowiednich plików .inc) oraz odwołań do rejestrów i funkcji asemblerowych. Wskazano na dokumentację AVR libc dotyczącą asemblera jako źródło wiedzy o składni i integracji kodu asemblerowego z C w WinAVR.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA