Das ist etwas anders, aber ich denke, veranschaulicht die involvierte Logik. Ich arbeite an einigen MSP430-Code in C, und habe eine Timestamp-Struktur sehr ähnlich wie timeval, aber mit nsecs anstelle von usecs.
Dieser Code hält alles positiv, so dass unsigned Ints würde gut funktionieren, und vermeidet Überläufe (denke ich). Es ändert auch nicht die Zeitstempel/Zeitspannen, die übergeben werden, außer dem Ergebnis natürlich.
typedef struct timestamp {
int32_t secs;
int32_t nsecs;
} timestamp_t;
int timestamp_sub(timestamp_t * x, timestamp_t * y, timestamp_t * result){
// returns 1 if difference is negative, 0 otherwise
// result is the absolute value of the difference between x and y
negative = 0;
if(x->secs > y->secs){
if(x->nsecs > y->nsecs){
result->secs = x->secs - y->secs;
result->nsecs = x->nsecs - y->nsecs;
}else{
result->secs = x->secs - y->secs - 1;
result->nsecs = (1000*1000*1000) - y->nsecs + x->nsecs;
}
}else{
if(x->secs == y->secs){
result->secs = 0;
if(x->nsecs > y->nsecs){
result->nsecs = x->nsecs - y->nsecs;
}else{
negative = 1;
result->nsecs = y->nsecs - x->nsecs;
}
}else{
negative = 1;
if(x->nsecs > y->nsecs){
result->secs = y->secs - x->secs - 1;
result->nsecs = (1000*1000*1000) - x->nsecs + y->nsecs;
}else{
result->secs = y->secs - x->secs;
result->nsecs = y->nsecs - x->nsecs;
}
}
}
return negative;
}
Danke für den Tipp, aber ich benutze bereits den Code. In der Tat habe ich gerade realisiert, was mein Problem war. Vielen Dank für die Überprüfung von Google. Es ist wahrscheinlich das erste, was ich als Antwort gepostet hätte. =) –
Um zu verdeutlichen, erkannte ich, dass die Zeitwerte initialisiert wurden, um 'tv_sec'- und' tv_usec'-Werte von 0 zu haben. Das 'itttimeofday()' zur korrekten Initialisierung der Warteschlangen behob das Problem. Danke für die Unterstützung. =) –
2AShelly, ich würde hinzufügen, dass IMHO es besser ist, die zweite Bedingung folgendermaßen zu ändern: x-> tv_usec - y-> tv_usec> = 1000000', um die Zeit wie '5/1000000' in' 6 zu konvertieren/0'. – Kolyunya