 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
gprs Neznanec

Pridružen-a: Pet 25 Sep 2009 23:57 Prispevkov: 8 Aktiv.: 0.04 Kraj: Celje
|
Objavljeno: Čet Jan 30, 2014 3:23 pm Naslov sporočila: ARM & RTOS |
|
|
Igram se z aplikacijo (LPC2xxx) , v kateri bosta tekla 2 taska (task1, in task2). V tasku 1 bom spreminjal spremenljivko A v tasku2 pa jo bom samo bral.
Vprašanje:
Ali je potrebno uporabiti mehanizme za "lock-anje" spremenljivk (npr. mutex).
oj ... |
|
Nazaj na vrh |
|
 |
Jan Član


Pridružen-a: Sob 10 Jun 2006 14:19 Prispevkov: 313 Aktiv.: 1.35 Kraj: Dolenjska
|
Objavljeno: Čet Jan 30, 2014 4:40 pm Naslov sporočila: |
|
|
Imaš dve različni situaciji:
a) Spremenljivka je majhna, npr. 32-bitni integer. Čas pisanja je en strojni ukaz.
Torej ni možna situacija, da bi bila vrednost spremenljivke kadarkoli pokvarjena.
Branje iz drugega opravila lahko torej izvedeš kadarkoli.
b) Spremenljivka je večja, npr. nek string, struktura... Čas pisanja tukaj ni več samo en ukaz, ampak to traja dalj časa.
Pisanje v spremenljivko je lahko prekinjeno, tako da lahko branje pride na vrsto ravno takrat.
Prebral bi torej pol novega stringa, polovico pa še starega.
Jan |
|
Nazaj na vrh |
|
 |
gprs Neznanec

Pridružen-a: Pet 25 Sep 2009 23:57 Prispevkov: 8 Aktiv.: 0.04 Kraj: Celje
|
Objavljeno: Čet Jan 30, 2014 6:14 pm Naslov sporočila: |
|
|
Hvala Jan.
To mi je razumljivo, da lahko sredi (npr. kakšne strukture) pride do prekinitve izvajanja in vlogo prevzame drugi task, ki spremeni spremelnjivko.
Mene bolj zanima, če lahko pride crash-a programa - abort handler ...
oj |
|
Nazaj na vrh |
|
 |
Jan Član


Pridružen-a: Sob 10 Jun 2006 14:19 Prispevkov: 313 Aktiv.: 1.35 Kraj: Dolenjska
|
Objavljeno: Čet Jan 30, 2014 10:14 pm Naslov sporočila: |
|
|
Mislim, da kerneli od takih malih RTOS-ov nimajo kakšne take detekcije (kateri RTOS pa drugače uporabljaš?).
Lahko pa poskusiš narediti en test.
Koda: |
void taskPisanje(void)
{
strcpy(globalString, "00000000000000000000000");
strcpy(globalString, "11111111111111111111111");
}
void taskBranje(void)
{
char prviZnak = globalString[0];
for (int i = 0; i < strlen(globalString); i++)
{
if (globalString[i] != prviZnak)
{
printf("Napaka: %s\r", globalString);
}
}
SleepMs(10);
} |
taskPisanje naj ima nižjo prioriteto kot taskBranje.
V nekem trenutku, ko bo taskBranje prišel na vrsto po urniku, bo prekinil taskPisanje.
Enkrat se bo že zgodilo, da bo to ravno med strcpym, takrat pa boš dobil izpisano pokvarjeno spremenljivko.
Jan |
|
Nazaj na vrh |
|
 |
Aljosa Član


Pridružen-a: Pet 15 Sep 2006 11:43 Prispevkov: 149 Aktiv.: 0.65 Kraj: Trbovlje
|
Objavljeno: Čet Jan 30, 2014 11:05 pm Naslov sporočila: |
|
|
Kjerkoli se uporabljajo threadi, ki spreminjajo (berejo ali pišejo) vsebino na istem naslovu v izogib "pokvarjeni" vsebini priporočam, da se uporablja zaklepanje z lock mehanizmi npr. mutexi ali semaforji (pač odvisno če se uporabljajo hkrati tudi interrupti).
Glede na to da imaš v tvoji kodi dva threada, ki si delita globalString bi bilo nujno da ščitiš vsebino z mutexi.
Ne glede na to da v enem pišeš v drugem pa samo bereš. Edino tako bo neka spremenljivka/struktura thread safe. |
|
Nazaj na vrh |
|
 |
Jan Član


Pridružen-a: Sob 10 Jun 2006 14:19 Prispevkov: 313 Aktiv.: 1.35 Kraj: Dolenjska
|
Objavljeno: Čet Jan 30, 2014 11:23 pm Naslov sporočila: |
|
|
Aljoša, saj namen te kode je ravno to, da pokaže kako bo prišlo do hkratnega dostopa in napake pri branju.
Seveda moraš to potem nekako rešiti - npr. z mutexi.
Jan |
|
Nazaj na vrh |
|
 |
Aljosa Član


Pridružen-a: Pet 15 Sep 2006 11:43 Prispevkov: 149 Aktiv.: 0.65 Kraj: Trbovlje
|
Objavljeno: Pet Jan 31, 2014 9:14 am Naslov sporočila: |
|
|
Ko sem odgovor pisal sem imel v glavi, da je to kodo kolega gprs spisal. Prehitro sem tipkal pa prepočasi tuhtal. Vem kaj si hotel povedati. |
|
Nazaj na vrh |
|
 |
gprs Neznanec

Pridružen-a: Pet 25 Sep 2009 23:57 Prispevkov: 8 Aktiv.: 0.04 Kraj: Celje
|
Objavljeno: Pet Jan 31, 2014 9:40 am Naslov sporočila: |
|
|
Obema hvala za trud.
oj |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|