Homepage Wiki Forum Buy

GNUBLIN embedded GNU/Linux

Open source learning and training plattorm for embedded GNU / Linux
A projects from Hochschule Augsburg and embedded projects GmbH

Project homepage: http://www.gnublin.org
Wiki: http://wiki.gnublin.org
Aktuelle Zeit: Sa 18. Nov 2017, 00:53

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: C++ GPIO ein-/ausschalten
BeitragVerfasst: Mo 21. Jan 2013, 17:37 
Offline

Registriert: So 20. Jan 2013, 10:52
Beiträge: 37
Hi, Mädels ... Jungs :)

Ich habe mit dem Script hier aus dem Forum ein Debian auf die SD-Karte installiert. Das lief auch recht Problemlos.

Ich versuche gerade einen analogen Modellbauservo mit dem Gnublin zu steuern. Das PWM Signal wollte ich per Software generieren damit die Hardware PWM für andere (Zeitkritischere) Funktionen frei bleibt. Laut Oszi funktioniert das auch grundsätzlich. Für die warte Zeiten habe ich nanosleep benutzt. Wenn ich das Timeing am Oszi ablese scheint es so das ca. 4ms die kleinste Wartezeit ist und das ist leider zu lang um einen Servo zu steuern. Ich vermute es liegt an der zu geringen Auflösung der Timer mein Kernel wissen reicht nur nicht so weit das ich wüsste wie ich das evtl. verbessern kann.

Ein anderes Problem habe ich noch mit dem C++ Programm das ich dafür verwende.

So soll man die Pufferung der Schreibzugriffe ausschalten können:
Code:
filePortValue.rdbuf()->pubsetbuf (NULL, 0);

Das funktioniert aber bei mir nicht. Weiß zufällig jemand warum oder was man wirklich tun muss um die Pufferung zu unterbinden?

Geht nur mit einem extra flush Aufruf sonst wird der Port nicht geschaltet.
Code:
filePortValue << "0" << std::flush;


Hier mal der Code für die Signal Schleife:
Code:
  auto func = [&] ()
       {
         std::ofstream filePortValue ("/sys/class/gpio/GPIO11/value");
         filePortValue.rdbuf()->pubsetbuf (NULL, 0);

         for (;;)
         {
         // Port ausschalten
           filePortValue << "0" << std::flush;

         // Zeit für "aus" abwarten (ruft nanosleep auf)
           microSleep (timeOff);

         // Port einschalten
           filePortValue << "1" << std::flush;

         // Zeit für "ein" abwarten (ruft nanosleep auf)
           microSleep (timeOn);
         }

         filePortValue.close ();
       };

  std::thread t1 (func);


Auf meinem Debian PC geht das mit den Zeiten auch unter 4ms.

Grüße
Alexander


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Do 24. Jan 2013, 07:11 
Offline
Administrator

Registriert: Sa 7. Apr 2012, 09:18
Beiträge: 251
Kennst du das?

viewtopic.php?f=10&t=62&p=266&hilit=mmap


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Do 24. Jan 2013, 08:20 
Offline

Registriert: Di 16. Okt 2012, 17:20
Beiträge: 51
bzw. das
http://wiki.gnublin.org/index.php/GPIO# ... m_Speicher


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Do 24. Jan 2013, 10:40 
Offline

Registriert: So 20. Jan 2013, 10:52
Beiträge: 37
Den Beitrag aus dem Wiki kenne ich. Das andere muss ich erst noch mal lesen Englisch ist nicht so meine Spezialität.

Mit dem Programm von mir kommt man ohne die Wartezeiten auf eine Schaltfrequenz von ca. 150Khz wenn man über das Filesystem die Ports schaltet. Das für den Servo benötigte Signal ist aber viel langsamer ca. 28Hz. Lasse ich den Timeraufruf für tein weg liegt die gemessene Einschaltzeit bei etwas unter einer Millisekunde.

