Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 sty 2025, o 06:41


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 8 lut 2014, o 02:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

Witam wszystkich,

Ostatnio postanowiłem się pobawić asemblerem (ot tak dla sportu, rozrywki i poszerzenia wiedzy). Podjąłem już pierwsze próby (miganie, przerwania zew, timery), jednak najbardziej denerwuje mnie że muszę pisać w AVR Studio którego nie lubię. Domyślam się że ktoś z was pisze w czystym asemblerze, ale .... czy w Eclipse ? Mam skonfigurowane to środowisko do AVR, C, C++. Fajnie byłoby jakbym mógł także zrobić sobie jakiś workspace dla ASM. Wiecie jak ? (używam jeszcze starego Eclipse'a Indigo)

Druga sprawa to źródła do nauki asm. W sumie to do tej pory wystarczało AVR Instruction Set - bardzo dobry dokument, oraz kody zamieszczane przez użytkowników elektrody. Niestety do innych spraw (jak chociażby "ujarzmienie stosu" itp. trudnych rzeczy) potrzebna jest jakaś wiedza - i nie wiem gdzie jej szukać :( . W literaturze którą przeglądałem dot. mikrokontrolerów autorzy o asemblerze tylko wspominają a potem kontynuują wyjaśnianie C.

Piszę programy w ASM - jednak ze względu na to że nie natrafiłem na dobre źródło wiedzy do nauki, nie jestem pewien czy prawidłowo obsługuje np rejestry i GPIO.

Proszę was o wyjaśnienie kwestii ASM w Eclipse oraz podanie jakiś linków do kompletnych kursów ASM dla AVR

Pozdrawiam

_________________
-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 03:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

Ale to nie jest odpowiedź na moje pytania ;)

_________________
-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 09:06 
Offline
Nowy

Dołączył(a): 25 sty 2014
Posty: 6
Pomógł: 0

Postanowiłem sprawdzić, jak Eclipse radzi sobie z Assemblerem.
Napisałem funkcje w Asm wystawiającą na porcie B jedynki.


Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Proste, ale nie działało. Po przejrzeniu pliku .lls okazało się, że PORTB ma adres 0x38,
zamiast 0x18. Oczywiście po wpisaniu out 0x18 było OK. Ale mnie to zaintrygowało i
zacząłem poszukiwania w sieci. Trochę to trwało, zanim znalazłem to:

http://msoe.us/taylor/tutorial/ce2810/candasm

Tam się dowiedziałem, że trzeba wpisać definicję:
# define __SFR_OFFSET 0

Teraz funkcja wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I już wszystko jest OK!

Jest tam wiele cennych informacji, polecam

A możeby łaska używać opcji syntax przy publikowaniu kodu??? Różowy J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 14:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 715
Lokalizacja: Zielona Góra
Pomógł: 75

fullmoonguy napisał(a):
Proszę was o wyjaśnienie kwestii ASM w Eclipse oraz podanie jakiś linków do kompletnych kursów ASM dla AVR


Proszę, bardzo dobry kurs, - Beginners Programming in AVR Assembler

Nie spotkałem się dotąd z pluginem do Eclipsea który pozwala pisać i kompilować kod w czystym AVR ASM, możesz użyć AVR plugin do Eclipse i pisać wstawki w ASM do C albo spróbować wykorzystać jakiś alternatywny Edytor do AVR asm np. qMicroIDE lub podobny - zapewne coś znajdziesz w Necie co Ci będzie odpowiadało ;)

_________________
pozdrawiam
phill2k



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 15:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

@ sq7gdu

Kurczę, zamiast pliku *.c wstawiłeś i *.s ? I to działa ? To chyba nie jest czysty asm tylko wstawka, czy mam rację ?

@ phill2k

Dzięki, widziałem ten kurs ale nie wiedziałem czy jest dobry. Musze się z nim zaznajomić ;)

_________________
-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2014, o 17:15 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27346
Lokalizacja: Szczecin
Pomógł: 1041

fullmoonguy napisał(a):
@ sq7gdu

Kurczę, zamiast pliku *.c wstawiłeś i *.s ? I to działa ? To chyba nie jest czysty asm tylko wstawka, czy mam rację ?


Rzeczywiście to jest jedna z metod pisania wstawek hmm w zasadzie całych plików zawierających nawet wiele funkcji w asm. Czyli niejako wstawki ... Nie daje to możliwości tak wprost napisania kodu od początku do końca w asm.

Sam się zastanawiam czy jest jakiś dodatek do Eclipse aby pisać w asemblerze ? Ja nie znam takiego - no ale to nie znaczy że go nie ma ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2014, o 12:07 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Z asm nie mam dużego doświadczenia (jakieś dwa tygodnie ;-) ), ale to co udało mi się ustalić:

PKoz napisał(a):
Może wiesz coś więcej o adresie PORTB, bo mnie zaintrygowało i mimo poszukiwań nie znalazłem odpowiedzi dlaczego adres PORTB jest czasami podawany w postaci 0x18 (0x38)?


Co nieco na ten temat jest tutaj: http://nongnu.org/avr-libc/user-manual/group__avr__sfr__notes.html. Ja to rozumiem tak, że trzeba adres rejestru pomniejszyć o 0x20 jeśli chce się korzystać z instrukcji IN/OUT. Jeśli do tych rejestrów czyta/pisze się instrukcjami LDS/STS nie jest to konieczne. IN/OUT są szybsze, trwają tylko jeden takt, ale zaadresować można tylko adresy <=31.

PKoz napisał(a):
Gdzie jest wywoływana funkcja LED_WYL i dlaczego pisana jest dużymi literami - czy wielkość liter ma znaczenie?


