RE: Záhada v C -Vyřešeno a otázky

Pavel Hudecek edizon na seznam.cz
Neděle Leden 24 14:05:49 CET 2021


Díky.

Přesně takhle řeším atomicitu u čekání v tý funkci cekej() ze které byl ten kus co používá adSync. Tam se pracuje s proměnnou, kterou každou ms přičítá přerušení a čekací funkce podle toho čeká. Okolo jejího nulování a  testu se musí dát zákaz přerušení, jinak čekání občas čeká jinak dlouho. Což je celkem opruz, protože místo přímočarého
while(ms<n) cekani();
musí bejt while(1) { a uvnitř asm … if … break … asm…, takže se z 1 řádku stane 6.
Tak jsem si při zmínce o atomic napřed myslel, že tý ms můžu dát nějakej atribut atomic a bude po starostech, škoda.

U toho volatile pole byl záměr dotazu jednodušší, šlo jen o to, zda jsou jeho prvky volatile.
>  Všechny ukazatele ukazují na volatilní proměnnou typu uint8_t
Z toho usuzuji, že odpověď je ano. Občas někde právě píšou, že volatile je pak vlastně jenom pole, ale ne pole[n], což by bylo dost na ...

PH

Od: Miroslav Mraz
V textu

Dne 24. 01. 21 v 0:12 Pavel Hudecek napsal(a):
> Od začátku mi bylo jasný, že je to nějaká blbina vzniklá při nějakém 
> zmatkování:-)
> 
> Celá tahle část byla zkopírovaná z funkčního projektu, ale tady jsem se 
> navíc rozhod použít HW akumulaci hodnot ADC. Tak jsem typ dat v poli 
> změnil na uint32_t, aby se to tam vešlo. Jenže jsem ho změnil v extern 
> deklaraci v .h, ale ne v tý hlavní v .c. A to způsobilo všechny 
> následující problémy. Normálně při podobných rozdílech překladač 
> protestuje, není mi jasné, proč tentokrát neprotestoval.
> 
> A stejně by mě zajímalo, jak je to tedy s tím volatile, mějme:
> 
> volatile uint8_t prom1=0, prom2=0, prom3=0;
> 
> Budou volatile všechny 3, nebo jenom ta první?

Všechny.
> 
> volatile uint8_t pole[] = {0, 0, 0};
> 
> Bude volatile celý pole, nebo jen ukazatel na něj?

Celý pole. S ukazatelem je to složitější, můžete napsat
   volatile uint8_t * const ptr = pole, * volatile p1 = & prom1, * p2;
//ptr = & prom2; chyba - ukazatel je konstantní
   p1 = & prom2; // OK
   p2 = & prom3; // OK
Všechny ukazatele ukazují na volatilní proměnnou typu uint8_t ale ptr je 
sám o sobě konstantní, p1 volatilní a p2 nemodifikovaný. Odtud patrně 
pochází omyl, že modifikátor platí jen pro první položku. Syntaxe je to 
podivná, ale lze si na to zvyknout - prostě se to čte odzadu.

> 
> A jak je to s tou atomicitou v C?
> 
> PH

https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

U AVR to bude patrně implementováno zákazem přerušení, pokud vůbec. 
Atomický přístup potřebujete u proměnné sdílené mezi přerušením a hlavní 
smyčkou pokud do této zapisují _oba_. Pokud jeden zapisuje a druhý pouze 
čte, pak stačí volatile.
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20210124/73492b1b/attachment.html>


Další informace o konferenci Hw-list