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