Wątek przeniesiony 2018-11-08 11:29 z Inne języki programowania przez Marooned.

Assembler AVR, skąd się uczyć?

Odpowiedz Nowy wątek
2015-07-14 11:36
0

Witajcie,

Jeśli zna ktoś na tym forum Assemblera AVR to skąd się uczyliście? Chciałbym się go nauczyć aby zbudować na AVR coś w rodzaju komputera, tzn. żeby nie programować Flasha w uC tylko na karcie pamięci mieć programy i możliwość ich pisania na tym uC. Wydałem ok. 150zł na początek z AVRami (ATmega16, lutownica i akcesoria, zestaw rezystorów i kondensatorów, pytka stykowa itp.). Napisałem miganie LED... w C i teraz to "poszło w kąt". Assemblera chcę się nauczyć żeby pisać mało zajmujące i szybkie programy i żeby dobrze poznać architekturę tego procesora.

PS. Chodzi mi bardziej o wyjaśnienie działania poszczególnych instrukcji niż samo pisanie programu.


128 postów [25.06.2015r. 21:03]
edytowany 1x, ostatnio: bajos, 2015-07-14 11:37

Pozostało 580 znaków

2015-07-14 11:50
1

Rozszerzone datasheety (masz tam opis każdej instrukcji oraz praktyczny opis architektury (SP, SREG, itp) ) + ta strona może być pomocna .
Szkopuł jest w tym że sam syntax assembly nie jest trudny, trudne jest ogarnąć jak to wszysko trybi czyli architekture danego procesora.
Programowanie AVR w asm to zupełnieee inna bajka niż x86, i zanim zrobisz to co planujesz to troche minie :- ) + kod napisany przez Ciebie będzie prawdopodobnie mniej wydajny niż kod kompilatora, no, chyba że użyjesz jakiś sztuczek jak np te tutaj.
To co próbujesz myśle że da się z powodzeniem wykonać w C w sposób np, opkody zapisujesz w EEPROM i potem jakoś sobie ładujesz run-time do pamięci + jmp w to miejsce. Do tego można dołożyć mechanizm context switch i masz eleganckie środowisko wielozadaniowe ;- )
Generalnie możesz przejrzeć kody istniejących RTOS-ów na AVR i zobaczyć czy na pewno chcesz bawić się w low-level (ciekawe ale raczej nie łatwe, i tutorialów typowo step-by-step w tych tematach raczej nie ma).

edytowany 3x, ostatnio: Proxima, 2015-07-14 11:54

Pozostało 580 znaków

2015-07-14 12:08
2

@bajos
W znakomitej większości przypadków nie będziesz lepszy niż optymalizator gcc, kilkukrotnie boleśnie się o tym przekonałem. Nic złego w znajomości ASMa, ale generalnie ekstremalnie rzadko rzadko się tego używa. A jeśli koniecznie chcesz - to masz dokumentację.

A w skrócie: w AVR działasz na rejestrach a pamięć jest tylko do odczytu/zapisu.
Masz kilka (o ile pamiętam 3) par rejestrów wskaźnikowych żeby wygodnie się po niej poruszać, ale równie dobrze możesz używać ich jako normalnych rejestrów. Połowa rejestrów roboczych ma nieco większe możliwości od pozostałych (głównie operacje na w. natychmiastowych). Dla większych AVR masz dodatkowe instrukcje zapisu/odczytu dalszych obszarów pamięci/peryferiali.

Co do mądrych słówek: load to wczytanie, store zapis, immediate to wartość natychmiastowa (czyli np. w wyr. x + 5 - to 5 jest immediate), branch skok, call - skok ze śladem. Do tego kilka typów adresowań. Patrz na zakresy skoków, zwłaszcza względnych bo mają one ograniczone możliwości inkrementacji program countera, z drugiej strony zwykły skok zajmuje więcej pamięci programu i wykonuje się chyba dłużej.

Do tego poczytaj o makrach avrasm typu ramend, hbyte, lbyte oraz jak ustawiać stos: to jest o tyle problematyczne, że dla różnych AVR dzieje się to automatycznie lub nie w różnych momentach. Dodatkowo zwróć uwagę na rodzielenie pamięći flash i RAM oraz jak są one adresowane.

@Proxima czeeekaj, o co Ci chodzi z opkodami w eeprom? W sensie - uruchamianie wstawek/funkcji asemblerowych z RAMu? W ARM tak, Cortex M4 ma CCM-RAM specjalnie do takich zabaw (m.in.), ale w AVR nie masz szans tego zrobić bo architektura na to nie pozwala.

Pokaż pozostałe 8 komentarzy
Coś źle czytasz. Bootloader przeprogramowuje flash tak samo jak wszystko inne. Jest wygodne bo nie potrzebujesz zewnętrznego programatora. A 10 tys. razy to sporo. A co do FreeRTOSa - pisałem do @Proxima w odn. do implementacji ContextSwitch. RTOS nic Ci nie pomoże. I generalnie przy AVR nic Ci nie pomoże bo flash musisz przeprogramowywać. Tylko czy przy cenie procka 5 zł/sztuka to robi aż taką różnicę? - alagner 2015-07-14 13:01
@alagner, chodzi o fakt budowy czegoś jak stare Commodore itp. Jedynie mógłbym napisać interpreter jakiegoś bytecode z karty SD. Na karcie SD przechowywać plik virtualnej pamięci, bo tyle co ma avr to zdecydowanie za mało. - bajos 2015-07-14 13:10
@bajos imho bezsensem jest robienie tego na AVR. Weź Cortexa, bo jest szybszy, wygodniejszy, i ma bogatsze peryferia. Albo softprocesor w FPGA + kontroler VGA inne customowe peryferiale w Verilogu. Ew. całość na FPGA jak chcesz totalnie niskopoziomowo. Tzn. nie mówię, że się nie da. Ale umęczysz się i będzie to bardziej hack driven development aniżeli rozsądne pisanie kodu. - alagner 2015-07-14 13:14
@alagner, ale ARM nie są droższe? Zresztą Cortex to nie jest tylko rdzeń ARM? Czytałem, że ARM nie mają problemu z programatorami jak AVR i można je programować konwerterem USB -> RS232 (prawda?). - bajos 2015-07-14 13:18
USB-UART jak już, RS232 to jeszcze standard napięciowy. Sporo Cortexów ma sprzętowy bootloader. Nie lubię programowania w ten sposób, generalnie mam sprzętowy debuger i do ARM i do AVR (do MSP430 też ;)), 100 zł to nie jest tragedia a komfort pracy rośnie wręcz wykładniczo. Cortex to jest zasadniczo ARM z zestawem Thumb2. A czy droższe - pooglądaj. W hurcie wcale niekoniecznie. IMHO o wiele wygodniejsze od AVR - mają wspólną przestrzeń dla RAM i flash, niższe napięcia, bogatsze peryferia, 32bity. Ale do płytki stykowej poza niektórymi LPC nie wejdą. - alagner 2015-07-14 13:24

Pozostało 580 znaków

2015-07-14 15:13
1
alagner napisał(a):

W znakomitej większości przypadków nie będziesz lepszy niż optymalizator gcc, kilkukrotnie boleśnie się o tym przekonałem. Nic złego w znajomości ASMa, ale generalnie ekstremalnie rzadko rzadko się tego używa. A jeśli koniecznie chcesz - to masz dokumentację.

Na AVR (zwłaszcza tych małych i mikroskopijnych) problemem często nie jest prędkość (ta i tak jest słaba, a często nie ma po prostu znaczenia) tylko brak miejsca. W asmie masz tylko to co napiszesz. w C, a w C++ jeszcze bardziej, kompilator dorzuca śmieci, funkcje z biblioteki standardowej.. i szybko zaczyna to zajmować więcej niż mamy dostępnej pamięci.

Pokaż pozostałe 10 komentarzy
@bajos: robić softowe USB na mikroklocku bez USB skoro tyle innych ma USB i kosztuje podobne pieniądze to jest kosmos i projektowanie bez pomyślunku. Zwłaszcza, że dział handlowy Cię nie ogranicza. - alagner 2015-07-15 00:20
@alagner, ja dopiero zaczynam z uC. Jak przy mikrokontrolerach zostane i się nie znudzi to można pomyśleć o ARM. Przecież AVRy mają UARTa i można to na USB przerobić (czy coś w tym rodzaju, nie jestem jeszcze tak obeznany). - bajos 2015-07-15 00:24
Istnieją AVRy ze sprzętowym USB zamiast UARTu, mają końcówkę U, np. ATMega32U4. To zasadniczo jest mega32 tylko, że z USB. Nie wiem o co chodzi w tej naszej literaturze, żeby takie erzace robić, ale to w moim odczuciu kupy się nie trzyma. Sorry, to jest masochizm jak dla mnie. Podstawowa zasada: dobrać sprzęt do projektu, nie odwrotnie. - alagner 2015-07-15 00:29
pseudo komputer, bo tak pomyślałem co Ty chcesz zrobić i to było by pewnie coś w stylu jakiś format plików dajmy że FAT12 bo prosty + CLI po uart i komendy typu utwórz plik, skasuj plik, listuj pliki. No, no ten pseudo komputer byłby imo dużo prostszy od GRYWALNEJ kierownicy. @alagner nie no, jak coś chce się zbudować dla relaksu szybciutko to sie bierze co pod łapą jest, ewentualnie wykręca ze 'starego wideła' :D - Proxima 2015-07-15 00:31
@bajos: na AVR możesz mieć prawdziwe USB w konkretnych modelach, możesz mieć UART do którego podłączysz "przejściówkę" COM-USB, albo możesz sobie wgrać WTF-ową software'ową implementację USB na pinach AVR-a. - Azarien 2015-07-15 02:01

Pozostało 580 znaków

2015-07-14 15:19
0

@Azarien: wiem, ale przy umiejętnym stosowaniu staticów, inline i innych możliwości języka C naprawdę aż takiej różnicy nie ma. Dołóż do tego optymalizację Os. To już prędzej w ASM napisałbym ISRa, który totalnie nie używa stosu, za to ma szybko "machnąć" pinem procka. Miałem kilkukrotnie okazję szukać oszczędności C <-> ASM, i jeżeli w ogóle cokolwiek dawało się znaleźć to były to pojedyncze bajty, pod warunkiem oczywiście że kod napisany był dobrze.

EDIT: btw - po to jest itoa zamiast sprintfa itd. ;) Fakt, o tym trzeba wiedzieć, ale to też wliczam do "dobrze napisanego kodu"

edytowany 3x, ostatnio: alagner, 2015-07-14 15:24

Pozostało 580 znaków

2015-07-14 19:17
0

Czym kompilujecie kod do hexa? Ja mam zainstalowane avra i avr-asm tylko, że obydwa sypią errorami. Kod to prosty:

.nolist
.include "src/m16def.inc"
.list

.device atmega16

.cseg
.org 0

ldi R16, (1<<PINB0)
out DDRB, R16
out PORTB, R16 

128 postów [25.06.2015r. 21:03]
edytowany 1x, ostatnio: bajos, 2015-07-14 20:44
a gdzie pętla główna? - alagner 2015-07-15 00:07
@alagner nie mój kod ;p Z jakiegoś &quot;kursu&quot; jak nazwał autor na www.forbot.pl - bajos 2015-07-15 00:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0