[ boogi @ 21.11.2019. 20:40 ] @
Pozdrav...
Situacija:
Arduino uno... Prima podatke u bafer preko serijskog porta... Primi ih recimo 20 bajtova.... Po zavrsetku prijema svih 20 bajtova pocinje da ih cita i smjesta ih u niz...
Nesto tipa petlje koja radi:
a=1 do 20,
x=serial.read(),
niz[a] = x...

Koliko vremena (cca) mu treba da ih procita i smjesti u niz?

Tj... Kako procitah negdje na nekom forumu, pri 9600bps, prijem u bafer traje cca 1mS za jedan bajt (ispravite ako grijesim)... Znaci 20 bajtova cca 20mS...jel taj omjer i za citanje iz bafera il to ide mnogo brze...
[ ZAS011 @ 22.11.2019. 23:25 ] @
Pre for petlje staviš OldMilliseconds = milis() a kada iščitaš bafer ispišeš milis()-OldMilis.
[ mikikg @ 24.11.2019. 12:27 ] @
Vreme potrebno da se procita podatak sa seriske linije je iskljucivo vezan za brzinu prenosa, 9600 BAUD znaci da se salje brzinom 9600 bitova u sekundi ili oko 960 bajtova u sekundi (racuna se okvirno 10 bitova po karakteru jer ima start i stop bit po protokolu) sto ispada oko 1ms po karakteru.

Dakle citanje je relativno "sporo" i tu ne moze mnogo da se promeni situacija.

Dodeljivanje iscitanog podatka nekoj drugoj variabli je "brzo", to se desava u okvirima oko ili manje od 1us (mikro sekunde).

BTW: Dignes brzinu na 115200 BAUD i sve proradi doosta brze ;)
[ mikikg @ 24.11.2019. 13:17 ] @
Uzgred serial.read() funkcija kod Arduino je BLOCKING tipa sto u prevodu znaci da ce funkcija cekati dok se ne iscita sve sto je stiglo na liniju (u interni buffer funkcije, cekajuci dok ne stigne CR\LF ili NULL karakter) i ne moze da se predje na sledecu funkciju dok se ta operacija ne zavrsi, dakle BLOKIRA se dalji rad dok ne iscita.

Kod malih brzina prenosa je to ogroman problem jer se ceo program blokira za to vreme a mogao je hiljade nekih drugih instrukijza da uradi dok ceka podatak!

Iz tih razloga postoji NON-BLOCKING pristup gde se to radi malo drugacije preko DMA i Interupt rutina.
Podatak se iscitava karakter po karakter preko interupta, upisuje preko DMA u rezervisani buffer i ceka se statusni flag za IDLE od USART-a koji znaci prakticno kraj prenosa paketa podataka i naj taj nacin mogu da se primaju paketi razlicite duzine i sto je najbitnije mogu da sadrze NULL (0x00) karakter u sebi, dakle binarni prenos podataka.
Interapt (ISR) rutina radi jedan po jedan karakter i ta operacija je veoma brza tako da ne blokira ostatak programa i na kraju setuje neki flag u programu "stigao_paket" i program odradi sta treba, ima duzinu + binardni sadrzaj u bufferu i to je to!

Sa ovim pristupom citanja, glavna petlja moze da se ubrza nekoliko hiljada puta, radi kao da ga "nema", "u pozadini", minimalno resursa oduzima.

[Ovu poruku je menjao mikikg dana 24.11.2019. u 14:40 GMT+1]
[ ZAS011 @ 24.11.2019. 14:25 ] @
Miki, ima li Atmega328 DMA?
Nešto nisam siguran.
[ mikikg @ 24.11.2019. 15:01 ] @
Hehe, niko nije naveo koji je MCU u pitanju, samo je receno Arduino, i Atmel/MCP SAM3 moze da ide pod Arduino, isto kao sto moze i STM32 i jos gomila drugih koji imaju DMA ... ;)

Atmega328 ko to jos koristi pored zivih ARM-ova :)
[ bogdan.kecman @ 24.11.2019. 18:00 ] @
328 jeste patetican ali ako se dobro secam i on ima dma
[ boogi @ 24.11.2019. 18:05 ] @
Hvala!

ZAS011 nesto tako sam napisao i dosao do nekih meni korisnih podataka...


mikikg...prva poruka mi jasna...druga nije bas skroz pa bi molio pojasnjenje...

Citat:
Uzgred serial.read() funkcija kod Arduino je BLOCKING tipa sto u prevodu znaci da ce funkcija cekati dok se ne iscita sve sto je stiglo na liniju (u interni buffer funkcije, cekajuci dok ne stigne CR\LF ili NULL karakter) i ne moze da se predje na sledecu funkciju dok se ta operacija ne zavrsi, dakle BLOKIRA se dalji rad dok ne iscita.


Znaci...imam recimo situaciju gdje sa racunara saljem arduinu kroz serijski port niz podataka(iz IDE monitora)....recimo 0123456789...neka brzina bude 9600bps... racunar ustvari salje ASCII kodove za taj niz 48 49 50 51 52 53 54 55 56 57 ...da pretpostavimo da na kraju nema line feed tj 10...za ovih 10 bajtova treba cca 10ms da stignu u bafer....

nakon stizanja svih podataka sa Serial.read() se moze iscitati svih 10 bajova i dodjeliti ih nekoj promjenjivoj...

Sta znaci BLOCKING tip?
Jel to znaci da ako sam pokusao citati podatke iz bafera prije nego li su svi stigli da bi Serial,read cekao dok stigne zadnji tj 57 ili
ako sam recimo poceo citati a u toku je bilo stizanje podatka npr 52 da bi on cekao dok se ne zavrsi prijem 52 i onda iscitao 48 49 50 51 52 ?
ili nesto trece....
Ako sam dobro formulisao pitanje :)

Adruino Uno BTW je...

Hvala jos jednom...
[ ZAS011 @ 24.11.2019. 19:46 ] @
Citat:
mikikg:
Hehe, niko nije naveo koji je MCU u pitanju, samo je receno Arduino, i Atmel/MCP SAM3 moze da ide pod Arduino, isto kao sto moze i STM32 i jos gomila drugih koji imaju DMA ...

Atmega328 ko to jos koristi pored zivih ARM-ova


Citat:

Situacija:
Arduino uno... Prima podatke u bafer preko serijskog porta... Primi ih recimo 20 bajtova.... Po zavrsetku prijema svih 20 bajtova pocinje da ih cita i smjesta ih u niz...


Prebrzo čitaš
[ Zlatni_bg @ 24.11.2019. 23:27 ] @
Blocking tip ti je ukratko prevedeno - dok se proces ne zavrsi, novi ne zapocinje. To ti je kako su nekad racunari funkcionisali, bez multitaskinga. Znaci kao da si lupio komandu "delay" i cekas da ona prodje.

Ne bi mogao da iscitas nista dok se kompletno ne iscitaju podaci koji stizu, sledeca proceduralna komanda bi cekala.

Necu ti puno pomoci, ali neke kljucne reci na koje bi valjalo da obratis paznju: software spi; spi dma; naravno sve vezano za Arduino. Mislim da na taj nacin mozes mnogo mnogo vise podataka brze da iscitas nego preko serial.read.

p.s. 328 jeste po danasnjim standardima los, i iskreno mislim da direktna zamena u 2019. godini postaje esp32 "SoC" ako mogu tako da ga nazovem. Ali daleko od toga da je 328 neupotrebljiv u nekim realnim aplikacijama, samo mislim da je od skoro postalo bacanje para na bilo sta sto nije arduino nano (kineski ofc) u poredjenju sa esp32 plocicama. Sve vise i vise mi je neophodno da 328ici dodam nesto sto esp32 vec ima, ili plocice imaju. Prvi put kad je trebalo da napravim sa arduinom nesto sto je islo na daljinski je ukljucivalo 2 328ice i 433mhz transmiter + risiver. Pre par godina super opcija, danas posle IoT-a, wifija, bta, nikako. 328 mi ostaje sasvim solidna stvar za neke autonomne stvari koje su danas sve redje i redje.

http://ww1.microchip.com/downl...llers-ATmega328P_Datasheet.pdf

Evo kompletnog DSa za UNO na 300 strana. Obrati paznju na sekciju 19, i 19.9.



[Ovu poruku je menjao Zlatni_bg dana 25.11.2019. u 00:38 GMT+1]
[ mikikg @ 25.11.2019. 10:37 ] @
Citat:
bogdan.kecman:
328 jeste patetican ali ako se dobro secam i on ima dma


Ta mukica nema DMA, u to vreme je DMA bio ekskluzivna funkcionalnost, seti se 8080, uz njega je isao 8257 poseban DMA kontroler IC, ni originalno 8051/52 jezgro nije imalo DMA, tek dosta kasnije su se u nekim jezgrima pojavile "skromne" varijenate DMA kontolera, kao npr ovaj:
https://www.onsemi.com/pub/Collateral/AX8052F143-D.PDF

ATmega328A i drugari iz te serije zvanicno nemaju DMA
https://ww1.microchip.com/down...8A-PA-328-P-DS-DS40002061A.pdf
[ Branimir Maksimovic @ 25.11.2019. 12:03 ] @
Ne mora da se smara interaptima dovoljno je da podigne jedan thread koji ce da cita. Naravno to ako je multitasking OS na njemu.
[ mikikg @ 25.11.2019. 15:45 ] @
Na 8bitnim kontrolerima se najcesce radi preko interapta, nema "OS", ima samo gomila dogadjaja koji trebaju da se "hendluju" najcesce samo preko jedne ISR rutine, nema interupt vektor tablice i odatle poticu svi limiti tog jezgra.
Kod ARM ima lepo tablica vektora (adresa) koja pocinje od nula koja je RESET, pa ide redom, interap od-ovoga, onoga, tajmer, spi, uart, i to pokriva sav implementirani hardver, 32bit adresa, posebno mapirano u adresnom prostoru, imaju i bitovi posebno mapirani na svojim adresama, toooo je nesto drugo ....
STM32 ima NVC (Nested Vector Controler) koji to radi raspodelu IRQ-ova i prioriteta, potpuno je predvidljiv, zna se koliko sta "kosta" u clock-ovima i to je da kazemo softwersko-hardwerski multritreding na jednom core-u.
[ Branimir Maksimovic @ 25.11.2019. 15:51 ] @
Ovo je taj 8bitni? tough luck.
[ mikikg @ 25.11.2019. 16:35 ] @
Steta sto se nisu setili da naprave duplo ili 4x 8bitno jezgro na 100MHz, sta bi mu falilo, to bi radilo sjajno, u 16-20nm tehnologiji, hehe u FPGA da se smesti ... :)

Ubedjen sam da to negde-neko sigurno koristi, samo ne znam zasta :)

Ili QuadCore Z80 na 100MHz, ma idi, to je zlo, ja znam sta je jedan na 4MHz mogao sve da uradi ...
[ Branimir Maksimovic @ 25.11.2019. 17:17 ] @
"ja znam sta je jedan na 4MHz mogao sve da uradi ..."

:)
Da ispisuje po ekranu dok se program ucitava sa kasete :P
[ mikikg @ 25.11.2019. 20:24 ] @
Citat:
Branimir Maksimovic: "ja znam sta je jedan na 4MHz mogao sve da uradi ..."

:)
Da ispisuje po ekranu dok se program ucitava sa kasete :P


Veruj mi da sam se setio PICK & POKE na Spectrumu, i rekoh zebi sto je to dobra fora bila tada, sto ne i sad, i napravim PICK & POKE za STM32 sa 32bitnim adresama, radi, ceo memooriski prostor mogu da citam i pisem ... Preko seriskog terminala unosim adresu i podatak i teraj, ako znas gde i sta treba da sa se upise ti ga upisi direktno u kontroler, isto kao sto je radilo na ZX Spectrum :)
[ Zlatni_bg @ 25.11.2019. 22:14 ] @
Ma ljudi, pogledajte za softverski SPI, to resava problem. Datasheet.
[ flighter_022 @ 25.11.2019. 23:50 ] @
Citat:
mikikg:
Veruj mi da sam se setio PICK & POKE na Spectrumu




PEEK & POKE :)

Omatorilo se, hehehe.
[ mikikg @ 26.11.2019. 00:12 ] @
jao jeste, PEEK i POKE ... mnogo davno bilo ...
[ mikikg @ 26.11.2019. 00:29 ] @
Citat:
flighter_022:
Citat:
mikikg:
Veruj mi da sam se setio PICK & POKE na Spectrumu




PEEK & POKE :)

Omatorilo se, hehehe.



Citat:
In computing, PEEK and POKE are commands used in some high-level programming languages for accessing the contents of a specific memory cell referenced by its memory address.[1][2] These commands are particularly associated with the BASIC programming language, though some other languages such as Pascal and COMAL, have these commands as well. These commands are comparable in their roles to pointers in the C language and some other programming languages.

The PEEK and POKE commands were conceived in early personal computing systems to serve a variety of purposes, especially for modifying special memory-mapped hardware registers to control particular functions of the computer such as the input/output peripherals. Alternatively programmers might use these commands to copy software or even to circumvent the intent of a particular piece of software (e.g. manipulate a game program to allow the user to cheat). Today it is unusual to control computer memory at such a low level using a high-level language like BASIC. As such the notions of PEEK and POKE commands are generally seen as antiquated.


Hehe, pa i nisu "antiquated", sad su "re-born" :)
[ korak @ 04.12.2019. 18:08 ] @
Citat:
mikikg:
Hehe, niko nije naveo koji je MCU u pitanju, samo je receno Arduino, i Atmel/MCP SAM3 moze da ide pod Arduino, isto kao sto moze i STM32 i jos gomila drugih koji imaju DMA ... ;)

Atmega328 ko to jos koristi pored zivih ARM-ova :)


Nije neophodno da postoji DMA.

Kada se pokrene interrupt na događaj: primljen karakter, servisna rutina pročita karakter i smesti u kružni bafer preko pointera namenjenog SCI-a modulu. Drugim pointerom se čita kružni bafer i pomera napred. Kružni bafer je prazan ako oba pointera imaju istu vrednost.

U glavnoj petlji se proveri da li je k. bafer prazan, i ako nije čita se sve dok ne postane prazan. Pročitani karakteri se smeštaju u neki niz i služe za dalju analizu u programu.