GPIO per Assembler-Code ansteuern --> Speicherzugriffsfehler

  • Hallo,

    bei dem folgenden Assembler Code (Ansteuerung von GPIO21) erhalte ich bei der Ausführung "./LED_GPIO21" die Meldung "Speicherzgriffsfehler".

    Kompiliert habe ich den Code:

    Code
    1. as -o LED_GPIO21.o LED_GPIO21.s
    2. gcc -o LED_GPIO21 LED_GPIO21.o

    Kann mir da jemand etwas zu sagen ?


    MfG


    Juergen B.

  • Moin jbaben,


    ldr r0,=0x3F200000

    Die Speicheradresse passt zu deinem Rasberry??


    /EDIT Ich habe mal ein büschen gelesen. Es gibt ja 1000 und eine Lösung. Habe einige davon mal probiert, aber alle gehen nicht.

    Bist du dir sicher das du es durch den AS und dann noch durch den gcc jagen musst?


    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

    Einmal editiert, zuletzt von Bernd666 ()

  • Hallo Jürgen,


    das wird so nix werden.


    Mal abgesehen davon, dass Programme in dieser Art (Erklärung folgt) nur als BARE METAL funktionieren. Falls sonst kein Bockmist (Ass.-Code, Assembler- und GCC-Aufruf) enthalten ist, sollte es dort tun.


    Unter einem Betriebssystem sind die GPIOs nur als virtueller Speicher adressierbar. Das bedeutet, dass Du mit MEMORY-MAPPING arbeiten musst.

    Alles, von dem Du denkst, Du würdest direkt auf den Registern arbeiten, läuft nur virtuell ab. Intern werden die GPIO-Abläufe zeitversetzt übertragen.


    Das zumindest waren meine Erfahrungen aus der BARE-METAL-Programmierung zahlreicher Auftragsentwicklungen auf RPis sowie aus der Entwicklung meiner in Assembler geschriebenen GPIO-Libraries für ARM-Prozessoren 2017/2018.


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Servus,

    bei dem folgenden Assembler Code (Ansteuerung von GPIO21) erhalte ich bei der Ausführung "./LED_GPIO21" die Meldung "Speicherzgriffsfehler".

    was nicht weiter verwundert (sie auch Kommentar von Andreas ) weil Du unter Linux keinen direkten Zugriff aus dem Userspace auf die Adressen hast.

    Wozu soll das gut sein?

    Nutze stattdessen z.B. die GPIO UAPI ( -> Quick hack: GPIO-Steuerung in C ohne root Rechte und ohne Library ... ) ... das ist effektiv, DU brauchst kein memory mapping und das locking wird auch korrekt durchgeführt und der Geschwindigkeits-Unterschied dürfte marginal sein.


    cu,

    -ds-

  • Hallo,

    vielen Dank für Eure Mitteilungen.

    Ich habe nicht gedacht das es so schwierig ist einen Assemblercode auf dem Raspberry Pi auszuführen.

    Ich dachte das es so funktioniert wie z.B. mit einem Mikrocontroller (80C535, 8032 usw.)

    Dafür habe ich schon einige Programme realisiert (vor ca. 20 Jahren).

    Ist natürlich nicht mehr aktuell.

    Das Thema hat mich aber im Moment interessiert, natürlich kann ich mein Programm auch in einer anderen Sprache (Python, C, C++) realisieren.

    Die Info von dreamshader werde ich mir nun anschauen.


    MfG


    Juergen B.

  • Moin jbaben,


    dann bist du ja bestens informiert.

    Das mit dem userspace hätte mir auch einfallen müssen. Nagut...


    Falls für dich nun das Thema erledigt ist, dann, bitte, als erledigt markieren.

    Geht oben bei "Thema bearbeiten"


    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"

  • OT: Andreas : Freut mich ebenfalls, mal wieder ein Lebenszeichen von Dir zu vernehmen!

    Das Thema hat mich aber im Moment interessiert, natürlich kann ich mein Programm auch in einer anderen Sprache (Python, C, C++) realisieren.

    Ob Assembler oder C - das ist nicht der springende Punkt. Es kommt darauf an, wie die Hardware initialisiert wurde, ob Du direkt darauf zugreifen kannst oder nicht. Das geschieht sehr frühzeitig im Bootprozeß.