volatile

Moderator: tilz0R

volatile

OdgovorNapisal/-a Kroko » 16 Mar 2018, 09:40

Ker mnogi ne vedo, zakaj se uporablja volatile, je tole tipičen primer, kjer je nujno, da je spremenljivka deklarirana kot volatile.

Koda: Izberi vse
volatile bool DMA_Completed;

Koda: Izberi vse
...
DMA_Completed = false;
LL_DMA_EnableStream(...); //start DMA transfer
while (!DMA_Completed)
{
  //wait for DMA to complete         
}
...

Koda: Izberi vse
void DMAx_Streamn_IRQHandler(void)
{
  ...
  DMA_Completed = true;
  ...
}
http://www.planet-cnc.com Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 6153
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 770 krat
Prejel zahvalo: 2445 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: volatile

OdgovorNapisal/-a tilz0R » 16 Mar 2018, 10:26

Zelo lep primer. Da še objasnim zakaj je tako.

Koda: Izberi vse
DMA_Completed = false; //Spremljivka je nastavljena na false
LL_DMA_EnableStream(...); //start DMA transfer

//V tej točki prevajalnik vidi, da je spremenljivka predhodno nastavljena na false, in si misli "ah sej to ni potrebno delati", ter celoten izraz vrže ven iz kode.
//TO je seveda narobe, saj se DMA_Completed postavi na true v interrupt handlerju
//Če dodamo volatile, compiler NEBO sklepal nič po svoje in bo ob vsakem branju spremenljivke dejansko pogledal vrednost v RAM-u in ne le v delovnih registrih (someking cache je disablan).
while (!DMA_Completed)
{
  //wait for DMA to complete         
}


Ker pa je danes ogromno embedded programov napisanih v RTOS-u, je spodaj primer, kako to narediti tam.

Koda: Izberi vse
//Kreiraj nov semafor z enim tokenom.
osSemaptoreId sync_sem = osSemaphoreCreate(..., 1);
osSemaphoreWait(sync_sem, 0); //Zakleni semafor takoj (gre skozi, ker imamo en token na voljo)
LL_DMA_Start...(start transfer)...
osSemaphoreWait(sync_sem, timeout); //Čakaj na semafor ponovno. Sedaj bomo čakali dokler ga nekdo ne odklene.

//DMA je končal v tej točki...
//Izbriši semafor
osSemaphoreDelete(sync_sem);


Koda: Izberi vse
PPP_IRQ_Handler(void) {
    osSemaphoreRelease(sync_sem); //Odkleni semafor
}


Zakaj semafor? Semafor je OS element, ki je sposoben postaviti thread v "blocked" stanje ter omogočiti izvajanje drugih thread-ov. Torej medtem ko čakamo, da DMA konča, lahko delamo nekaj tretjega v drugem threadu. Ko DMA konča, skočimo na izvajanje nazaj. Seveda se je potrebno vprašati, koliko podatkov pošiljamo preko DMA in ali ima smisel to delati ali le počakati v while zanki (ponavadi ima smiselno semafor).
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 2403
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 264 krat
Prejel zahvalo: 767 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: volatile

OdgovorNapisal/-a jmivsek » 16 Mar 2018, 10:32

Morda bi pomagala še obrazložitev, zakaj ravno izraz 'volatile'.
Vem, da nič ne vem (Sokrat)
Uporabniški avatar
jmivsek
 
Prispevkov: 1328
Pridružen: 18 Jan 2015, 01:20
Kraj: Ajdovščina
Zahvalil se je: 1875 krat
Prejel zahvalo: 480 krat
Uporabnika povabil: S52O
Število neizkoriščenih povabil: 88

Re: volatile

OdgovorNapisal/-a S53DZ » 16 Mar 2018, 10:32

Uporabniški avatar
S53DZ
 
Prispevkov: 1407
Pridružen: 18 Jan 2015, 10:58
Kraj: Ljubljana
Zahvalil se je: 274 krat
Prejel zahvalo: 468 krat
Uporabnika povabil: S52O
Število neizkoriščenih povabil: 49

Re: volatile

OdgovorNapisal/-a jmivsek » 16 Mar 2018, 16:09

S53DZ je napisal/-a:Tukaj se mi zdi dobra razlaga:
https://barrgroup.com/Embedded-Systems/ ... le-Keyword

Ker je celotna knjiga v PDF formatu prosto dostopna, jo pripenjam kar tu:
Embedded C Coding Standard.Barr.2013.pdf
Nimate dovoljenj za ogled prilog tega prispevka.
Vem, da nič ne vem (Sokrat)
Uporabniški avatar
jmivsek
 
Prispevkov: 1328
Pridružen: 18 Jan 2015, 01:20
Kraj: Ajdovščina
Zahvalil se je: 1875 krat
Prejel zahvalo: 480 krat
Uporabnika povabil: S52O
Število neizkoriščenih povabil: 88


Vrni se na C in sorodni jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost