KizarmProbe.
 Vše Třídy Soubory Funkce Proměnné Výčty Hodnoty výčtu Definice maker Skupiny Stránky
Veřejné metody | Chráněné metody | Seznam všech členů
Dokumentace šablony třídy Fifo< T >

[Fifo class example] ...

#include <fifo.h>

Veřejné metody

 Fifo (const unsigned depth)
 Parametr konstruktoru by měla být hloubka FIFO, ale pak by musela být dynamická alokace paměti.
 
bool Write (const T &c)
 
bool Read (T &c)
 

Chráněné metody

void saturate (volatile int &index)
 
void safeInc (void)
 Atomická inkrementace délky dat.
 
void safeDec (void)
 Atomická dekrementace délky dat.
 

Detailní popis

template<class T>
class Fifo< T >

Fifo čili fronta.

Fifo použité v obsluze USB zkusíme napsat jako šablonu. Fakt je, že v tomto případě kód neroste. Zřejmě je překladač docela inteligentní. A jde tak ukládat do fifo různá data, včetně složitých objektů. Fifo je tak jednoduché, že může mít všechny metody v hlavičce, tedy default inline. Je však třeba zajistit atomičnost inkrementace a dekrementace délky dat. Použita je metoda se zákazem přerušení a snad funguje. Ona totiž pravděpodobnost, že se proces v přerušení zrovna trefí do té in(de)krementace je tak malá, že je problém to otestovat na selhání, takže to celkem spolehlivě funguje i bez ošetření té bezpečnosti. A u některých architektur je inkrementace či dekrementace buňky v paměti atomická v principu. U této však nikoli. Viz :

... safeDec(); ...
8000364: b672 cpsid i
8000366: 6d44 ldr r4, [r0, #84] ; 0x54
8000368: 3c01 subs r4, #1
800036a: 6544 str r4, [r0, #84] ; 0x54
8000328: b662 cpsie i

Zde to nakonec není potřeba - do fronty se zapisuje a čte v přerušení a jediný případ, kdy se zapisuje v main() je stejně ošetřen uzamčením, aby se zapsal do fifo celý paket naráz.

Nakonec bylo lepší udělat pořádný mutex.

Dokumentace k metodám

template<class T>
bool Fifo< T >::Read ( T &  c)
inline

Čtení z FIFO

Parametry
codkaz na jeden prvek, kam to bude načteno
Návratová hodnota
true, pokud není prázdný
template<class T>
void Fifo< T >::saturate ( volatile int &  index)
inlineprotected

Saturace indexu - ochrana před zápisem/čtením mimo pole dat

Parametry
indexodkaz na saturovaný index
template<class T>
bool Fifo< T >::Write ( const T &  c)
inline

Zápis do FIFO

Parametry
codkaz na jeden prvek co bude zapsán
Návratová hodnota
true, pokud není plný

Dokumentace pro tuto třídu byla generována z následujícího souboru: