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...
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...