Zdaje się, że wielkość liter w gas jest bez znaczenia.

PKoz napisał(a):
Bo w języku C dyrektywa zaczyna się od znaku # (#include), a w asm od kropki (.global). U ciebie w jednym pliku są oba typy dyrektyw.


W plikach .S (duże S) można stosować obie konwencje preprocesora. Prep. C jest, mam wrażenie, ogólnie wygodniejszy, ale asmowy też sie przydaje np. przy definiowaniu makr.
Są jeszcze pliki .s (małe s), w których, zdaje się preprocesor C-owy nie działa. To mój domysł wywnioskowany z tego jak gcc wywołuje gas (są dwie opcje "assembler" i "assembler-with-preprocessor"), nie wiem czy prawidłowy. :-)

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2014, o 12:22 
Offline
Nowy

Dołączył(a): 25 sty 2014
Posty: 6
Pomógł: 0

Funkcje wywołuje się tak jak C++. Nazwa funkcji może być pisana zarówno
małymi jak i dużymi literami.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Plik Asm.s
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wszystko jest opisane na http://msoe.us/taylor/tutorial/ce2810/candasm
Jest tam opisany sposób przekazywania parametrów.

Widzę że nie trafia do ciebie zalecenie używania syntax - Różowy J.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2014, o 13:49 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

#define _SFR_ASM_COMPAT 1 /* Not sure when/if this is needed */


Zaiste, rozbrajające ;-)

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2014, o 19:17 
Offline
Nowy

Dołączył(a): 25 sty 2014
Posty: 6
Pomógł: 0

Próbowałem, ale się nie udało. A kolega Różowy J jest nie elegancki i arogancki.
Wypisuje się z tego forum.

Andrzej SQ7GDU



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2014, o 02:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

Mam nadzieje, że nikt się nie obrazi jak swoje problemy odnośnie ASM będe opisywał w tym wątku a nie tworzył nowych.

Otóż mam problem ze zrozumieniem pewnego zagadnienia ....

STOS w przerwaniach ;)

Coś co w C problemem nie było bo programista się tym bezpośrednio nie zajmował. Chciałbym wiedzieć po co się w ogóle cokolwiek odkłada na stos ? Znalazłem informację że jest to kolejka LIFO i zrozumiałem jego działanie, jednak nadal nie wiem po co się go stosuje. Niby odkłada się 'coś' na stos by zapamiętać jego wartość i po wejściu w przerwanie zachować wartość rejestrów, którymi operowaliśmy w pętli głównej (nie stracić ich zawartości). Jednak co wtedy kiedy ja chcę celowo korzystać powiedzmy z rejestru r18 a potem w przerwaniu (np timera) inkrementować jego wartość. Czy wtedy konieczne jest odkładanie tego rejestru w prologu przerwania na stos ?

Być może powyższy wywód jest całkowicie błędny dlatego proszę o odniesienie się do niego i wytłumaczenie (nawet skrótowo) kiedy coś (i co ;) ) powinienem odkładać na stos i zdejmować (bo jak to się robi to ja wiem -> najpierw push'e i potem w odwrotnej kolejności popy).

PS: czy ten cały stos jest jakoś powiązany z specyfikatorem 'volatile' z języka C ?

--

_________________
-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2014, o 07:39 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27346
Lokalizacja: Szczecin
Pomógł: 1041

STOS w asm nie jest używany tylko w przerwaniach to taka uwaga ogólna. Nawet bez przerwań a tylko do procedury wywoływanych za pomocą poleceń typu call - już na stos odkłada się adres powortu - podobnie jak przy przerwaniach - no ale to dzieje się akurat automatycznie - bez naszego udziału - i to jest PODSTAWOWA funkcja stosu

poza tym - jeszcze sami musimy zadbać o przechowanie na stosie tych rejestrów, których używamy w funkcji albo w przerwaniu a które wcześniej w programie głównym używaliśmy do czegoś innego .... to chyba zrozumiałe i wygląda na to że to czujesz ;) ... a jeśli masz rejestr z wartością którą chcesz modyfikować w przerwaniu to oczywiście że nie musisz przechowywać jego kopii na stosie tzn możesz ale nie musisz - wszystko zależy od kontekstu programu i potrzeb. Bo jeśli np z jakiejś okazji ... czasem jego wartość musi być zmodyfikowana ale też czasem wystąpi jakiś warunek, że jednak przy zakończeniu trzeba odzyskać wartość z przed modyfikacji no to przyda się odłożenie na stosie - prawda ? ;) ale jeśli na pewno się nie przyda - to nie musisz odkładać na stosie

fullmoonguy napisał(a):
PS: czy ten cały stos jest jakoś powiązany z specyfikatorem 'volatile' z języka C ?


Nie ma NIC wspólnego - volatile w C odpowiedzialne jest za całkowicie coś innego a mianowicie za wyłączenie optymalizacji dostępu do danych w pamięci RAM. Jeśli jest volatile to nigdy nie dojdzie do sytuacji że kompilator wpakuje sobie taką wartość z RAM do jakiegoś rejestru i dalej już będzie działał TYLKO na wartości w rejestrze - bo akurat tak mu wygodnie i tak często można zrobić dzięki czemu optymalizujemy szybkość działań ....

ale jeśli damy volatile to wtedy dostęp do komórki(-ek) pamięci będzie zawsze odbywał się na żmudnej zasadzie

- pobierz do rejestru daną z RAM
- wykonaj na niej operację
- włóż ponownie do RAM zmodyfikowaną zmienną

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO