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;

NB! 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);