Huipputarkka ajastin?

Pitäisi tehdä ohjelma joka ajaa koodinpätkän 100 mikrosekunnin välein eikä saa missata kertaakaan. Mahdollista winkkarilla?
141034
Äänestä

Muut lukivat myös

Vastaukset 14

Vanhimmat

visual basic 2010 - timer objektilla hoituu

Äänestä
  • Tehokkaimmillaankin Visual Basic kurat taitavat kyetä vain yhteen millisekuntiin. Sama tosin koskee muitakin ohjelmointikieliä, alustoista puhumattakaan. Keksin jo tavan hyödyntää koodia, jos sellainen olisi mahdollista luoda.

    Äänestä

NT-käyttiksissä (XP, Vista, Seiska...) säikeiden ajanvarausmekanismin vuoksi, Windows CE:ssä onnistuisi.

Äänestä

Eikös Toosassa ajovuorot ole millisekunnin luokkaa? Asettamalla säikeelle korkeimman prioriteetin reaaliaikaisuus tietysti paranee, mutta loppuviimeksi ajurit voivat senkin blokata.

Äänestä

Ei ole! Windows tahmaa ja nykii, tuosta ei tule mitään, vaan 100% kuormitus ja iso windows paska!

Äänestä
  • Sinun pääsi on paska.

    Äänestä

Taitaisi vaatia reaaliaikajärjestelmän onnistuakseen - mikään työpöytä-käyttöön tehty ei taida kelvata. Timer-keskeytykset on yleensäkin HW-keskeytyksiä, mutta eivät kuitenkaan maksimi-prioriteettia ja niitä voi olla pinossa useampi palveltavaksi samalla ajanhetkellä joten ei melko varmasti onnistu, mikäli tulee yksikään korkeamman prioriteetin keskeytys väliin. Toisekseen, jotkin keskeytysajurit tuottavat 100ms:n vasteajan ts. käyttöjärjestelmä voi pitää noinkin pitkän tauon muiden keskeytysten palvelussa. Eli käyttöjärjestelmää pitäisi kirjoittaa uudestaan saadakseen tuon toimimaan.
Jotain yksinkertaista saattaa pystyä tekemään, kuten kasvattaa laskuria tai ottaa ad-muuntimelta sample talteen.
Vaihtoehto: Kiellä keskeytykset ja aja busy-loopissa timer-pollia esim. cpu:n kellosykli-laskurilla jos sellainen on tarjolla.

Äänestä

Tuollaisessa käytetään reaaliaikajärjestelmää, ei Windowsia.

Halvin ilmainen mikä ehkä voisi sopia tähän olisi Debian ja valitsee siitä päälle -rt kernelin. Sillä ehkä onnistuu 100mikrosekunnin tarkkuus kun aikakriittiselle jutulle varaa oman CPU-ytimen ja muistin mitä mikään muu ei sotke. En tiedä miten keskeytykset saa suljettua pois tuosta mutta tutkimalla selvää.

Mutta, se ei ole turvallisuuskriittisiiin juttuihin että tästä puuttuu tarvittavat sertifioinnit. Ne mitkä sopivat turvallisuuskriittisiin juttuihin maksavat sitten paljon mutta tuo Debianin reaaliaikakerneli riittää kyllä pörssiroboteille.

Äänestä
  • Debianilla ei onnistu mikään, täysi paska.

    Äänestä

Windowsissa on hires timer mutta vaatii yhde parametrin muuttamisen jotta päästään suurempaan resoluutioon.

Asiasta riippuen aikakriittisiä juttuja ei yleensä tehdä yleiskäyttiksillä kuten Wondows tai Unix/Linux vaan jollain sulautetulla missä on joko realiaikakäyttis tai ei käyttistä ollenkaan. Nuo sitten juttelee yleiskoneen kanssa vaikka USB:llä.

Äänestä
  • Tuollaista 0.1ms ajastuasta on tullut tehtyä mm. 8bittisellä arduinolla mikä lukee AD-muunninta ja laskeskelee signaalista kaikenlaista. Toki 32-bittisellä arduinolla tai vaikka NodeMCU:lla potkua on enemmän.

    Äänestä

Tuo on 10 kHz:n taajuutta vastaava lukema. Aikanaan äänikortilla pystyi saamaan keskeytyksen sen oikein konfiguroituaan tuossa tahdissa ja AD-muuntimelta arvon talteen. Tarkka keskeytystaajuus riippuu lähinnä äänikortista - pystyykö äänipiiri sitä käyttämään. Keskeytystä voi sitten käyttää haluamallaan tavalla - ei ole pakko ottaa sampleja talteen vaan voi käyttää korttia ajastimena omalle keskeytykselle. Osa äänikorteista jatkaa hommaa jopa non-stop moodissa eli keskeytyksiä tulee siihen asti kunnes ne estetään. Nykyiset äänikortit, joille annetaan digitointitaajuus ja puskuri talletusta varten eivät tällaiseen toimintaan kylläkään kelpaa - pitää olla esim. vanha sound blaster yms. joka kykenee pelkkään digitointiin.

Äänestä

voisit käyttää DMA-direct memory access, laskuria lukemassa muistinpäivitys arvoakin eli milloin DMA-0 on missäkin muistiosoitteessa menossa.

itse... kun ehkä voisin parantaa erästä ASM-koodia, yritän etsiä Intelin hyväksytyt sekä Microsoftin että minkälaisia prosessorin rekistereitä tukevat aivan suoraan _asm - koodilla inline in C, Visual Studio.

Ja pitää muistaa laittaa merkki c-kääntäjälle tai olkoon vaikka MFC-koodia, niin joku assembly-pätkä että_ DO Not optimize this is volatile assembly code.

Äänestä

heitän jonkin koodin pätkän pastean, eli miten assemblyllä kohdellaan keskusyksikön rekistereitä, vanha versio tuista, mutta niin: näin esim:
Minn koodia:

_asm {
// push ds
mov eax,jaettava
mov ebx,jakaja
mov ecx,howmany
mov edx,0
lds esi,dbuf
mov edi,0
mov tempword,0
jmp first
mainloop:
// --------------------------
//mov tempword,0
push eax
mov eax,[esi-4]
mov tempword,eax
pop eax
// --------------------------
first:
push ecx
// montako kierrosta
mov ecx,777
mainloopw:
push ecx
loop0:
cmp eax,ebx
jnc over2
push ecx
mov edx,10
mul edx
pop ecx
cmp eax,0
jnz over3
mov eax,7
over3:
jmp loop0
over2:
push eax
mov edx,0
loop1:
cmp eax,ebx
jc over4
sub eax,ebx
inc dx
jmp loop1
over4:
pop eax


push eax
mov eax,0
mov ecx,edx
multiply:
add eax,ebx
loop multiply
mov ecx,eax
pop eax
sub eax,ecx
cmp edi,0
jp over0
sub ebx,edx
jmp over1
over0:
add ebx,edx
over1:
cmp eax,0
jnz over5
add eax,edx
over5:
pop ecx

push ecx
shl cx,1
push eax
mov eax,edx
cmp eax,ecx
jnc overdiv
div ecx
overdiv:
xor tempword,eax
pop eax
pop ecx

inc edi

loop mainloopw

push eax
mov eax,tempword
mov [esi],eax
inc esi
inc esi
inc esi
inc esi
pop eax

pop ecx

dec ecx
cmp ecx,0
jnz mainloop
// pop ds

mov jaettava,eax
mov jakaja,ebx
}

return 0;
}

Äänestä

Kommentoi aloitusta


Performancetimer suck kirjoitti:

Pitäisi tehdä ohjelma joka ajaa koodinpätkän 100 mikrosekunnin välein eikä saa missata kertaakaan. Mahdollista winkkarilla?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu