• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

C Code verprasselt zu viel CPU ZEIT!

Hallo!

Ich habe hier eine Schleife, welche 1000 zeichen von einer seriellen Schnittstelle liest und diese in eine Datei (neu) schreibt.
Funktioniert soweit gut, nur das die Geschwindigkeit über die serielle Schnittstelle langsam ist und das ganze dann bei größerer Zeichenabfrage zwar lang dauert (macht nix) aber! in der Zwischenzeit mächtig viel Rechenleistung benötigt. Ich kenn zwar die Funktion sleep() kann diese aber hier nicht einsetzten.

Hat jemand einen Rat?

for(x=1; x<=(1000); x++)
{
c = getc(rs232);
putc(c,neu);
}

Programmiersprache: C
Betriebssystem: Linux

Vielen Dank!
 
Hi,

ich würde dir raten die Zeichen zunächst in eine Array zu packen und erst dann wegzuschreiben. Also so:

char c[1000];

for(i=0;i<1000;i++)
{
c = ' '; //init mit Leerzeichen
c = getc(rs232);
}
for(i=0;i<1000;i++)
c = putc(c,neu);

Ich vermute nämlich dass das gleichzeitige lesen (seriell) und schreiben (in Datei) das eigentliche Problem ist.
 
Danke für den Tipp!

Hab ich gerade ausprobiert, frisst aber genau so viel CPU!

Kann man nicht irgendwie den CPU schlafen schicken bis ein zeichen ankommt?
 
Hi xcatpc,

was mir gerade einfällt, die for-Schleife wird ja nicht der ganze Code sein. Hast du evtl. eine While-Schleife dauerhaft am laufen ?
Dies würde die hohe CPU-Last erklären. In dem Fall würde ich dir ein Polling vorschlagen und da die Anwendung allem Anschein ja nicht zeitkritisch ist sollte dies eine Möglichkeit sein.

edit:
ich habe gerade das Beispiel von RME gelesen. So sollte eine hohe CPU-Last ausgeschlossen sein.
 
Hallo!

Hier mal der gesamte Code



Ich denke das, dass auslesen von rs232 anders gemacht werden muss. Da ich schleife ja schneller durchlaufen wird als neue zeichen ankommen.

Hat jemand einen Verbesserungsvorschlag
 
hi xcatpc,

mir fallen ein paar Dinge an deinem Code auf:

1. malloc setzt man nur dann ein, wenn Datensätze mit unbekannter Länge oder Anzahl vorkommen können (Speicher wir zur Programmlaufzeit zur Verfügung gestellt)
2. dies machst du ungünstigerweise auch noch mehrfach in einer Schleife (allokieren und wieder freigeben)
3. das zyklische pollen über eine wihle-Schleife fehlt völlig

Meine Vorschlag
zu 1+2 zeiger[1000] denn du erwartest ja immer 1000 Zeichen
zu 3 ein Polling einbauen wie im Beispiel von RME gezeigt
 
developer schrieb:
1. malloc setzt man nur dann ein, wenn Datensätze mit unbekannter Länge oder Anzahl vorkommen können (Speicher wir zur Programmlaufzeit zur Verfügung gestellt)

Das stimmt so nicht.

Mit malloc wird dynamisch Speicher alloziert,aber nicht für Datensätze mit unbekannter Länge. Beispiel:
Code:
struct DataSet {
    int id;
    void *data;
};

struct DataSet *myDataSetPtr;
myDataSetPtr = (struct DataSet *)malloc(sizeof(struct DataSet));

if (myDataSetPtr == NULL) {
   printf("Could not allocate memory.");
   return -1;
}
 
Hallo spoensche,

hm, dann muss wohl sie Referenz für C neu geschrieben werden (siehe http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/malloc.html) abgesehen davon das ich in dem vorliegenden Fall calloc verwenden würde.
 
developer schrieb:
hm, dann muss wohl sie Referenz für C neu geschrieben werden (siehe http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/malloc.html).

Die C- Referenz muss nicht neu geschrieben werden. Es ist dort ein wenig unglücklich beschrieben. Siehe: http://www.gnu.org/software/libc/manual/html_node/index.html#toc_Memory
 
Oben