www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

ARM & RTOS

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
gprs
Neznanec
Neznanec



Pridružen-a: Pet 25 Sep 2009 23:57
Prispevkov: 8
Aktiv.: 0.04
Kraj: Celje

PrispevekObjavljeno: Čet Jan 30, 2014 3:23 pm    Naslov sporočila:  ARM & RTOS Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jan
Član
Član



Pridružen-a: Sob 10 Jun 2006 14:19
Prispevkov: 313
Aktiv.: 1.35
Kraj: Dolenjska

PrispevekObjavljeno: Čet Jan 30, 2014 4:40 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gprs
Neznanec
Neznanec



Pridružen-a: Pet 25 Sep 2009 23:57
Prispevkov: 8
Aktiv.: 0.04
Kraj: Celje

PrispevekObjavljeno: Čet Jan 30, 2014 6:14 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jan
Član
Član



Pridružen-a: Sob 10 Jun 2006 14:19
Prispevkov: 313
Aktiv.: 1.35
Kraj: Dolenjska

PrispevekObjavljeno: Čet Jan 30, 2014 10:14 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Aljosa
Član
Član



Pridružen-a: Pet 15 Sep 2006 11:43
Prispevkov: 149
Aktiv.: 0.65
Kraj: Trbovlje

PrispevekObjavljeno: Čet Jan 30, 2014 11:05 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jan
Član
Član



Pridružen-a: Sob 10 Jun 2006 14:19
Prispevkov: 313
Aktiv.: 1.35
Kraj: Dolenjska

PrispevekObjavljeno: Čet Jan 30, 2014 11:23 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Aljosa
Član
Član



Pridružen-a: Pet 15 Sep 2006 11:43
Prispevkov: 149
Aktiv.: 0.65
Kraj: Trbovlje

PrispevekObjavljeno: Pet Jan 31, 2014 9:14 am    Naslov sporočila:   Odgovori s citatom

Ko sem odgovor pisal sem imel v glavi, da je to kodo kolega gprs spisal. Prehitro sem tipkal pa prepočasi tuhtal. Very Happy Vem kaj si hotel povedati.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gprs
Neznanec
Neznanec



Pridružen-a: Pet 25 Sep 2009 23:57
Prispevkov: 8
Aktiv.: 0.04
Kraj: Celje

PrispevekObjavljeno: Pet Jan 31, 2014 9:40 am    Naslov sporočila:   Odgovori s citatom

Obema hvala za trud.

oj
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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