Sida 2 av 4

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 09:18:03
av rvl
Kanske hinner nån anna svara medan jag skriver, men låt gå... Edit: som jag gissade hann nån anna före.

Grundiden är att ett volatile värde är flyktigt och måste läsas in från källan varje gång det ska användas, för det kan ha ändrat sig sen processorn senast läste det.
Läsning av värden som inte är volatile kan optimeras bort och till exempel lagras i tillfälliga register.

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 09:32:03
av BJ
Okej, så kompilatorn ser inte att en variabel ändras i ett avbrott?
Eller blir läst.

Re: Blandat Arduino-skoj

Postat: 18 augusti 2023, 09:42:55
av Shimonu
pi314: Varför inte bara räkna sekunder i ISR och hantera "klockan" utanför? ISR ska gärna vara så snabb som möjlig.

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 09:45:54
av sodjan
Nej, det brukar vara så. Du kan ju även ha koden för avbrottet i en annan källkodsfil som kompileras separat.
D.v.s. att då du kompilerar huvud koden så finns inte avbrotts koden alls...
Men exemplet med en I/O port kanske är mer självklar. Och de ska vara definierade som volatile i processorns "include" filer.

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 09:49:08
av BJ
Okej. Nu förstår jag. :) Tack.

Re: Blandat Arduino-skoj

Postat: 18 augusti 2023, 09:52:13
av sodjan
En variant är att stänga av all optimering i kompilatorn (vilket i princip är det som händer med volatile, fast mer selektivt per variabel) och själv se till att man hanterar variabler på "rätt" sätt.



Kan inte första delen av main() skrivas:

Kod: Markera allt

// ***** Main code, runs as infinite loop *****
//
// Do first time stuff.
// ...
void loop() {
...
...
D.v.s. att göra "first time stuff" innan loopen?

> ISR ska gärna vara så snabb som möjlig.

I allmänhet, ja. Nu är det nog inte speciellt kritiskt i just detta fall.
Och man kan ha hela logiken i en ISR, om det ändå inte finns något annan kod att "tävla med" om resurser.

Re: Blandat Arduino-skoj

Postat: 18 augusti 2023, 10:25:14
av rvl
> En variant är att stänga av all optimering i kompilatorn (vilket i princip är det som händer med volatile, fast mer selektivt per variabel) och själv se till att man hanterar variabler på "rätt" sätt.

Det är ju setup() till för, men kanske firsttime-grejerna pysslar nåt med lokala varibler i loopen?

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 10:41:34
av BJ
Okej.

Re: Blandat Arduino-skoj

Postat: 18 augusti 2023, 10:49:39
av sodjan
Hm. Var anropas setup()?
Borde det inte vara i stil med:

Kod: Markera allt

// ***** Main code, runs as infinite loop *****
//
// Do first time stuff.
setup()

void loop() {
...
...

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 10:52:30
av LeCanard
Det franska ordet ’volatile’ betyder ’flyktig’ på svenska. ( och används även för att beskriva skakiga börskurser )

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 10:58:09
av sodjan
Samma ordstam som den gamla slagdängan "Volare" från schlagerfestivalen 1958. :-)
https://sv.wikipedia.org/wiki/Volare_(s%C3%A5ng)
Den icke-vinnare som har blivit överlägset mest populär...

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 11:25:52
av Findecanor
rvl skrev: 18 augusti 2023, 09:18:03 Grundiden är att ett volatile värde är flyktigt och måste läsas in från källan varje gång det ska användas, för det kan ha ändrat sig sen processorn senast läste det.
Läsning av värden som inte är volatile kan optimeras bort och till exempel lagras i tillfälliga register.
Ja, även skrivningar kan optimeras bort om variabeln inte är volatile och värdet inte används.

En volatile-variabel måste ha en adress. Varje läsning är en läsning, och varje skrivning är en skrivning.

Jag har hört någonstans att "volatile" skulle ha kommit till för hårdvaruregisters skull. Det finns mycket hårdvara som sätter igång saker när man skriver till ett register, även om man skriver samma värde som tidigare, så därför skulle kompilatorn vara förbjuden att göra detta.

En sak "volatile" inte är, är att göra en läsningar och skrivningar till variabler i minnet atomiska. (Men det finns mycket kod där ute som felaktigt förutsätter det.)
Nyare C och C++ har specifikt stöd för atomiska operationer som man bör använda istället.

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 12:39:55
av BJ
Okej.

sodjan: Okej. :)

Re: Blandat Arduino-skoj

Postat: 18 augusti 2023, 13:47:29
av pfyra
Delar av koden göms av ide:t. Några includes och anropen till setup och loop t.ex.

Re: Vad är volatile, och när behöver man använda det?

Postat: 18 augusti 2023, 14:05:25
av Nerre
BJ skrev: 18 augusti 2023, 09:32:03 Okej, så kompilatorn ser inte att en variabel ändras i ett avbrott?
Eller blir läst.
Det är snarare så att om variabeln inte är volatile så förutsätter kompilatorn att den inte ändras. Om du då skriver ett värde till den och läser det senare så tycker kompilatorn att "det här är en onödig omväg, vi kan ta värdet direkt istället för att skriva det och sen läsa det".

Så en kod typ

Kod: Markera allt

variabel_a=8
(massa kod)
variabel_b=variabel_a
Optimerar kompilatorn till

Kod: Markera allt

variabel_b=8
Eftersom variabel_a inte ändrats sen det skrevs 8 till den.

(Fattar inte varför code-taggen gör variabel_b röd i andra exemplet...)