Blandat Arduino-skoj

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
rvl
Inlägg: 5817
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

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

Inlägg 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.
BJ
Inlägg: 8303
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

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

Inlägg av BJ »

Okej, så kompilatorn ser inte att en variabel ändras i ett avbrott?
Eller blir läst.
Shimonu
Inlägg: 295
Blev medlem: 21 oktober 2015, 22:44:33

Re: Blandat Arduino-skoj

Inlägg 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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg 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.
BJ
Inlägg: 8303
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

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

Inlägg av BJ »

Okej. Nu förstår jag. :) Tack.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Blandat Arduino-skoj

Inlägg 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.
Användarvisningsbild
rvl
Inlägg: 5817
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Blandat Arduino-skoj

Inlägg 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?
BJ
Inlägg: 8303
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

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

Inlägg av BJ »

Okej.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Blandat Arduino-skoj

Inlägg 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() {
...
...
Användarvisningsbild
LeCanard
Inlägg: 2163
Blev medlem: 29 april 2009, 10:18:25
Ort: Perpignan

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

Inlägg av LeCanard »

Det franska ordet ’volatile’ betyder ’flyktig’ på svenska. ( och används även för att beskriva skakiga börskurser )
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43178
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg 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...
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

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

Inlägg 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.
BJ
Inlägg: 8303
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

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

Inlägg av BJ »

Okej.

sodjan: Okej. :)
pfyra
Inlägg: 348
Blev medlem: 8 mars 2015, 14:14:44
Ort: utanför Karlstad

Re: Blandat Arduino-skoj

Inlägg av pfyra »

Delar av koden göms av ide:t. Några includes och anropen till setup och loop t.ex.
Nerre
Inlägg: 26717
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

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

Inlägg 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...)
Skriv svar