Prioritizace vláken v C

Michal Kovačič

Re:Časovač vláken v c++ pod Linuxem
« Odpověď #45 kdy: 25. 08. 2016, 10:24:09 »
Nezlobte se, ale tohle je nesmysl:

1. proměnné a jejich konstantní inicializaci vyhodit mimo smyčku while. Sice dnešní kompilátory tohle udělají automaticky, ale alespoň ukážete pochopení...

2. algoritmus vypíše jenom stav nejvyššího bitu, který dojde... Na to opravdu není potřeba cyklus for.

Asi bych doporučil poprosit někoho aby ten kód navrhl na základě "high level" požadavků. Asi to bude rychlejší...


Neviditelný

Re:Prioritizace vláken v C
« Odpověď #46 kdy: 25. 08. 2016, 10:24:32 »
1) Ptáme se už poněkolikáté, proč to potřebuješ číst ze samostatného vlákna?
2) Proč používáš nanosleep() i wait()? Ta funkce wait je vlastně odkud a co má dělat?
3) Ten tvůj maskovací for cyklus vrátí hodnotu stavu 1 pouze pokud bude nejvyšší bit pins 1, v ostatnéch případech bude stav vždy 0.

JSH

Re:Časovač vláken v c++ pod Linuxem
« Odpověď #47 kdy: 25. 08. 2016, 10:26:55 »
//v ramci vylouceni problemu s headerem od vyrobce jsem radeji deklaroval promenou takto
Huh????
Citace
Kód: [Vybrat]
for(int i = 0; i < 8; i++){ //vymaskovani jednotlivych bitu

  stav = (int)(pins & 1); //stav jednotlivych bitu po bitovem logickem soucinu

   pins >>= 1; //bitovy posun doprava

}
Ten kód vždycky jen přepíše stav dalším bitem, takže tam nakonec zůstane hodnota toho posledního. Nejsem si jistý, čeho se přesně snažíš dosáhnout, ale jsem si jistý, že tam máš chybu.

Jestli chceš zjistit, jestli je libovolný bit nenulový, tak stačí celé pins porovnat s nulou.

Mirek

Re:Časovač vláken v c++ pod Linuxem
« Odpověď #48 kdy: 25. 08. 2016, 10:42:00 »
Tak znova já,
a zase vlákno.
Potřebuju nějaký brainstorming ohledně vlákna, které čeká na událost a pak ještě využít timer v c++ pod linuxem, který mi bude časovat po zadaný čas.
A nechtěl bys to radši napsat ještě maďarsky? Takhle možná někoho geniálního může napadnout, na co se vlastně ptáš.

V podstatě mi jde o to, aby vlákno zareagovalo když se na vstupu jakéhokoli pinu objeví log 1(+5V) a timer mi změřil nějaký odchylky, maximální a minimální odchylku od vzorkovací frekvence)

No a co je na tom za problém? Opět myslím, že samostatné vlákno na tohle vůbec nepotřebuješ, ale to je vedlejší, protože ať to poběží v hlavním vlákně nebo někde jinde, logika bude stejná. Prostě s dostatečnou vzorkovací frekvencí čti ze vstupu data a dle potřeby zareaguj. Stačí ti na to if a nanosleep().

Tady posílám kód, zadefinoval do threadu - vymaskování bitů.
Přiznám se, že mne tam mate to vlákno, nicméně něčím vzorkovat musím, tak mne když tak naveďte pokud je to sémanticky blbě.

Můžeš stručně popsat jakou to má mít funkci? Co vlastně od toho kódu očekáváš? Jaké parametry (časování) má signál, který měříš?

Co podle tebe má dělat tento kus kódu?
Kód: [Vybrat]
for(int i = 0; i < 8; i++){ //vymaskovani jednotlivych bitu

  stav = (int)(pins & 1); //stav jednotlivych bitu po bitovem logickem soucinu

   pins >>= 1; //bitovy posun doprava

}

Jestli chceš jen zjistit jestli je kterýkoliv z dolních 8 bitů v 1, proč nepoužiješ toto:

Kód: [Vybrat]
  if ((pins & 0xFF) != 0) {
    cout >> stav;   // Ale co vlastně má v proměnné stav být? Nechceš spíš vypsat pins?
  }

Jen za podmínky že jasně popíšeš co má kód dělat, ti někdo dokáže poradit.

Mirek

Re:Časovač vláken v c++ pod Linuxem
« Odpověď #49 kdy: 29. 08. 2016, 15:47:10 »

Tady posílám kód, zadefinoval do threadu - vymaskování bitů.
Přiznám se, že mne tam mate to vlákno, nicméně něčím vzorkovat musím, tak mne když tak naveďte pokud je to sémanticky blbě.

Už máš vyřešeno?