Może czas zmienić nazwe forum?

Jeżeli masz propozycje dotyczące forum lub portalu - pisz śmiało. Jest to również dobre miejsce do wyrażenia swoich opinii i zgłoszenia błędów.
ODPOWIEDZ
Awatar użytkownika
Circuit Chaos
-
Posty: 20
Rejestracja: 12 lut 2021, 0:54
Kontakt:

Re: Może czas zmienić nazwe forum?

Post autor: Circuit Chaos » 05 kwie 2022, 19:39

es2 pisze: ↑
05 kwie 2022, 16:31
Ten kurs ma błędy.
Jakie np.?
es2 pisze: ↑
05 kwie 2022, 16:31
Zgłaszałem je ale "honor' autora nie pozwolił aby je poprawić w zamian zostałem z banowany niczym na forum Atnela, coś źle powierz o autorze i ban.
Źle to świadczy… nikt nie wie wszystkiego, umiejętność przyznania się do błędu to cenna rzecz.
es2 pisze: ↑
05 kwie 2022, 16:31
Nikt rozsądny nie realizuje nowych projektów na AVR. Są drogie, mają małe możliwości, kompilator ma wiele wad. Wszystko to zmusza do dłuższej pracy nad softem a to niebagatelne pieniądze.
Jeśli chodzi o programowanie bare metal, to nie mam porównania. Fakt, że są droższe, niż STM32 o większych możliwościach i czasem brakuje mi zasobów, ale do małych, hobbystycznych zastosowań wystarczają – choć jakbym znał STM32, to miałbym większy wybór i patrząc na ich możliwości pewnie czasem bym ich używał, może nawet częściej niż czasem… i taki jest cel.

O jakich wadach kompilatora mówisz? Używam avr-gcc, nie zauważyłem w nim nic osobliwego.

grzegorzn
-
Posty: 18
Rejestracja: 14 cze 2016, 17:31
Lokalizacja: Warszawa
Kontakt:

Re: Może czas zmienić nazwe forum?

Post autor: grzegorzn » 05 kwie 2022, 20:41

es2 pisze: ↑
05 kwie 2022, 16:35
Circuit Chaos pisze: ↑
05 kwie 2022, 0:45
Szkoda. Cykl Karola Świerca o przetwornicach też był trudny, a jednak się przyjął.
Zapaliło się światełko w tunelu w temacie kursu STM32.
Bo te przetwornice przeszły? Mam w pamięci mój kurs AVR w EdW, który został przyjęty dosyć średnio. Niektórzy chwalili ale było też sporo krytyki. Na pewno były niedociągnięcia z mojej strony, ale wygląda też na to, że nawet jeśli ktoś jest dobrym elektronikiem, ale nigdy nie programował, to będzie mu dosyć trudno wziąć się za programowanie. Nie dziwię się więc odpowiedzi redakcji, że temat jest za trudny. Owszem, nieraz publikowali coś, co mogło by dostać i 4 gwiazdki trudności, ale to raczej wyjątki, które niczego nie potwierdzają. Grupą docelową EdW jednak są osoby początkujące.
es2 pisze: ↑
05 kwie 2022, 0:35
Nikt rozsądny nie realizuje nowych projektów na AVR. Są drogie, mają małe możliwości, kompilator ma wiele wad. Wszystko to zmusza do dłuższej pracy nad softem a to niebagatelne pieniądze.
Również chętnie się dowiem o tych błędach kompilatora.

Co do nowych projektów - owszem, AVR-y mają swoje wady, ale do wielu projektów wystarczają. Za sprawą Arduino AVR-y dostały drugie życie i setki tysięcy ludzi realizują na nich swoje projekty. Czy oni wszyscy są nierozsądni? Nie powiedziałbym. O ile peryferia i moc obliczeniowa wystarczają, to AVR nie jest taki zły. Nie potrzeba dłuższej pracy ani niebagatelnych pieniędzy.

Swoją drogą w chwili obecnej mamy taką sytuację, że bardzo często bierze się to, co jest akurat dostępne w sklepach a nie to co się chce. Jedną czy dwie sztuki jakiegoś mikrokontrolera hobbysta jeszcze znajdzie, ale jak trzeba 1000 sztuk, to już nie można wybrzydzać.

Awatar użytkownika
Circuit Chaos
-
Posty: 20
Rejestracja: 12 lut 2021, 0:54
Kontakt:

Re: Może czas zmienić nazwe forum?

Post autor: Circuit Chaos » 05 kwie 2022, 21:14

