Vood
Voog (Stream) on tarkvaraline universaalne kiht seadme füüsilise kihi kohta käiva tarkvara ja kasutaja poolt kirjutatud tarkvara vahel. Voog põhineb alati failil, mis on mikrokontrollerite korral tavaliselt puhtalt virtuaalne (failisüsteem puudub). Voogude kasutamine lihtsustab oluliselt rakendust kirjutava programmeerija tööd. Testimiseks ja koodi taaskasutamiseks on lihtne voo ümbersuunamine. Füüsiliseks kihiks võib olla USART või EEPROM. Tulevikus lisandub siia ka I2C ja SPI.
Vood AVR C++ Lib's on hetkel testimisfaasis. Viimane töös olev versioon on kättesaadav SourceForge SVN serverist.
Fail
Faili avamiseks, sulgemiseks ja faili vea- ning lõpubittidega manipuleerimiseks on „FileStream.h“s defineeritud funktsioonid:
template <class FileIO> File OpenFile(); bool WasFileError(File file); bool IsEndOfFile(File file); void ClearFileFlags(File file); void CloseFile(File file);
Näide 1
#include "FileStream.h" using namespace AVRCpp::USART; using namespace AVRCpp::Stream; typedef USART0 MyUSART(); void InitializeUSART(); void DataTransfer() { File file = OpenFile<FileIOForUSART<MyUSART> >(); int i; fprintf(file, "Tere sealpool! Ootan täisarvu...\n"); fscanf(file, "%i", &i); fprintf(file, "%i on hea valik!", i); CloseFile(file); } // DataTransfer int main() { InitializeUSART(); DataTransfer(); return 0; } // main
Näide 2
#include "FileStream.h" using namespace AVRCpp; using namespace Stream; int main() { File file = OpenFile<FileIOForEEPROM>(); int i; EEPROM::SetAddress(0); while (!IsEndOfFile(file) ) fprintf("The quick brown fox jumps over the lazy dog. "); CloseFile(file); return 0; } // main
Voog C++s
Toodud kaks näidet kasutasid standardseid C funtsioone. C++ pakub voogudele aga märksa paindlikumaid võimalusi.
Tekstivoog
#include "TextStream.h" using namespace AVRCpp::USART; using namespace AVRCpp::Stream; typedef USART0 MyUSART(); void InitializeUSART(); void DataTransfer() { TextStream<FileIOForUSART<MyUSART> > stream; int i; stream << "Tere sealpool! Ootan täisarvu..." << '\n' >> i << i << " on hea valik!"; } // DataTransfer int main() { InitializeUSART(); DataTransfer(); return 0; } // main
Teksti kodeerimine
Hetkel on toetatud kaks teksti kodeeringut (encoding):
enum TextEncoding { // Algupärane AVR'i teksti kodeering (vaikimisi) UTF7, // Sama, mis UTF7, ainult reavahetus '\n' asendatakse sõnega "\r\n" UTF7ForWindows }; // enum TextEncoding
Näide
TextStream<FileIOForUSART<MyUSART> > stream(UTF7ForWindows);
Binaarne voog
#include "BinaryStream.h" int main() { BinaryStream<FileIOForEEPROM> stream; uint32_t code; // Neljabaidise koodi lugemine EEPROM mälu algusest EEPROM::SetAddress(0); stream >> code; return 0; } // main
Puhvrid
Puhverdamine tasub ära juhul, kui lisaks virtuaalse faili operatsioonidele on tarvis samaaegselt protsessori ressurssi kasutada mitmete muude tegevuste jaoks.
Sisendi puhverdamine võimaldab tegeliku andmete saabumise ajal tegeleda millegi muuga ja hiljem andmed vastu võtta suurema hulga korraga. Oluline on see just madalama lugemiskiiruse korral (näiteks USART baudrate = 9600). Ilma puhvrita võib osa infost kaduma minna, kui just ei oota suurema osa ajast blokeerunult kinni andmete vastuvõtmise funktsioonis.
Väljundi puhverdamise korral suurem hulk andmeid kirjutatakse esmalt mällu, kust seda hakatakse virtuaalsesse faili ümber kirjutama vastavalt nii kiiresti, kui füüsiline kiht seda võimaldab. Reaalse saatmise ajal on võimalikud muud tegevused. Kasu on seda suurem, mida aeglasem on füüsiline kiht võrreldes mällu kirjutamise kiirusega.
Puhverdamise võimalused:
- NoBuffer - puhver puudub (vaikimisi)
- StaticBuffer - staatiline puhver, mille suurus baitides on klientprogrammi poolt template parameetriga määratav.
Puhvri võib määrata:
// Ainult sisendile TextStream<StaticBuffer<20> > stream1; TextStream<StaticBuffer<20>, NoBuffer> stream2; // Ainult väljundile TextStream<NoBuffer, StaticBuffer<80> > stream3; // Nii sisendile kui ka väljundile TextStream<StaticBuffer<100>, StaticBuffer<20> > stream4;
Puhverdamine toimib vaid juhul, kui katkestused on globaalselt lubatud!
Puhver EEPROM'i korral
EEPROM faili korral ei ole mõistlik sisendpuhvrit kasutada, sest seda nii-kui-nii ei kasutata, kuna lugemine EEPROM'st võtab aega vaid mõned protsessori taktid.
Määrates EEPROM failiga voole väljundpuhveri, tuleb lisada EEPROM kirjutamisega seotud katkestuse delegaadi deklaratsioon (ATmega128):
#include "Interrupt.h" #include "EEPROM.h" #include "Delegate.h" USING_FAST_DELEGATE(EE_READY);
Puhver USART'i korral
Sisendpuhvri jaoks lugemise katkestusele delegaadi määramine (ATmega128):
#include "Interrupt.h" #include "USART.h" #include "Delegate.h" USING_FAST_DELEGATE(USART0_RX);
Väljundpuhvri jaoks kirjutamise katkestusele delegaadi määramine (ATmega128):
#include "Interrupt.h" #include "USART.h" #include "Delegate.h" USING_FAST_DELEGATE(USART0_UDRE);