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