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 dołączyć pliki z procedurami w AVRStudio bez błędów?

bartek_zet 05 Mar 2007 12:53 1486 18
REKLAMA
  • #1 3645310
    bartek_zet
    Poziom 17  
    Posty: 311
    Pomógł: 15
    Ocena: 8
    Witam!
    Jestem w trakcie pisania oprogramowania w AVRStudio i chciałem zapytać w jaki sposób można dołączyć do głównego programu pliki z procedurami aby uczynić go czytelniejszym. Słowa typu PUBLIC, EXTERN wywalają mi błędy.
  • REKLAMA
  • Pomocny post
    #2 3645422
    rmajda
    Poziom 20  
    Posty: 485
    Pomógł: 13
    Ocena: 17
    W okienku gdzie wyświetlają Ci się pliki projektu (Source Files) np. main.c klikasz prawym klawiszem myszy i robisz Add Existing Source File i gotowe. To samo musisz zrobić dla Header'a.
  • #3 3645429
    bartek_zet
    Poziom 17  
    Posty: 311
    Pomógł: 15
    Ocena: 8
    No to jeszcze dopowiem kilka rzeczy. Programuję w assemblerze. Jak dodać istniejące pliki wiem. Nie wiem jak napisać te procedury aby były widoczne przez program główny i jak wywoływać je w tym programie.
  • Pomocny post
    #4 3645505
    rmajda
    Poziom 20  
    Posty: 485
    Pomógł: 13
    Ocena: 17
    Hmm, ja pisze tylko w C. Nie wiem jak asemblem. Jeśli chodzi o C to mogę pomóc.
  • Pomocny post
    #5 3645596
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    W sekcji CSEG przed zakończeniem preprocesora .EXIT wklepujesz .INCLUDE"PLIK.INC" i masz dodany plik(to podobno umiesz. Procedury piszesz normalnie NAZWA: i cała reszta z końcową instrukcją RET. Wywołujesz instrukcje przez RCALL.

    Dodanie pliku zewnętrznego musi nastąpić po pętli głównej!
  • REKLAMA
  • Pomocny post
    #6 3645917
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    kolega mariuszlorenc ma 100% racji ja dodam tylko, że jeśli w pliku dołączanym chciałbyć użyć zdefiniowane przez siebie MAKRa to wtedy .INCLUDE "PLIK.INC" wstawiasz nie na końcu, a na początku programu tak żeby były widoczne dla preprocesora przed wystąpieniem makra w kodzie

    pozdr
  • REKLAMA
  • Pomocny post
    #7 3646015
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Dzienx za uznanie. W zasadzie można całość umieścić na początki i jako pierwszą linijkę przed własnymi procedurami dać RJMP do nazwy zadeklarowanej na końcu dodawanego pliku. Spowoduje to, że procedurki zostaną pominięte podczas uruchomienia mikrokontrolera.
  • REKLAMA
  • #8 3646066
    bartek_zet
    Poziom 17  
    Posty: 311
    Pomógł: 15
    Ocena: 8
    Jeszcze jedno pytanie. Jak zrobić żebym w pliku z procedurami miał zmienne opisane tekstem a w programie głównym mógł definiować co te zmienne oznaczają? Np. w pliku z procedurami chcę zrobić tak: a w pliku z programem głównym:
    #define dane r16
  • Pomocny post
    #9 3646156
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    no sam sobie odpowiedziałeś przecież ;)

    na początku kodu definiujesz pewne stałe za pomocą np .EQU lub #DEFINE

    czyli

    #DEFINE dane R16

    a później w kodzie korzystasz już nie pisząc r16 tylko dane

    chyba że nie zrozumiałem do końca pytania
  • #10 3646339
    bartek_zet
    Poziom 17  
    Posty: 311
    Pomógł: 15
    Ocena: 8
    To ja nie zrozumiałem do końca całej idei. Rozumiem, że pisząc w którymś miejscu kodu .inc "plik" robimy to samo jakbyśmy po prostu wkleili tam kod z tego pliku. Czy to oznacza że jeżeli zrobię sobie bibliotekę w której będę miał 10 procedur a tylko jedną wykorzystam to i tak reszta się skompiluje i będzie zajmowała miejsce?
  • #11 3646387
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    W ASM tak niestety jest ... ale usuwanie zbędnych procedur wykonuje się w gotowym projekcie.
  • #12 3646433
    bartek_zet
    Poziom 17  
    Posty: 311
    Pomógł: 15
    Ocena: 8
    Ok dzięki wielkie. Temat zamknięty.
  • #13 3646457
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    ok podpowiem ci tylko, że w przeciwieństwie do procedur w osobnych plikach - z makrami jest inaczej ;) .... skompilowane zostaną tylko te, które wykorzystasz w kodzie .... rozumiem, że narazie może temat makra jest ci troszkę obcy ale zapewne szybko dostrzeżesz dobrodziejstwa jakie one, przy umiejętnym posługiwaniu się nimi, niosą - to wtedy je będziesz używał - polecam

    pozdr
  • #14 3646493
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    mariuszlorenc napisał:
    W ASM tak niestety jest ... ale usuwanie zbędnych procedur wykonuje się w gotowym projekcie.

    I wtym miejscu muszę zaprotestować ;)
    W każdym porządnym kompilatorze , jest coś takiego , co nazywa się potocznie "kompilacja warunkowa" . Za pomocą w/w mechanizmu można kompilować dowolne fragmenty z całości , kiedy i jak się chce.
    I przykładzik:
    program_główny.asm
    
    .include "m8def.inc"
    //#define PROC_1 ;odznaczamy procedury , które użyjemy 
    //#define PROC_2 ;i te się skompilują , a pozostałe nie ;)
    //#define PROC_3
    //#define PROC_4
    #define PROC_5
    
    .cseg
    .org 0x00
    
    ;### WEKTORY PRZERWAŃ ###
    	rjmp reset
    ;...
    .org 0x0B
    	rjmp odbierz
    .org INT_VECTORS_SIZE
    .include "procedury.asm"
    reset:
    ;inicjalicacja
       rcall proc_5
    ;itd.
    

    teraz plik procedury.asm
    
    #ifndef PROCS
    #define PROCS
    #ifdef PROC_1
    proc_1:
    	nop
    	ret
    #endif
    #ifdef PROC_2
    proc_2:
    	nop
    #define PROC_4                 ; proc_2 "używa" proc_4
            rcall proc_4
    	nop
    	ret
    #endif
    #ifdef PROC_3
    proc_3:
    	nop
    	nop
    	nop
    	ret
    #endif
    #ifdef PROC_4
    proc_4:
    	nop
    	nop
    	nop
    	nop
    	ret
    #endif
    #ifdef PROC_5
    proc_5:
    	nop
    	nop
    	nop
    	nop
    	nop
    	ret
    #endif
    #endif ; PROCS
    


    Piotrek
  • #15 3646557
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    No kolego ... tylko preprocesor dla ASM jest prehistoryczny i ma problemy z obsługą(przynajmniej ja się z tym spotkałem).

    Lepiej jest zdefiniować procedury w makrach. Jedyną rzeczą jaka będzie wymagana to uruchomienie makra za pętlą główną programu, a cała reszta będzie normalnie obsługiwana.

    Na sposoby są sposoby.

    .macro test
    nazwa:
    ...
    ret
    .endmacro

    i za pętlą główną

    test

    potem w dowolnym miejscu można normalnie wywołać procedurę.
  • #16 3646585
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    mariuszlorenc napisał:
    Lepiej jest zdefiniować procedury w makrach.

    Nie mogę się z Tobą zgodzić. Jeśli do makra wrzucisz funkcję/procedurę o wielkości 50 instrukcji (czyli będzie zajmować 100B) i wywołasz ją np. w 10 miejscach peogramu to jesteś "w plecy" 1kB pamięci FLASH, co jest delikatnie m mówiąc rozrzutnością....
  • #17 3646597
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    genetix napisał:
    ...
    Kolega nie zrozumiał. Definiujesz procedure w makrze. Za pętlą główną programu wywołujesz makro, żeby dana procedura było skompilowana z kodem. Potem wywoływanie dotyczy nie makra, ale konkretnej procedury ... niewiem tylko czy kompilator się nie wysypie.
  • #18 3646623
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    mariuszlorenc napisał:
    No kolego ...

    Jeśli teraz wywołasz takie macro 5-krotnie , to będziesz miał 5 razy powieloną taką procedurkę.Wyjściem z takiej sytuacji jest
    
       test
    ;....
       rcall nazwa
    ;...
       rcall nazwa
    

    Tylko po co komplikować proste rzeczy :?:
    Nikogo nie zmuszam , do takich "trików" , a jedynie podsuwam jedną z możliwości.

    Piotrek
  • #19 3646632
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    Aha, taaaaki patent.... no to zgoda :-)

    Uważam i tak, że powinno się dać tworzyć pliki .lib jak w TASM'ie. Mogliby to dorobić w następnej wersji avrasm'a

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy sposobów dołączania plików z procedurami w AVRStudio przy programowaniu w asemblerze, aby poprawić czytelność kodu i uniknąć błędów związanych z używaniem słów kluczowych PUBLIC i EXTERN. Zalecane jest dodanie plików źródłowych i nagłówkowych do projektu przez opcję "Add Existing Source File". W asemblerze dołączanie plików odbywa się za pomocą dyrektywy .INCLUDE "plik.inc", którą umieszcza się w sekcji CSEG, zwykle po pętli głównej programu. Procedury definiuje się jako etykiety zakończone instrukcją RET, a wywołuje przez RCALL. Aby zmienne w plikach procedur były definiowalne w programie głównym, stosuje się dyrektywy #DEFINE lub .EQU. Omówiono także problem kompilacji całych bibliotek procedur, gdzie nawet nieużywane procedury są kompilowane i zajmują miejsce w pamięci. Zaproponowano rozwiązania z wykorzystaniem kompilacji warunkowej (#ifdef) oraz makr (.macro), które pozwalają na selektywne włączanie kodu. Jednak makra mogą powodować powielanie kodu przy wielokrotnym wywołaniu, co zwiększa rozmiar programu. Wskazano, że w asemblerze AVR preprocesor jest ograniczony, a bardziej zaawansowane zarządzanie kodem wymaga ręcznego stosowania warunków kompilacji lub makr. Sugerowano również, że przydałoby się wsparcie dla plików .lib podobnie jak w TASM, co ułatwiłoby zarządzanie bibliotekami procedur.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA