Systeminfo auslesen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich habe nun einen RpiTwo und möchte nun über ein 1602 Display bestimmte Systemwerte ausgeben. Auf die Temperatur kann ich ohne weiteres zugreifen, da diese in einer Datei abgespeichert wird. Wie aber komme ich am komfortabelsten an die anderen Werte (CPU Takt, frei Speicher, ....).

    Die cat vcgencmd Befehle helfen mir da nicht wirklich weiter, da es sich nicht um Dateien handelt, die ich mit fopen aufrufen kann.

    Ich nutzte als Entwicklungs-IDE Geany. makefile Parameter werden beim Kompilieren/Erstellen von wiringPi mit übergeben, Python ist übrigens für mich hier nicht die Lösung.

    Gruß Stefan

  • Wäre mit jetzt neu. Eine Möglichkeit, die mir so im Kopf schwiert, wäre alle wichtigen Daten mit vcgencmd in eine externe Datei alle x Sekunden auslagern und entsprechend in C wieder einlesen. Das dürfte soweit gehen, halte ich aber als unkomfortabel, da hier dann "2" Systeme an der Problemlösung arbeiten. Für weitere Vorschläge offen.

  • Eleganter geht's mit "popen", dann wird Dir das Ergebnis des Kommandos gleich über eine Pipe gesendet.
    Hab's jetzt nur stichpunktartig im Kopf. Sähe für ein "ls" Kommando in etwa so aus:

    Code
    FILE *f=popen("/bin/ls","r");
    if (f != NULL) {
      while ( fgets(Buffer, sizeof(Buffer), f ) != NULL ) printf("%s\n", Buffer);
      pclose(f);
    }


    'Buffer' mußt Du natürlich entsprechend definieren ...

    Gruß, mmi

  • Hallo beinander ...

    eijeijei ... system(), popen() ... :fies:
    Mal ganz abgesehen davon, dass das die Werte verfälscht, weil es selbst ziemlich heftig bei den Resourcen zulangt ( fork() , eine pipe, ein Overlay mit dem Zielprogramm inkl. Environment ... ) ist das in der Tat zumindest nicht mein Stil.

    Tipp: befasse Dich mal mit dem /proc -Dateisystem.
    Da stehen Dir alle Werte zur Verfügung ;)

    cu,
    -ds-


  • eijeijei ... system(), popen() ... :fies:
    Mal ganz abgesehen davon, dass das die Werte verfälscht, weil es selbst ziemlich heftig bei den Resourcen zulangt ( fork() , eine pipe, ein Overlay mit dem Zielprogramm inkl. Environment ... ) ist das in der Tat zumindest nicht mein Stil.

    Ja, hallo alter C Spezi! :)

    Ehrlich gesagt, ist's auch nicht mein Stil - aber will man nicht einen Ratschlag geben, der möglichst einfach zu einem respektablen Ergebnis führt? Sozusagen "populärwissenschaftlich" - wie ich's grad in einem Beitrag von raspiprojekt gesehen habe - sehr trefflich ausgedrückt! :thumbs1:

    Aber es gibt ja doch den einen oder anderen Fall, der nicht schon fertig in den /sys Dateien steht und auch keine lib zu finden ist - dafür von einem bash Programm prima erledigt wird. Dafür: es lebe popen - zumindest bei mir, denn neu möchte ich das Rad dann der Bequemlichkeit halber auch nicht erfinden. :denker:

    Servus und hawediere (wie man ca. 10km von mir entfernt zu sagen pflegt = Oberpfalz) :)
    mmi

  • Hallo,

    inwzischen habe ich herausgefunden, das C bereits einige nütztliche Libarys für das Debian System mit sich bringt.

    Hier einmal ein kleiner Test. Bislang habe ich hauptsächlich ATMEL 8Bit-AVRs in avr-gcc programmiert. Nun verhält sich der Raspberry nicht so, wie ein AVR.

    Was ich damit meine, wenn ich viele Sachen zeitgesteuert machen möchte, aber gleichzeitig auf bestimmte Sachen schnell reagieren möchte, bedarf es Interrupts bzw. nonBlocking Code (ohne _delay_ms(),...).

    Nun, wie baut man sowas am besten auf einem solchen System auf? Ich habe mit htop erkannt, dass eine Kern zu 100% ausgelastet wird mit so einem Programm. Verständlich, es befindet sich in einer Dauerschleife (while(1)).
    Wie aber löst man sowas um die Systemlast möglich gering zu halten?

    Das ganze soll später ein externes 1602 Display werden, welches über ein paar Taster bedient werden kann. Auslesen von Systeminfos sowie die möglichkeit, aus der Console heraus "kodi-standalone" zu starten/beenden, "startxfce4" zu starten/beenden oder aber "shutdown -h now"/"reboot".

  • Hi,
    um mal auf das aktuelle Beispiel von dir einzugehen:


    ...

    Code
    ...
        while(1)
        {
            time(&t);
            interval = (t/10)%10;
            /* Alle 10s ausfuehren */
            if(interval != last_interval)
    ...
        }
    }

    das ist ja schon mal Kappes ;)
    Du weisst doch, dass Du 10 Sekunden Intervall hast ... also:

    Code
    ...
        while(1)
        {
               sysinfo(&si);
               show_uptime(&si);
               show_loads(&si);
               sleep(10);
        }
    }


    und schon geht Dein load auf unter 1% ;) ...

    cu,
    -ds-

  • Hallo dreamshader,

    ja so in etwa ist das Gedacht gewesen.

    Frage nun alle 50ms ab, ob es eine Änderung am Eingang gab. Wenn nichts passiert ist, worauf ich reagieren muss, soll das ganze wieder Pausieren.

    Interrupt wäre hier vermutlich wieder zuviel, zu mal ich mir eine ordentliche TimerEntprellroutine ersparen wollte.

  • Hallöle,


    ...
    Interrupt wäre hier vermutlich wieder zuviel, zu mal ich mir eine ordentliche TimerEntprellroutine ersparen wollte.
    ...


    warum wäre eine ISR hier zuviel?
    Würde ich immer mit einer ISR machen ... Möglichkeiten zum Entprellen findest Du hier im Forum und auch sonst im Netz zum Schweinchenfüttern ... ;)

    Alles andere hat imho einen touch von Stümperei :fies: ... sorry, sehe ich halt so ...

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!