Hier http://www.linux-magazin.de/Ausgaben/2007/01/Kern-Technik/%28offset%29/2 habe ich gelesen das der Timer Takt des Kernels normal nur 4ms oder 250Hz ist. Auf meinem Notebook scheint das anders zu sein dort läuft aber auch eine neuerer Kernel Version.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Do 24. Jan 2013, 11:06 
Offline

Registriert: Di 16. Okt 2012, 17:20
Beiträge: 51
Hi,

sehe ich das problem richtig, dass deine Schaltfrequenz schnell genug ist, nur dass dir die Reaktionszeit von 4 ms zu langsam sind?
Wenn du ueber mmap direkt auf die Portregister schreibst, dann geschicht das Portschalten innerhalb der benoetigten Takte... Du greifst quasi durch den Kernel direkt auf die Register zu...
Btw: Im Forumsbeitrag steht das selbe wie im Wikieintrag..


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Do 24. Jan 2013, 11:53 
Offline

Registriert: So 20. Jan 2013, 10:52
Beiträge: 37
Das siehst Du noch nicht ganz richtig ... glaube ich

Der Servo wird mit einem PWM Signal gesteuert. Das taus ca.30ms und tein ca. 1-2ms hat. Damit ich eine Impulsdauer von 1-2ms Schalten kann muss ich ja irgendwie die Zeit in kleineren Einheiten als 1ms messen. Meine Idee war nachdem ich das vom PC Linux her kenne diese Zeiten mit nanosleep zu messen. Auf dem Gnublin habe ich aber als kleinste mögliche Zeitdauer 4ms. Wenn ich nanosleep mit einem Wert von 1 Aufrufe dauert das 4ms. Was jetzt halt geringfügig mehr als 1 Nanosekunde ist.

Das Problem ist daher meiner Meinung nach nicht die Geschwindigkeit mit der ich den Port schalten kann sondern die Zeit zu messen wann ich ein bzw. wieder ausschalten muss. Auch wenn ich die Ports über direkte Speicherzugriffe schalte muss ich ja trotzdem irgendwie die Zeit messen die vergangen ist seit dem Einschalten.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Sa 26. Jan 2013, 14:10 
Offline

Registriert: So 20. Jan 2013, 10:52
Beiträge: 37
Ich habe mir jetzt mal den 3.3.0 Kernel aus gnublin_develop_kernel heruntergeladen. Wenn man da in die arch/arm/configs/gnublin_defconfig schaut wird für CONFIG_HZ 250 gesetzt. Wenn ich mich nicht verrechnet habe und das tue ich nie sind es genau die 4ms die nanosleep als minimale Zeit abbilden kann. Kann man den Takt einfach erhöhen oder irgendwie die hrtimer aktivieren. Ich dachte eigentllich die wären in der Kernel Version schon vorhanden.
Weiß zufällig jemand wie ich die aktivieren/benutzen kann?

4ms sind halt selbst für primitive Mechanik zu steuern eine Ewigkeit.

Was wurde eigentlich an den 3.3.0 Sourcen verändert?
In dem Verzeichnis das man herunterlädt gibt es auch ein Patch Verzeichnis muss ich das erst noch ausführen oder sind die schon in den heruntergeladenen 3.3.0 Sourcen enthalten?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Di 29. Jan 2013, 11:48 
Offline

Registriert: So 20. Jan 2013, 10:52
Beiträge: 37
Also eins ist schon mal sicher für irgend was halbwegs sinnvolles ist das Gnublin Projekt nicht wirklich brauchbar. Timer mit einer minimalen Auflösung von 4ms taugen wirklich nur wie im Wiki beschreiben zum ein/aus der LED die auf dem Platinchen ist. Ich will ja nicht erst den Kernel umschreiben müssen damit ich ein alltägliches Steuerungsproblem lösen kann.

FAZIT: Der Gnublin ist als Spielzeug verwendbar aber von einer Verwendung in realen Anwendungen wegen mangelder Software Unterstützung nicht zu gebrauchen. Wird leider in der Werbung nicht korrekt wiedergegeben ein bisschen mehr ehrlichkeit hier hätte mir einem Menge verschwendetes Geld erpart. :(


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Do 31. Jan 2013, 13:11 
Offline

Registriert: Di 16. Okt 2012, 17:20
Beiträge: 51
Mein lieber alexander_ro,

das "Problem" mit der Timer-Aufloesung des Linux-Kernels wirst du entsprechend mit jedem embedded Linux Sytem haben.
Das ist nunmal ein echtes Linux. Du kannst natuerlich auch hergehen und den LPC3131 von Hand wie einen AVR programmieren. Oder du denkst dich in das Timer-Modul des Prozessors ein und entwickelst ein Kernel-Modul.
Aber da wird dir der Aufwand wahrscheinlich zu gross sein und deshalb sage ich das:
Vielleicht ist dein Ansatz einfach nicht korrekt fuer deinen Zweck unbedingt ein embedded-Linux System zu verwenden.

Eine kleine Vorabanalyse deines Wunsches und der Anforderungen haetten dich evtl. schnell auf eine andere Basis gebracht als ein embedded Linux System.
Behalte deinen Frust fuer dich und checke vorher vielleicht ein bisschen genauer, ob deine Anforderungen von deinem naechsten "Fehlkauf" ueberhaupt geleistet werden koennen.

Gruss,

Armin


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: C++ GPIO ein-/ausschalten
BeitragVerfasst: Fr 1. Feb 2013, 12:30 
Offline

Registriert: So 20. Jan 2013, 10:52
Beiträge: 37
Meine liebe knallerbse,

ja ich hab euch auch lieb ... DU solltest lernen was ein Linux kann und was nicht. Wenn man einen ordentlich portierten Kernel hat kann er das auch und das Gnublin die normalen fähigkeiten des Kernels nicht unterstützt wird nirgends erwähnt. Du solltest Dich vielleicht selber erstmal schlau machen im Punkto Embedded Linux. Der LC3131 kann ganz Problemlos unter 4ms Zeiten messen.

Ich habe meinen Wunsch schon vorher genau untersucht aber aufgrund unvollständiger Produktbeschreibung die falschen Kaufentscheidung getroffen. Da kann man Prüfen so lange man will ... fragt sich nur wer hier seinen Frust bei sich behalten sollte.

Ich mach da ja eigentlich die arbeit die der Hersteller versprochen hat zu machen. Wenn jemand ohne Einschränkungen ein vorinstalliertes Linux zusichert erwarte ich schon das die gängigen funktionalitäten zur Verfügung stehen und für einen für Steuerungsaufgaben vorgesehenen Rechner ist die Zeitmessung mit einer brauchbaren und zur CPU passenden Auflösung eine der wichtigsten funktionalitäten.

Mit der Verbesserung der Portierung des Kernels habe ich bereits angefangen. Da ich aber kein Kernel Entwickler bin ist es für mich einiges an Aufwand der sicher mehrere tausen Euro ausmacht. Da ihr mir die vermutlich nicht bezahlen werdet finde ich schon man könnte etwas freundlicher sein wenn jemand so viel Geld verschenkt und nicht rummeckern sondern zum Beispiel mit den angefragten Informationen helfen die Aufgabe zu erledigen. Das Gnublin Board würde durch die Unterstützung einer angemessenen Zeitmessung auch einen deutlichen Mehrwert erfahren. Weil es dann in der tat nicht nur LEDs im Sekundentakt blinken lassen könnte sonder reale mechanische aufgaben lösen. Im moment wäre es neben dem Servo auch unmöglich einen Bürstenlosen Elektromotor zu steuern und etliche andere primitive Mechanik. Ihr glaubt ja hoffentlich nicht ernsthaft das eine 180Mhz CPU für so eine Aufgabe zu langsam ist oder?

Grüße
Alexander


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de