grzegorzn pisze: ↑
05 kwie 2022, 20:41
Na pewno były niedociągnięcia z mojej strony, ale wygląda też na to, że nawet jeśli ktoś jest dobrym elektronikiem, ale nigdy nie programował, to będzie mu dosyć trudno wziąć się za programowanie.
Przeglądam czasem programy pisane przez elektroników na mikrokontrolery w ich projektach i niestety często są to rozwiązania bardzo mierne :( Programowanie to jest w zasadzie odrębna, szeroka dziedzina wiedzy. Nie wiem, czy da się nauczyć programowania z kursu. Na pewno da się za to nauczyć szczegółów konkretnej platformy.
grzegorzn pisze: ↑
05 kwie 2022, 20:41
Co do nowych projektów - owszem, AVR-y mają swoje wady, ale do wielu projektów wystarczają.
Pytanie co jeśli nie byłby to projekt hobbystyczny i liczyłaby się cena… ja już teraz realizuję tylko projekty hobbystyczne, więc czy mikrokontroler kosztuje 5 zł, czy 15 zł, to nie ma większego znaczenia.
grzegorzn pisze: ↑
05 kwie 2022, 20:41
Swoją drogą w chwili obecnej mamy taką sytuację, że bardzo często bierze się to, co jest akurat dostępne w sklepach a nie to co się chce. Jedną czy dwie sztuki jakiegoś mikrokontrolera hobbysta jeszcze znajdzie, ale jak trzeba 1000 sztuk, to już nie można wybrzydzać.
Jakiś czas temu szukałem ATtiny4313 (bo oszacowałem, że soft może nie zmieścić się w ATtiny2313). Jednej sztuki, bez płacenia 2x tyle za wysyłkę. Nie znalazłem. Na szczęście przeszacowałem i udało mi się upchnąć w ATtiny2313. https://www.youtube.com/watch?v=T9I-HoCA6_E

es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 06 kwie 2022, 16:57

grzegorzn pisze: ↑
05 kwie 2022, 20:41
Również chętnie się dowiem o tych błędach kompilatora.
Błędy a może raczej niedociągnięcia bo wszystko jest opisane w dokumentacji kompilatora a jak wnioskuję praktycznie nikt jej nie czyta.
Ułomności AVR-GCC opisywałem w EP i tam odsyłam po szczegóły. Tak z największych błędów/niedociągnięć, które pamiętam:
- Odkładanie na stos R0 i R1 mimo, że nie są używane.
- Operacja "<<" tylko na 16 bitach.
- Wymagane rzutowanie w sytuacjach, gdzie inne kompilatory tego nie wymajają.
Mam długi wykaz problemów z Arduino (w domyśle AVR ale nie tylko). Mogę udostępnić, jest co czytać.

grzegorzn pisze: ↑
05 kwie 2022, 20:41
Co do nowych projektów - owszem, AVR-y mają swoje wady, ale do wielu projektów wystarczają.
Co z tego, ze wystarczają? Jeśli mam wybór:
- Drogi AVR "szyty na miarę" i z długim czas pisania programu.
- Tani ARM (nie tylko STM32) ale "przerośnięty", program napiszę szybko.
Jak mawia klasyk "Oczywista oczywistość", że wybiorę ARM i każdy rozsądny tak zrobi.

Awatar użytkownika
Circuit Chaos
-
Posty: 20
Rejestracja: 12 lut 2021, 0:54
Kontakt:

Re: Może czas zmienić nazwe forum?

Post autor: Circuit Chaos » 06 kwie 2022, 17:24

es2 pisze: ↑
06 kwie 2022, 16:57
Ułomności AVR-GCC opisywałem w EP i tam odsyłam po szczegóły.
Pamiętasz może, w którym numerze?
es2 pisze: ↑
06 kwie 2022, 16:57
Tak z największych błędów/niedociągnięć, które pamiętam:
- Odkładanie na stos R0 i R1 mimo, że nie są używane.
W przypadku avr-gcc 5.4.0 (taki mam, na takim sprawdziłem) r0 jest odkładany, bo prolog i epilog używa go do odłożenia na stosie zawartości SREG.

r1 z jakiegoś powodu jest w prologu odkładany i zerowany nawet, gdy nie jest potem używany. Dlaczego – nie wiem. Wygląda na niedociągnięcie kompilatora, ja w każdym razie nie widzę w tym sensu.

Po wyłączeniu generowania prologu i epilogu atrybutem ISR_NAKED rejestry nie są już odkładane.
es2 pisze: ↑
06 kwie 2022, 16:57
- Operacja "<<" tylko na 16 bitach.
Jesteś pewien? Właśnie zrobiłem test bit-shiftu w czasie kompilacji (nie wykonywania) i prawidłowo przesunął 1 o 20 bitów w lewo.

Drugi test – przesunięcie wartości 0x10000 o 1 bit w lewo. Również przesunął prawidłowo.

Kod, który przesuwa w czasie wykonywania, ciężko mi przeanalizować, bo przesunięcie jest robione na piechotę.
es2 pisze: ↑
06 kwie 2022, 16:57
.- Wymagane rzutowanie w sytuacjach, gdzie inne kompilatory tego nie wymajają.
Np. kiedy?

Czytałem kiedyś o konieczności rzutowania przy użyciu operatora negacji bitowej, ale porównywałem wygenerowany kod i nie było różnicy.

PORTB = (uint8_t) ~_BV(1);
PORTB = ~_BV(1);

Te dwa fragmenty kompilują się do tego samego:

ldi r24, 0xfd
out 0x18, r24
es2 pisze: ↑
06 kwie 2022, 16:57
Mam długi wykaz problemów z Arduino (w domyśle AVR ale nie tylko). Mogę udostępnić, jest co czytać.
Podrzuć, to zawsze jest ciekawe.
es2 pisze: ↑
06 kwie 2022, 16:57
- Drogi AVR "szyty na miarę" i z długim czas pisania programu.
- Tani ARM (nie tylko STM32) ale "przerośnięty", program napiszę szybko.
Nie mam porównania czasów pisania programu (musiałbym znać STM32), ale programując AVRy raczej nie używam dużo „glue code”, tylko przechodzę od razu do tego, co chcę zrobić. Nie wiem, jak miałoby się to dziać szybciej.

es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 06 kwie 2022, 17:41

Circuit Chaos pisze: ↑
06 kwie 2022, 17:24
es2 pisze: ↑
06 kwie 2022, 16:57
Ułomności AVR-GCC opisywałem w EP i tam odsyłam po szczegóły.
Pamiętasz może, w którym numerze?
Od 3-2017. Na resztę pytań odpowiem później.

es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 06 kwie 2022, 17:47

Circuit Chaos pisze: ↑
06 kwie 2022, 17:24
es2 pisze: ↑
06 kwie 2022, 16:57
Tak z największych błędów/niedociągnięć, które pamiętam:
- Odkładanie na stos R0 i R1 mimo, że nie są używane.
W przypadku avr-gcc 5.4.0 (taki mam, na takim sprawdziłem) r0 jest odkładany, bo prolog i epilog używa go do odłożenia na stosie zawartości SREG.

r1 z jakiegoś powodu jest w prologu odkładany i zerowany nawet, gdy nie jest potem używany. Dlaczego – nie wiem. Wygląda na niedociągnięcie kompilatora, ja w każdym razie nie widzę w tym sensu.
Co do R0, nie zawsze SREG trzeba zachowywać! Ponadto, czemu nie robi tego R1?

Co do R1, nie znasz kompilatora! W R1 jest przechowywana wartość ZERO. Nie wiem czemu tak głupio wybrano rejestr dla ZERO. Czy nie mógł być R2? Zapytasz, co za różnica, R1 czy R2? Otóż bardzo duża. Rejestru z wartością ZERO kompilator "nie tyka" ale R1 używa operacja mnożenia albo dzielenia (sprawdź).
Teraz wiesz czemu R1 jest zerowany przed wyjściem z przerwania?
Pytanie, dlaczego jest zerowany, mimo, że w przerwaniu nie był użyty? To ewidentny błąd!
Gdy użyjesz atrybutu NAKED, to w 99% przypadków program się "wysypie". Napisz skomplikowany kod przerwania, nie tylko R0 i R1 nie będzie odkładane na stos ale także inne używane. Efekt wiadomy.
Opisywałem jak używać NAKED i kiedy.

es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 06 kwie 2022, 17:53

Circuit Chaos pisze: ↑
06 kwie 2022, 17:24
es2 pisze: ↑
06 kwie 2022, 16:57
- Operacja "<<" tylko na 16 bitach.
Jesteś pewien? Właśnie zrobiłem test bit-shiftu w czasie kompilacji (nie wykonywania) i prawidłowo przesunął 1 o 20 bitów w lewo.
Użyj kompilatora w wersji, której ja używałem.
Użyj jeszcze starszego i "long long" będzie tym samym co "long" tak jak zdaje się do dziś "double" to "float" - kolejna niedoróba.

Próbowałeś przesunąć o 32 bity lub więcej?
Pewnie to jeszcze nie działa.

es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 06 kwie 2022, 18:38

Circuit Chaos pisze: ↑
06 kwie 2022, 17:24
es2 pisze: ↑
06 kwie 2022, 16:57
Mam długi wykaz problemów z Arduino (w domyśle AVR ale nie tylko). Mogę udostępnić, jest co czytać.
Podrzuć, to zawsze jest ciekawe.
Temat błędów Arduino, AVR to temat rzeka. Warto pisać do AVT, mogę zająć się tematem. Daję co mam.

Kod: Zaznacz cały


Kilka Arduino sprawia kłopoty:
////	https://www.elektroda.pl/rtvforum/topic3624919.html







W mojej ocenie, Arduino traktuje uC jak Z-8 (CPU + GPIO) czy 8051 gdzie ze sprzętu to głównie proste timery i UART. ZERO wykorzystania sprzętu! Bo co wspierają biblioteki Arduino? UART z malutkim buforem w RAM, I2C to samo. SPI bez bufora, bez przerwań. Timer tylko nieudolnie liczy czas systemowy. PWM jeszcze działa. Pomiar czasu (pulseIn) czy częstotliwości realizowany jest bez wykorzystania możliwości sprzętowych timera. 1-Wire, WS2812 to samo, "machanie pinem" i o zgrozo zawieszanie przerwań nawet na dziesiątki ms. Gdy pisałem bibliotekę dla turbo WS2812 nie mogłem użyć wbudowanej biblioteki dla I2C. Nie było sensu pisać własnej więc dobrałem się bezpośrednio do rejestrów. Dalej, ADC. Przerwania? Nie, program kręci się w kółko czekając na koniec konwersji. Bibliotek używających DMA nie widziałem, przy czym zaznaczam, że nie analizowałem ESP.
Zgodzę się, że czasem proste rozwiązania wystarczą ale dlaczego, tak jak w HAL STM32, w Arduino nie ma funkcji tak blokujących jak i na przerwaniach i DMA?
Trugniejsze pytanie, dlaczego, przez wiele lat istnienia Arduino takie nie powstały?

Nie będę kijem Wisły zawracał. AVR będzie umierać czy tego się chce czy nie. Wraz z AVR zacznie umierać Arduino, chyba, że zacznie migrować w stronę ARM ale nie jak dotychczas, bez bibliotek używających sprzętu. Tu jest cały problem Arduino! Brak bibliotek wykorzystujących sprzęt! Gdybym był dystrybutorem jakiegoś tam osprzętu (np wyświetlaczy) to napisałbym biblioteki do jego obsługi ale nie jestem. Jaki więc sens pisania takiej biblioteki? Tylko satysfakcja.
Chyba nie tylko ja nie wiedzę sensu pisania bibliotek ale producenci uC też. Powstają płytki ze złączem Arduino ale bibliotek do nich nie ma. Dlaczego? Dlaczego na stronie producenta czy dystrybutora nie ma linków do takich bibliotek? Na moją wiedze one nie istnieją albo nie wiem gdzie szukać.

W sumie temat na ciekawą dyskusję. Arduino znam tylko od strony AVR i ESP32 i niestety, biblioteki są beznadziejne, w praktyce bezużyteczne. Bardzo ciężko napisać dobry program o czym już kilka razy się przekonałem. Są tacy, którym się wydaje, że ich program działa dobrze ale kilka moich prostych testów "wykrzacza" program i np rybki w akwarium odpoczywają pływając kraulem B albo woda w CO gotuje się.
Widzę bardzo duży problem związany z testowaniem oprogramowania ale jak nie potrafi się pisać programu to jak go dobrze przetestować?



-----------------------------------
Złe wyłaczanie (i po co) przerwań przy modyfikacji GPIO:
W którymś tam katalogu arduino, albo w linku https://github.com/arduino/ArduinoCore- ... _digital.c, można znaleźć

uint8_t oldSREG = SREG;
        cli();
        if (val == LOW) {
                *out &= ~bit;
        } else {
                *out |= bit;
        }
        SREG = oldSREG;
		
Jesli już to ATOMIC_BLOCK(ATOMIC_RESTORESTATE) bo po to jest i tylko dla adr SFR > $3F		


-----------------------------------		
Nie można podłączyć się pod przerwanie 1ms:
SIGNAL(TIMER0_OVF_vect)
{
    // copy these to local variables so they can be stored in registers
    // (volatile variables must be read from memory on every access)
    unsigned long m = timer0_millis;
    unsigned char f = timer0_fract;
 
    m += MILLIS_INC;
    f += FRACT_INC;
    if (f >= FRACT_MAX) {
        f -= FRACT_MAX;
        m += 1;
    }
 
    timer0_fract = f;
    timer0_millis = m;
    timer0_overflow_count++;
}
a moznaby dodać np
if( adr_user_1ms ) (*((void(*)(void))adr_user_1ms))();		// CALL do funkcji o adresie "adr_user_1ms"
Jeśli user przypisze
adr_user_1ms = &funkcja_uzytkownika;
to wykona się w przerwaniu 1ms, jeśli nie, to adr_user_1ms=0 i skoku nie będzie. Czy to takie trudne?

Na szczęście odczyt millis jest poprawny:
unsigned long millis()
{
    unsigned long m;
    uint8_t oldSREG = SREG;
 
    // disable interrupts while we read timer0_millis or we might get an
    // inconsistent value (e.g. in the middle of a write to timer0_millis)
    cli();
    m = timer0_millis;
    SREG = oldSREG;
 
    return m;
}
i uzywa ATOMIC_BLOCK(ATOMIC_RESTORESTATE) po swojemu.


-----------------------------------	Grafika -----------------------------------
Idiotyczna obsługa 16-bit LCD w Mega2560:

#define WR_ACTIVE  WR_PORT &= ~WR_MASK
#define WR_IDLE    WR_PORT |=  WR_MASK

#define WR_STROBE { WR_ACTIVE; WR_IDLE; }

#if defined(__AVR_ATmega2560__)
   #ifdef USE_ADAFRUIT_SHIELD_PIN
	 #define RD_PORT PORTL
  	 #define WR_PORT PORTG
     #define CD_PORT PORTD
     #define CS_PORT PORTG
	 #define RD_MASK B01000000
  	 #define WR_MASK B00000010
  	 #define CD_MASK B10000000
  	 #define CS_MASK B00000001
	 
	 #define write_16(x)    { PORTA = (x) >> 8; PORTC = x; WR_STROBE;}
	 #define write8(x)     { PORTC = x; WR_STROBE;}
	 #define read_16(dst)   { RD_STROBE;dst = (PINA<<8) | (PINC); RD_IDLE;}
	 #define read8(dst)    { read16(dst);dst &= 0xFFFF;}
	 #define setWriteDir() { DDRC = 0xFF; DDRA = 0xFF; }
	 #define setReadDir()  { DDRC = 0x00; DDRA = 0x00; }
	#else
	 #define write_16(x)   { PORTA = (x) >> 8; PORTC = x; WR_STROBE;}
	 #define write8(x)    { PORTC = x; WR_STROBE;}
	 #define read_16(dst)   { RD_STROBE;dst = (PINA<<8) | (PINC); RD_IDLE;}
	 #define read8(dst)    { read_16(dst);dst &= 0xFFFF;}
	 #define setWriteDir() { DDRC = 0xFF; DDRA = 0xFF; }
	 #define setReadDir()  { DDRC = 0x00; DDRA = 0x00; }
	
	#endif

Programowy port zamiast sprzetowego (buss keeper), wtedy wystarczy:
- zapis PORTC;
- zapis XRAM. WR wygeneruje się automatycznie.
Ponadto zatrzask na AD0 lub uaktyrnić EXT 512b (PC0 = A8) i sprzętowy zapis danej (adr=xxxx...xxxx1) lub CMD (adr=xxxx...xxxx0).  
jakby mega2560 nie miała buss keepera. Jak dodać zatrzask na przerzutniku D np 74HC74 to oszczędzamy jeden pin AVR bo linia AD0 jest zarówno linią danych jak i A8 (przy okazji tracimy jedną na ALE więc bilans jest na 0). 
A8 łączymy z RS LCD i zależnie czy zapisujemy pod adres parzysty XRAM czy nieparzysty będzie to komenda lub dane dla LCD. Niby zysk z użycia XRAM jest niewielki bo 2 cykle* ale to 2 razy mniej
 a do wyświetlacza 480x320 trzeba zrobić ponad 150 tysięcy przesłań aby wypełnić cały wyświetlacz (i tak takiego bufora w RAm AVR nie da się zrobić ale może to być zewnętrzna RAM)
 co przy 16MHz (mega2560 max 16MHz) daje osczzędność czasu prawie 200ms! 
* zapis machanie pinem:
ST X,Rx ; 2 cykle
CBI PORT,WR ; 1 cykl
SBI PORT,WR; 1 cykl
zapis sprzętowy (XRAM)
ST X,Rx ; 2 cykle


-----------------------------------	Adafruit - wzór jak nie pisac bibliotek -----------------------------------		
Grafika: 
Rysowanie wypełnionych prostokatów: Zamiast zdefiniowac okno i je wypełnic kolorem (dla 3240x240 9bajtów + 153`600 = 153`609 bajtów)
 stawia piksel po pikselu (7*320*240 = 537`600) co daje 3,5 raza więcej danych do przesłania, spowalniając i tak powolna obsługę wyświetlacza.
Czcionka: Problej jak powyżej istotny zwłaszcza dla dużych czcionek.


-----------------------------------		
Dane z gps mają postać (string) 12345678912. Biblioteka TinyGPS++ zamienia je na int, a następnie (nie wiem po co) na double:

Kod:
double TinyGPSLocation::lng()
{
updated = false;
double ret = rawLngData.deg + rawLngData.billionths / 1000000000.0;
return rawLngData.negative ? -ret : ret;
}

Otrzymujemy float 12.345678912, a kolega znowu zamienia je na int.
Sensu nie widzę.

Wywalić bibliotekę i pracować na czystych danych NMEA.
Już gdzieś o tym pisałem na łamach naszego forum. 


-----------------------------------		
Cekawy i cytat
    Cytat EdW 3-2020 str. 35:
    Nic więc dziwnego, że często znajdujemy biblioteki, zawierające zdecydowanie nieoptymalne rozwiązania. W przypadku Arduino należy cieszyć się, jeżeli system działa. A jeżeli ktoś chce optymalizować jego działanie, to niech zapomni o Arduino i gotowych, uniwersalnych bibliotekach, tylko niech pisze program dokładnie pod swoje potrzeby. A to oczywiście wymaga dużej wiedzy i doświadczenia.
Każdy arduinowiec powinien sobie to kazać wykuć na ścianie nad kominkiem lub w innym widocznym miejscu. 


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


Inne ciekawe:
https://www.elektroda.pl/rtvforum/viewt ... 1#18790981

Kod: Zaznacz cały

Używam ARM bo:
- ARM przeważnie są tańsze niż AVR o podobnym wyposażeniu oferując zdecydowanie większe możliwości (DMA, więcej bardziej zaawansowanych niż w AVR peryferii) i prędkość działania.
- ARM, przy tym samym zegarze jest ok 7 razy szybszy od AVR, a maksymalne częstotliwości taktowania zaczynają się od 24MHz a kończą na 650 (w przypadku rodziny STM32).
- W przeważającej większości mają więcej pamięci RAM i można robić duże bufory nadawcze dla UART, I2c, SPI, USB.
- Maja bogatsze wyposażenie (liczba USART/UART, I2C, SPI, timerów) i większe możliwości tychże peryferii. 12 UART w STM32 nie jest problemem, AVR max 4. Można dołożyć np SC16IS7xx ale 1 UART to ok 10zł, 2 ok 19zł).
- Mają DMA (AVR ATmega/tiny nigdy o czymś takim nie słyszały).
- Wiele ARM ma USB, w AVR to rzadkość a USB jest teraz pewnym standardem.

- Sprzętowe sterowanie przepływem i kierunkiem transmisji (RS485), wykrywanie końca ramki, określanie prędkości transmisji.
- Wersje z Ethernetem, AVR nie ma z ETH.
- Wszystkie timery 16-bit (można łączyć w 32-bit) a wiele wersji posiada 32-bit.
- ADC 12..16-bit, CA 12-bit.
- ADC do 80MS/s (LPC), 18MS/s (STM32).
- Mają wielopoziomowy system przerwań (15 poziomów, Xmega tylko 3, Mega/Tiny 0 ale najnowsze wersje maja już 2/3 poziomy).
- Zdecydowanie większe pojemności pamięci FLASH (do 2MB) i RAM (do 1MB) o czym nawet AVR Xmega mogą tylko pomarzyć.
- Sprzętowe interfejsy CAN, LCD równoległe, matryce LCD kolor 18-bit.
- Stany wyjątkowe: Błąd magistrali i podobne jak w MC68k (dawne MAC, Amiga).
- Kilkadziesiąt razy tańsze narzędzia. Ddebuger STM32 - 13zł vs ATATMEL-ICE-PCB 300zł, w obudowie 700zł (Basic 470zł), Dragon ok 450zł, chyba najtańszy klon JTAG-ICE 45zł (tylko JTAG)


- CubeMX do konfigurowania i generowania kodu (najnowszy środowisko CubeIDE, zawiera także IDE, kompilator, wszystko skonfigurowane do pracy z ST-LINK).
- Podczas debugowania na bieżąco widzę stan zmiennych w AVR po zatrzymaniu uC.
- Nie muszę się zastanawiać czy dana jest w ram czy flasch aby użyć stosownej funkcji (z sufiksem _P).
- Argument w sprintf, scanf itp nie jest ograniczony do 16-bit (int) lecz do 32-bit.
- Przesuwane bitu (w lewo) nie jest ograniczone do 16 bitów.
- W AVR nie ma typu double, ma taki sam zakres jak float. I tak dobrze, że od którejś tam wersji, typ long long ma 64-bity a nie jak wcześniej 32-bit tak samo jak long.
- AVR nie mają FPU, STM32 wiele rodzin posiada FPU.
- Odkładanie na stos w przerwaniu rejestrów, które czasem nie są używane (R0, R1, RAMPZ, rejestr statusu) co wymusza czasem używanie wstawek ASM.

- Maureli, Tytuł: uint64_t ciekawostka Wrzucam parę cennych informacji na temat błędu dotyczącego operacji AND na liczbach typu uint64_t w avr-gcc
	https://stackoverflow.com/questions/50091499/uint64-t-variable-with-operations
	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85805



Przykładowo, wysyłanie danych do WS2812 w przypadku Arduino (nie ważne AVR, ARM czy ESP) blokuje CPU na czas tej operacji. Nie wiem jak w przypadku ESP i ARM ale w AVR blokowane są przerwania. To oznacza, że w tym czasie nie będą np odbierane znaki przez UAR, nie działa USB, itp. Transmisja do LED może trwać nawet kilkadziesiąt ms. W ARM, sama transmisja będzie trwać tyle samo ale CPU będzie zajęty tylko przez kilkaset ns bo wysyłaniem danych zajmuje się DMA.
To samo z LCD, w AVR CPU zajęty 100% w czasie wysyłania danych (typowo 20..40ms w przypadku kolorowego wyświetlacza), na ARM us. 

Wysyłanie na AVR danych do wyświetlacza w czasie dziesiątek ms jest możliwe, że ma wymaganą ilość pamięci RAM na bufor. Wyświetlacz 96x64 wymaga 12'288bajtów RAM (z Mega w grę wchodzi tylko Mega1284), 128x128 wymaga 32kB RAM, więc Mega odpada. Wymusza to stawianie punktu po punkcie, co zajmuje ok 3 razy więcej czasu.
Namacalne dowody:
https://www.elektroda.pl/rtvforum/topic3588785.html
Zainstalowałem bibliotekę „TFT_ILI9163C-master” ze strony „Nettigo”. Uruchomiłem przykład „Cube”, efekty widać na filmie. 
https://es2.000webhostapp.com/Szescian_3D_Arduino_UNO.mp4
Zagoniłem do pracy ARM STM32F411CE. Zegar ustawiłem na 60MHz, co pozwoliło taktować SPI częstotliwością 15MHz, maksymalną dopuszczalną dla IL9306. Przeniosłem bibliotekę z Arduino, oto efekt: 
https://es2.000webhostapp.com/Szescian_3D_ARM_bez_DMA.mp4
Słaby coś ten ARM, animacja niewiele szybsza (użyłem HAL, gdyby wykorzystać dostęp rzez rejestry animacja byłaby prawie 2 razy szybsza niż na UNO). Nie, to nie ARM słaby tylko programista, który przeniósł kod nie wykorzystując możliwości sprzętowych ARM. Stworzyłem bufor na dane dla wyświetlacza (128*160*2=40960bajtów) i zagoniłem do pracy DMA. Efekt: 
https://es2.000webhostapp.com/Szescian_3D_ARM_z_DMA.mp4
Na koniec porównanie ARM z AVR, gdzie na AVR wyraźnie widać rysowanie tła podczas jego zmiany. 
https://es2.000webhostapp.com/Szescian_3D_ARM_vs_AVR.mp4
https://es2.000webhostapp.com/Szescian_3D_i_animowane_tlo.mp4
Forum: https://www.elektroda.pl/rtvforum/topic3588785.html

Akcelerator LCD forum: https://forbot.pl/forum/topic/16876-akcelerator-dla-wyswietlaczy-graficznych/#comments		pokrewny temat: https://www.elektroda.pl/rtvforum/topic3588785.html
Akcelerator LCD YT: https://www.youtube.com/playlist?list=PLdtkbzWTUVMnNf_gExmLmiaacjvhzPRdM		https://www.youtube.com/playlist?list=PLdtkbzWTUVMnNUNH3MiWQ9s86bcULhy33
Akcelerator WS2812: https://forum.atnel.pl/post222192.html#p222192


Dla początkujących: https://stm32.eu/2019/01/31/nowa-ksiazka-mikrokontrolery-stm32-dla-poczatkujacych-juz-dostepna/


RTOS:
Wracając do RTOS w ogóle. Wielokrotnie moderatorzy (który wyrośli bardzo szybko z amatorów dalay-owców) uświadamiali mnie, że forum Arduino Polska jest dla amatorów co potwiedza, że na forcha, istnieje przekonanie, że RTOS to napacveum na wszystko. Skoro chcesz się zabrać za RTOS, to z pewnością:
- Biegle posługujesz się przerwaniami od każdego możliwego układu peryferyjnego zarówno podczas nadawania jak i odbioru.
- DMA nie ma dla Ciebie tajemniec.
- Nie masz delay i pętli oczekującej na zdarzenie np
[code]
while ( cos_tam ) ;
w kodach bez RTOS.
- Programy realizujesz w oparciu o maszynę stanów.
- Potrafisz synchronizować zdarzenia z różnych pseudowątków pomiędzy sobą (w RTOS będzie trudniej, mutex'y, semafory, kolejki) oraz pomiedzy przerwaniami a programem głównym.
Gdy wszystko co powyższe nie jest dla Ciebie tajemnicą możesz zabrać się za RTOS, w przeciwnym wypadku, pewnie napotkasz ogromne problemy.
[/code]


I 10 przykazań

Kod: Zaznacz cały

													10 grzechówgłównych poczatkującego Arduinowca i nie tylko.


----------------------------	GRZECHY CIĘŻKIE		-----------------------------------------------------------------------		ROZWIĄZANIE PROBLEMU	-----------------------------------------------------

1. Pierwsza nauka zrealizowanie wymarzonego, najczęściej "wypasionego" projektu.				- Nauka od migania diodą, następnie UART choćby do debugowania po czym dopiero obsługa peryferii,
																									które będą potrzebne w wymarzonym projekcie. Zapoznanie się z protokołami komunikacyjnymi,
																									notami katalogowymi używanych peryferii.
2. Nauka na wątpliwej jakości programach z Internetu.											- Nauka C/C++ elektroniki, z książek, czasopism np "kurs Arduino w EdW" "Ośla łączka EdW" 
																									ponieważ w Internecie często napisano bzdury.
3. Rozwiązywanie problemów metodą prób i błędów bez znajomości i zrozumienia zagadnienia.		- j.w.
4. Nadużywanie nieodpowiednich, zbyt dużych, typów (zwłaszcza float, int dla zakresu <256) 		- j.w. W dobrym programie nie ma delay i pętli w rodzaju "while( zdarzenie );".
	oraz delay. Używanie zmiennych tam gdzie mozna użyć stały lub definicji.
	Powodem jest nauka z nieodpowiednich źródeł, czerpanie inspiracji z źle
	napisanych programów znalezionych w Internecie.
5. Nieużywanie sprzętu lecz rozwiązań programowych.												- Nie używać soft UART, SPI, I2C, lecz wybrać inny uC. WS281x,
																									1-Wire obsługiwać UART-em (WS281x można też przez SPI, na ARM także I2C),
																									1-Wire można także przez DS248x.
6. Nieużywanie przerwań, DMA.																	- Wynika z nieznajomości uC i C/C++. Rozwiązanie punkt 2.
7. Wybór za małego uC.																			- Nieprzemyślany projekt, konieczność rozbudowy co zwiększa koszty, zmniejsza nie zwodność, komplikuje program.
8. LCD graficzne bez bufora. Operacje on-line w konsekwencji powolna obsługa, artefakty.		- Wybierać uC z wymaganą wielkością pamięci RAM.
9. Brak obsługi błędów. Program działa gdy działa, jest dobrze gdy jest dobrze.					- Sprawdzać statusy operacji i reagować na błędy.
	Jakikolwiek błąd i np. rybki w akwarium ugotowane.
0. Nienależyte testowanie zbudowanego urządzenia.												- Testować wszystkie zdarzenia jakie mogą wystąpić. Przykładowo modem GSM: niespodziewane wylogowanie z sieci.
																									Utrata komunikacji z peryferiami (np chwilowe zwarcie lub przerwa na magistrali).
																									Temat bardzo obszerny i indywidualny.


----------------------------	GRZECHY LEKKIE	-----------------------------------------------------------------------		ROZWIĄZANIE PROBLEMU	-----------------------------------------------------
- USB na mostku USB-UART, których w AVR jest bardzo mało.										- UART w AVR jest mało, wykorzystanie FIFO w mostku problematyczne. 
																									FT22x to mostek USB-SPI, FT20x mostek USB-I2C. Nie zajmuje UART, I2C wymaga jak UART 2 wyprowadzeń,
																									bezproblemowe jest wykorzystanie FIFO, AVR nie wymaga kwarcu.
- Nieużywanie Watchdog-a.																		- Bezwzględnie używać.
- Nieokreślanie przyczyny resetu.																- Wykrywać, wyświetlać/zapamiętywać.
- Brak mechanizmów debugowania. Najczęściej używane UNO ma jeden UART, który powinien służyć	- Pozostawiać UART, SPI, I2C (np mostek FT20x) do debugowania programu.
	tylko do debugowania i wgrywania softu a niestety jest używany do innych celów.
- Nieużywanie CRC i backup-u danych konfiguracyjnych zapisanych w EEPEOM.						- Używać.
- Brak wymaganego sprzętu (oscyloskop, analizator logiczny czasem generator).					- W dzisiejszych czasach multimetr nie wystarczy. 
																									Amatorski sprzęt nie jest drogi (co miesiąc można kupić przyrząd pomiarowy rezygnując z wątpliwych rozrywek 
																									jak używki, bezsensowna jazda motorem) ale trzeba umieć go poprawnie obsługiwać i interpretować wyniki.

	
----------------------------	EPILOG 		----------------------------------------------------	
Widac wyraźnie, że wszystkie błędy początkujących wynikają ze zwyczajnego lenistwa. Prawie wszystkie problemy wynikają z grzechu nr 1 i 2 - grzech zaniechania.
 Efektem są wątpliwej jakości konstrukcje, działające na stole u autora.
 W rzeczywistych warunkach, u innych użytkowników urządzenie nie działa, działa błędnie, zawiesza się. Brak diagnostyki uniemożliwia wręcz znalezienie źródła problemów. Trzeba szukać metodą prób i błędów.



----------------------------	PRZYKŁADY	----------------------------------------------------
Deklaracja zmiennej zamiast zdefioniować nr pinu:							
	int measurePin = 0;
	int ledPower = 2;
	analogRead(measurePin)
	pinMode(ledPower,OUTPUT);
	digitalWrite(ledPower,HIGH)

	Deklaracja pinów typem 16-bit ze znakiem (na AVR, na ARm 32-bit) w sytuacji, gdy liczba GPIO nieprzekracza 256. W efekcie:
	- Zwiększa się zużycie FLASH.
	- Niepotrzebnie zużywana jest pamięć RAM, której zwłaszcza w AVR sa "sladowe" ilości.
	- Kod działa wolniej. Na AVR dostęp do zmiennych 16-bit jest wolniejszy niż 8-bit.
Rozwiązanie:
	#define MEASURE_PIN = 0;
	#define LED_POWER = 2;
	analogRead(MEASURE_PIN)
	pinMode(LED_POWER,OUTPUT);
	digitalWrite(LED_POWER,HIGH)



Brak podstaw owocuje https://www.elektroda.pl/rtvforum/topic3648086.html
gdzie problemem okazał się brak znojowaści sysemów liczbowych.




----------------------------	Postscriptum	------------------------------------------------
W tytule nawiązałem do wiary katolickiej, bo wedłóg badań CBOS ponad 90% ludzi w Polsce jest wierzących. Wiem, ze to ewidentna bzdura, chyba, że te 90% wierzy, że Boga nie ma. 
Jakie mam na to dowody? Wystarczy wyjść na ulicę, zobaczyć co się dzieje na Wiejskiej, itp a najwięcej przeciwności nauki Chrystusa widac w Kościele, postepowaniu kapłanów, biskupów, włodaży w Rzymie.
Obserwując wygląd Księży wiem dlaczego diabeł jest przedstawiany jako czarna postać, dlaczego na złego człowieka mówi się "czarny charakter".




es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 06 kwie 2022, 18:42

Circuit Chaos pisze: ↑
06 kwie 2022, 17:24
es2 pisze: ↑
06 kwie 2022, 16:57
- Drogi AVR "szyty na miarę" i z długim czas pisania programu.
- Tani ARM (nie tylko STM32) ale "przerośnięty", program napiszę szybko.
Nie mam porównania czasów pisania programu (musiałbym znać STM32), ale programując AVRy raczej nie używam dużo „glue code”, tylko przechodzę od razu do tego, co chcę zrobić. Nie wiem, jak miałoby się to dziać szybciej.
Ty nie masz a ja mam.
Na AVR pracowałem około 10 lat, na STM32 5lat. Znam też 8051 (12 lat), 6502 (10 lat), Z-80 (5 lat), Z-8 (rok), 680x0 (10 lat), PIC (3 lata). Chyba uznasz, że mogę się wypowiadać o wadach i zaletach różnych CPU/uC?

Znam też GAL, CPLD i FPGA!

Znam wiele osób, które przeszły z AVR na ARM, nie znam ANI JEDNEJ, która by wróciła z ARM na AVR.
Czy te argumenty są przekonywujące?

Awatar użytkownika
Circuit Chaos
-
Posty: 20
Rejestracja: 12 lut 2021, 0:54
Kontakt:

Re: Może czas zmienić nazwe forum?

Post autor: Circuit Chaos » 06 kwie 2022, 19:34

es2 pisze: ↑
06 kwie 2022, 17:47
Co do R0, nie zawsze SREG trzeba zachowywać!
Zgoda – o ile nie ma instrukcji, które modyfikują SREG. Ten kod powinien być generowany tylko jeśli takie są, a nie zawsze.
es2 pisze: ↑
06 kwie 2022, 17:47
Ponadto, czemu nie robi tego R1?
Też racja. Mogliby użyć R1 a potem wyzerować, byłby jeden push mniej.
es2 pisze: ↑
06 kwie 2022, 17:47
Co do R1, nie znasz kompilatora! W R1 jest przechowywana wartość ZERO. Nie wiem czemu tak głupio wybrano rejestr dla ZERO. Czy nie mógł być R2? Zapytasz, co za różnica, R1 czy R2? Otóż bardzo duża. Rejestru z wartością ZERO kompilator "nie tyka" ale R1 używa operacja mnożenia albo dzielenia (sprawdź).
Chodziło mi o to, po co zerować rejestr, który nie jest używany.

Co do R1 – gdzieś mi się kiedyś przewinęło, że wybrali R1 jako __zero_reg__, zanim wprowadzono operację mnożenia do AVR. Nie wiem na ile to prawda.
es2 pisze: ↑
06 kwie 2022, 17:47
Teraz wiesz czemu R1 jest zerowany przed wyjściem z przerwania?
Pytanie, dlaczego jest zerowany, mimo, że w przerwaniu nie był użyty? To ewidentny błąd!
Tak, dokładnie o tym mówię.
es2 pisze: ↑
06 kwie 2022, 17:47
Gdy użyjesz atrybutu NAKED, to w 99% przypadków program się "wysypie". Napisz skomplikowany kod przerwania, nie tylko R0 i R1 nie będzie odkładane na stos ale także inne używane. Efekt wiadomy.
Atrybutu NAKED używam rzadko i w wyjątkowych sytuacjach, gdy kod jest na tyle krytyczny, że piszę go jako wstawki assemblerowe. Nie pamiętam, kiedy ostatnio go użyłem.
es2 pisze: ↑
06 kwie 2022, 17:53
Użyj kompilatora w wersji, której ja używałem.
Użyj jeszcze starszego i "long long" będzie tym samym co "long" tak jak zdaje się do dziś "double" to "float" - kolejna niedoróba.
Dobrze przynajmniej, że to poprawili.
es2 pisze: ↑
06 kwie 2022, 17:53
Próbowałeś przesunąć o 32 bity lub więcej? Pewnie to jeszcze nie działa.
W zasadzie nigdy nie zdarzyło mi się używać (ani potrzebować) na AVR liczb 64-bitowych… ale to prawda, jeśli standard na to pozwala, to powinno to działać.
es2 pisze: ↑
06 kwie 2022, 18:38
Temat błędów Arduino, AVR to temat rzeka. Warto pisać do AVT, mogę zająć się tematem. Daję co mam.
Dzięki.

Ja generalnie Arduino nie znam – jak weszło, to już znałem AVR na tyle, że do niczego go nie potrzebowałem (przerzuciłem się na AVR w 2006 r., wcześniej używałem MCU w rdzeniem '51 i pisałem na nie w assemblerze). Widziałem za to trochę kodu bibliotek dla Arduino – na tyle, żeby skutecznie się zrazić.
es2 pisze: ↑
06 kwie 2022, 18:42
Ty nie masz a ja mam. Na AVR pracowałem około 10 lat, na STM32 5lat.
Znam wiele osób, które przeszły z AVR na ARM, nie znam ANI JEDNEJ, która by wróciła z ARM na AVR.
Nie neguję tego, że STMy są w wielu zastosowaniach lepsze, ale czy we wszystkich? Najmniejsze projekty robiłem na ATtiny4 i podobnych (malutki AVR w obudowie SOT23-6). Zadania miały na tyle prymitywne, że gdyby nie zależało mi na miejscu, to pewnie nie zaprzęgałbym do nich MCU, tylko zrobiłbym to na piechotę, na bramkach. Nie wiem, czy jest odpowiednik z rodziny STM32, który byłby do tego tańszy.

Z drugiej strony wszystko, o czym mówię, to były jedynie projekty hobbystycznie. Zawodowo mogę powiedzieć, że od 11 lat programuję ARMy, ale będzie to półprawda – tak, mój kod chodzi na rdzeniu ARM, ale to są ogromne projekty, OS jest dostarczony przez osobny zespół (przez pewien czas był własnościowy, teraz jest to zmodyfikowany Linux), nad nim jest cała ogromna warstwa abstrakcji i bibliotek, więc o ile kod chodzi na ARMach, to nie dotyka on bezpośrednio żadnych peryferiów ani nie bierze pod uwagę architektury procesora. W zasadzie to jest też powodem mojego niezadowolenia z obecnej pracy – ja chciałbym być właśnie w teamie odpowiedzialnym za OS, a nie za aplikacje.

Jeden z kolegów wypowiadających się w wątku wie, o czym mówię, bo pracował ze mną nad tymi aplikacjami (nie wiem, czy życzy sobie, żeby wskazać go konkretnie, dlatego nie wskazuję).

W zasadzie najbliższą styczność z ARMem miałem, gdy postanowiłem uruchomić współczesnego (wtedy 4.x) Linuksa na zabytkowym sprzęcie i okazało się, że kompilacja dla targetu ARMel nie ruszy, bo użyty w urządzeniu StrongARM nie obsługuje trybu thumb (który nie był używany przez binarki, ale nieobecna w związku z brakiem trybu thumb instrukcja BX już tak). Zaemulowałem ją w kernelu, ale projekt i tak zarzuciłem ze względu na sprzętową niemożliwość zrobienia porządnego usypiania (Linux był uruchamiany z RAMu, ale procesor po wybudzeniu skakał pod adres, który był fizycznie przypisany do ROMu, w którym był Windows CE) – i tak się póki co skończyła moja przygoda z ARM.

Wydaje mi się (bo nie znając STM32 wiedzieć tego nie mogę), że wszystko ma swoją niszę i ciężko jest powiedzieć, że jedna rodzina jest obiektywnie, w każdym zastosowaniu, lepsza od drugiej (podobnie jest zresztą z wieloma innymi rzeczami, choćby odwieczną walką Linux vs Windows). Czy może akurat w tym przypadku się mylę? Czy AVRy uważasz za bezwarunkowo złe lub przestarzałe, a ich popularność za zrządzenie losu?

grzegorzn
-
Posty: 18
Rejestracja: 14 cze 2016, 17:31
Lokalizacja: Warszawa
Kontakt:

Re: Może czas zmienić nazwe forum?

Post autor: grzegorzn » 06 kwie 2022, 23:15

es2 pisze: ↑
06 kwie 2022, 16:57
Błędy a może raczej niedociągnięcia bo wszystko jest opisane w dokumentacji kompilatora a jak wnioskuję praktycznie nikt jej nie czyta.
Ułomności AVR-GCC opisywałem w EP i tam odsyłam po szczegóły. Tak z największych błędów/niedociągnięć, które pamiętam:
- Odkładanie na stos R0 i R1 mimo, że nie są używane.
- Operacja "<<" tylko na 16 bitach.
- Wymagane rzutowanie w sytuacjach, gdzie inne kompilatory tego nie wymajają.
Czyli mało istotne drobiazgi. Jeśli ma być wybrany STM32 zamiast AVR, to na pewno nie przez te niedoróbki GCC.

es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 07 kwie 2022, 15:50

Circuit Chaos pisze: ↑
06 kwie 2022, 19:34
es2 pisze: ↑
06 kwie 2022, 17:47
Co do R0, nie zawsze SREG trzeba zachowywać!
Zgoda – o ile nie ma instrukcji, które modyfikują SREG. Ten kod powinien być generowany tylko jeśli takie są, a nie zawsze.
es2 pisze: ↑
06 kwie 2022, 17:47
Ponadto, czemu nie robi tego R1?
Też racja. Mogliby użyć R1 a potem wyzerować, byłby jeden push mniej.
es2 pisze: ↑
06 kwie 2022, 17:47
Co do R1, nie znasz kompilatora! W R1 jest przechowywana wartość ZERO. Nie wiem czemu tak głupio wybrano rejestr dla ZERO. Czy nie mógł być R2? Zapytasz, co za różnica, R1 czy R2? Otóż bardzo duża. Rejestru z wartością ZERO kompilator "nie tyka" ale R1 używa operacja mnożenia albo dzielenia (sprawdź).
Chodziło mi o to, po co zerować rejestr, który nie jest używany.
Rozwinę temat R0 i SREG w IRQ.
Obejrzyj procedury IRQ o różnym stopniu skomplikowania. Większość będzie używała rejestrów różnych od R0 i R1 (R2..R4, R17, R18 itp). Po co więc do zachowania SREG używać R0 zamiast jakiegoś innego rejestru?
W artykułach pokazywałem moje modyfikacje prologu i epilogu IRQ przy okazji obsługi WS2812 na przerwaniach w AVR. Da się? Da! Trzeba tylko" myśleć. Niestety, twórcy AVR-GCC mają z tym problem.
Wybór R1 na ZERO to totalna głupota! Czy nie można było użyć R16 lub innego z tej grupy? R0-R15 są bardziej uniwersalne od R16-R31 (trochę inaczej jest w bardzo małych AtTiny, które mają tylko 16 rejestrów). Poświęcono uniwersalny rejestr zamiast mniej przydatny. Jak już koniecznie chcieli poświęcić rejestr uniwersalny, to dlaczego ne robili tego "od góry" jak każda poważna firma? Zobacz jak w MC68k, ARM itp są "zabierane" rejestry. Zawsze od ostatniego. Podobnie jak stos, jest na końcu pamięci a nie na początku. Pominę chory pomysł Intela, stosu od dołu w 8051 (w 8048 pewnie też). Intelem nie należy się przejmować to specjaliści od złego (reset poziomem wysokim, segmentowanie pamięci).

es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 07 kwie 2022, 15:59

Circuit Chaos pisze: ↑
06 kwie 2022, 19:34
Wydaje mi się (bo nie znając STM32 wiedzieć tego nie mogę), że wszystko ma swoją niszę i ciężko jest powiedzieć, że jedna rodzina jest obiektywnie, w każdym zastosowaniu, lepsza od drugiej (podobnie jest zresztą z wieloma innymi rzeczami, choćby odwieczną walką Linux vs Windows). Czy może akurat w tym przypadku się mylę? Czy AVRy uważasz za bezwarunkowo złe lub przestarzałe, a ich popularność za zrządzenie losu?
Zgodzę się, że na 100 projektów znajdę kilka, gdzie AVR sprawdzi się lepiej od ARM ale pytanie, jak będzie skala produkcji? Czy opłaca się inwestować w sprzęt, naukę, dłuższe pisanie softu?

Równo 20 lat temu, będąc na rozmowie rekrutacyjnej, zapytałem, dlaczego w roli dekodera adresowego nie używają GAL'i. Byłoby taniej, lepiej, nowoczesnej. Odpowiedź "Musiałbym posadzić człowieka, który by programował gale i wkładał w podstawki.".

Ja patrzę przez pryzmat profesjonalisty projektującego urządzenia produkowane w dużych ilościach i nawet robiąc projekty dla siebie czy małych serii nie stosuję rozwiązań "partyzanckich".

es2
Użytkownik
Posty: 186
Rejestracja: 13 mar 2018, 9:47

Re: Może czas zmienić nazwe forum?

Post autor: es2 » 07 kwie 2022, 16:04

Circuit Chaos pisze: ↑
06 kwie 2022, 19:34
(...)już znałem AVR na tyle, że do niczego go nie potrzebowałem (przerzuciłem się na AVR w 2006 r., wcześniej używałem MCU w rdzeniem '51 i pisałem na nie w assemblerze).
Podobnie jak ja, tyle, ze AVR-ami zająłem się później. Wynikało to z tego, że trzeba było utrzymywać projekty na 8051. Najczęściej używałem 89C2051 (nawet emulator zbudowałem) oczywiście 89C5x, 89S8252 ale najbardziej podobał mi się P89C51RD2 Philipsa (wtedy jeszcze Philipsa). To był (wtedy) chyba JEDYNY, który mógł programować sam siebie. Późnej Atmel zrobił podobny jak już Philips był NXP.

ODPOWIEDZ