Re: Záhada v C -Vyřešeno a otázky
Miroslav Mraz
mrazik na volny.cz
Neděle Leden 24 11:10:11 CET 2021
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.
Mrazík
Další informace o konferenci Hw-list