nu tu saimhe visada atrasai kaip profesorius :) biski paexperimentavau viskas gaunasi lengviau negu tikejausi, kolkas apsieinu be interuptu, nes dar ju vis neismokstu naudoti.. "saimhe" <oh.no@oh.my> wrote in message news:i0kvtt$i81$1@trimpas.omnitel.net... >> tipo jeigu turiu amzina cikla kuris vis sukasi su kazkokiais veiksmai >> jame, tai vis patikrinu uarto baita, sakykim kazkoks spec >> pradzios baitas. > > Dažnai interrupt'e galima padaryti visą ryšio protokolą 100% ir tas > pagrindinis ciklas apie tai nieko nežinos. > Tai yra kodo gabalas, kurį pradeda vykdyti automatiškai. Blinkini > sau led'us, o procas staiga perdavė valdymą kitai paprogramei, > atėjusiam baitui apdoroti. Apdorojo, grįžo -- procas tęsia savo amžiną > ciklą. Automatiškai pradeda vykdyti nuo tam tikro adreso (interrupt > vector), paprastai tenai įrašomas jump'as į paprogramę; C kalboje viską > apiformins kompiliatorius. Taip pat sisteminiuose registruose reikia > įjungti generavimą (interrupt enable bit, ir taip toliau). Be to, yra > ir bendras "enable", su juo trumpam pristabdomi interrupt'ai, kada labai > jau negalima trukdyti maždaug keliolikos komandų trukmės veiksmams. > Idėja pasiteisina, jei kiekvieno baito apdorojimas yra minimaliai > trumpas -- tik todėl jis netrukdo pagrindiniam ciklui. Kartais visvien > trukdo, tada reikia imtis priemonių. > > Žymiai paprasčiau, kai gaunami paketai turi griežtą struktūrą. > Tarkim, protokolas yra tekstinio tipo: ":" -- pradžios baitas, kurio > niekada nebūna tarp duomenų; "0"..."F" -- toliau esančių įrašų skaičius > minus vienas; "00" ... "FF" -- duomenys, nuo 1 iki 16 tokių porų. Būtų > dar galima pabaigoje pridėti 0Dh arba 0Ah, kartais tai naudinga, jei > priima kompas -- pavyzdžiui, tiek Win32, tiek Linux sugeba reaguoti į > tokį baitą sraute ir tik po to grąžinti visą priimtą paketą (nereikia > pačiam rinkti po baitą). > Tai dabar pravartu žinoti, kas yra baigtinis automatas (finite state > machine). O galima ir nežinant aklai įprasti naudoti būsenos kintamąjį, > iš kurio (ir kitų pagalbinių kintamųjų) visada aišku, ką daryti su naujai > atėjusiu baitu. Reikšmėms C kalboje naudojami enum arba #define (pvz., > enum { ST_IDLE = 0, ST_PREAMBLE, ST_LENGTH, ST_D0H, ST_D0L ... }). > Panašios simbolinės priemonės yra ir asembleryje. O šitas mūsų protokolas > toks paprastas, kad pakenčiamai atrodys ir pliki skaičiai 0 ... 34, > tiesiog ne taip vaizdu. Patogu, kai reikšmės tolygiai didėja -- galima > būsenos kintamąjį didinti vienetu. > Gavom baitą, būsena 0 -- jei baitas ne ":", ignoruojam ir būsena > lieka 0. > Būsena 1 -- gautas baitas turi būti nuo "0" iki "F" (30h ... 39h, > 41h ... 46h). Jei ne, tada duomenys sugadinti ir priiminėsim iš naujo, > būsena grįžta į 0. Jei normalus šešioliktainis skaičius, tada verčiam > į binary ir įsimenam kaip paketo ilgį. > Būsena 2...33: lygiai taip pat tikrinama reikšmė ir verčiama į binary. > Lyginiais atvejais dauginam iš 16 (arba pastumiam per 4 bitus) ir > įsimenam, o nelyginiais -- operacija "OR" su įsiminta reikšme ir įrašom > į buferį adresu (busena - 2) / 2. Įrašius tiek baitų, kiek buvo nurodyta > paketo ilgyje, būsena pavirsta 34: laikas apdoroti. Tai signalas > pagrindiniam ciklui, kad buferis pilnas. Tenai, jo turinį panaudojus, > būseną reikės grąžinti į 0. > Interrupt'e būsena vis dar 34 -- baitą ignoruojame, nes buferis vis > dar pilnas. > > Beje, panašiai padaromas ir siuntimas. Iškeliavus eiliniam baitui, > susigeneruoja siuntimo interrupt'as. Paprogramė ima iš buferio naują > baitą ir permeta į siuntimo registrą. Jei baitų nebėra, nebereikia ir > nieko daryt. > > -- > saimhe