delay ale aby program bežal dalej

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: delay ale aby program bežal dalej

Príspevok od používateľa jirka.jirka. » 24 Nov 2017, 07:09

peterple napísal:Oba predrečníci sú trochu mimo so svojimi odpoveďami.
Čo je to atomickosť prístupu nevedia ani mnohí "machri" čo programujú PHP, Javascript, dokonca aj JAVA. V tých jazykoch je to tiež zvyčajne skryté, takže to netreba riešiť, len za určitých okolností. Kde je zase vidno kto tomu ako rozumie. Ale v C (akože Wiring) je to jedna z nášlapných mín na ktorú začiatočník ľahko nabehne. Preto je používanie millis() lepšie ako sa snažiť o prácu s prerušeniami ak tomu programátor nerozumie.
Čo je to atomickosť prístup??? Víc info. Ať hledám jak hledám, nic jsem nenašel. pošli nějaký odkaz. Ať se o tom dozvím. Díkes
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 989
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: delay ale aby program bežal dalej

Príspevok od používateľa budvar10 » 24 Nov 2017, 09:51

"Atomickosť" je nedeliteľnosť. V prípade C++ sa jedná o sekvenciu príkazov, ktorá musí za každých podmienok zbehnúť neprerušovane vo vopred danej postupnosti. Toto je problematika systémov s paralelným spracovaním ale aj systémov s prerušeniami.
Zmysel je v tom, aby sa predišlo nepredvídanému/nedefinovanému správaniu programu.
Napr. pracujem s nejakou premennou, ktorú je možné meniť prerušením alebo paralelným vláknom. Je nežiadúce, aby sa mi hodnota premennej zmenila "pod rukami". Preto musím zakázať prístup k týmto dátam po dobu, kým neukončím sekvenciu príkazov.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: delay ale aby program bežal dalej

Príspevok od používateľa jirka.jirka. » 24 Nov 2017, 11:28

Takže jako u operačních systémů, ošetření kritické sekce?
0

Používateľov profilový obrázok
roboulbricht
Stály člen
Stály člen
Príspevky: 156
Dátum registrácie: 07 Jan 2015, 12:01
Bydlisko: Banská Bystrica
Vek: 54
Kontaktovať používateľa:

Re: delay ale aby program bežal dalej

Príspevok od používateľa roboulbricht » 24 Nov 2017, 11:56

Peter mal na mysli toto. Je tam cli();, čo zabráni prerušeniu, prečíta si aktuálnu hodnotu a potom zase povolí prerušenia. Preto sa ti nestane, že prečítaš pol hodnoty pred prerušením a pol po ňom. Je to podobné, ako si mal na mysli s kritickou sekciou.

Kód: Vybrať všetko

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;
} 
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: delay ale aby program bežal dalej

Príspevok od používateľa jirka.jirka. » 24 Nov 2017, 12:04

No ale problém by mohl být s tím, u cli() zakážeš všechno přerušení....

Možná by bylo lepší zakázat pouze to, které upravuje danou proměnnou. Ale u arduino do toho moc nevidím.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: delay ale aby program bežal dalej

Príspevok od používateľa peterple » 25 Nov 2017, 17:44

áno, presne toto som mal na mysli. Urobiť sa to dá všelijako. Toto koštuje iba tri strojové inštrukcie. Teda je to veľmi jednoduché. Platí sa za to predĺžením latencie prerušení o 8 strojových inštrukcií čo trvá ten presun long int z jednej premennej do druhej.
Dalo by sa zakazovať iba to prerušenie z časovača ale bolo by to na viac inštrukcií. Alebo by sa to dalo aj bez zakazovania prerušenia.
Možností je ako vždy viacero. Toto je taká klasika čo som tiež prevzal z nejakého atmel app note. Má to výhodu že to obnovuje do pôvodne nastaveného stavu. Čo je lepšie ako cli() a potom sti().
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok