PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : warteschleife mit ringspeicher



gorba
24-03-2006, 11:35
hallo

folgendes:
ich arbeite an byteweiser serieller kommunikation:
beim einlesen habe ich das so gemacht, dass ein signal auf den fd angesetzt wurde, der mir ein flag setzt, wenn daten zum einlesen bereitstehen. Danach wollte ich ein einfaches read() mit 1 Byte grösse starten. Da aber anscheinend vom kernelspace nur 100 signale/s durchkommen muss ich das ganze umstellen, um das ganze zu implementieren da ich ansonsten schneller uf den draht schribe als lese. Das fürht zu allerlei problemen..

Ich hab mir jetzt gedanken gemacht, beim auslesen eine queue zu implementiere und zwar so:

Pseudocode der queue struktur:


struct queue_mgr{
data *next
data *last
data *last_address
queue[Q_MAX](
struct data{
unsgined char buffer[B_MAX]
int size
int pos
}
)
}



Beim auslesen geb ich last mit der auf ein element von queue zeigt, der buffer wird gefüllt und ich inkrementiere den pointer solange er nicht last_address erreich, wenn das der fall ist setze ich ihn auf die erste adresse von queue.
Den last zeigt dan auf den letzten nicht abgearbeiteten buffer den ich dann sequentiell abarbeiten kann. Wenn der ganze buffer von last leer ist inkrementiere ich ihn solange er nicht auf last_address ist und nicht auf next zeigt.

Giebt es da noch einfachere wege eine queue zu implementieren?
Ich suche nach ideen nicht nach lösungen (wollte damit nur sagen, dass ich kein pseudo code als post suche, sondern eher nach anregung wie man das ganze lösen könnte ohne es kompliziert zu machen). Mir fällt einfach keine andere variante ein die ich noch in betracht ziehen kann...

anda_skoa
28-03-2006, 14:28
Du könntest mit einem Array arbeiten und den Indexzugriff durch eine Modulo Operation schicken

Ciao,
_

nobody0
05-04-2006, 15:44
Ja, und Initialisieren mit -1 für leeren Buffer sollte auch gleich gemacht werden.