Ich frage mich gerade wie man bei einem ESP32 ohne jetzt das IDF Framework nutzen zu wollen, sondern in C auf Low Level Basis Interrupts zum laufen zu bekommen.
Im Datenblatt steht einiges zu der RISC-V Architektur und auch etwas zu den Interrupts.
Es gibt eine Tabelle "Tram Vector" dort gibt es 31 "Vektoren" für die jeweiligen Interrupts die vorher konfiguriert wurden.
Jetzt meine Frage.. Wie bekomme ich meine Funktion die ausgeführt werden soll dorthin "gemoppt"?
Kann ich meiner Funktion die ausgeführt werden soll bei dem Interrupt die Adresse des Vektors zuweisen? Oder wie ist hier die Vorgehensweise?
Ueblicherweise gehoert zu einem C-Compiler eine Runtime, In der
findet sich dann eine "startup.s" in der die Interruptvektoren
"weak" auf vordefinierte Interruptroutinen zeigen.
Will man selbst einen Interrupt bedienen, schreibt man eine
gleichnamige Funktion, die eben nicht "weak" definiert ist,
und so beim linken im Programm landet.
Das wird beim RISC-V auch nicht wesentlich anders ein...
Ueblicherweise gehoert zu einem C-Compiler eine Runtime, In der
findet sich dann eine "startup.s" in der die Interruptvektoren
"weak" auf vorderinierte Interruptroutingen zeigen.
Will man selbst einen Interrupt bedienen, schreibt man eine
gleichnamige Funktion, die eben nicht "weak" definiert ist,
und so beim linken im Programm landet.
Das wird beim RISC-V auch nicht wesentlich anders ein...
Okay. Und die im Bild zu sehenden Adressen sind dann quasi die wo die Funktionen stehen bzw. die Adressen dafür?
Und die im Bild zu sehenden Adressen sind dann quasi die wo die
Funktionen stehen bzw. die Adressen dafür?
Im Bild ist die Interruptvektortabelle zu sehen. Unter "Address" sind die Adressen aufgeführt, wo die Startadresse der aufzurufenden Interruptfunktion einzutragen ist.
Und die im Bild zu sehenden Adressen sind dann quasi die wo die
Funktionen stehen bzw. die Adressen dafür?
Im Bild ist die Interruptvektortabelle zu sehen. Unter "Address" sind
die Adressen aufgeführt, wo die Startadresse der aufzurufenden
Interruptfunktion einzutragen ist.
Das heißt unter diesen Adressen kann ich jeweils die Adresse meiner aufzurufenden Funktion schreiben?
ESP32 sind eigentlich nicht für diese bare-metal Programmierung vorgesehen. Viele Funktionen kann man mangels Doku gar nicht nutzen.
Meinst du nicht, daß ein normaler Mikrocontroller besser geeignet ist? Zum Lernen würde ich mit einem überschaubaren STM32L0 anfangen und später auf einen stärkeres Modell wechseln, falls nötig. Test-Boards findet man unter dem Namen "STM32 Nucleo".
ESP32 sind eigentlich nicht für diese bare-metal Programmierung
vorgesehen. Viele Funktionen kann man mangels Doku gar nicht nutzen.
Meinst du nicht, daß ein normaler Mikrocontroller besser geeignet ist?
Zum Lernen würde ich mit einem überschaubaren STM32L0 anfangen und
später auf einen stärkeres Modell wechseln, falls nötig. Test-Boards
findet man unter dem Namen "STM32 Nucleo".
Ja Da gebe ich Dir zu 100% recht. Diese Mikrocontroller sind wirklich nicht leicht zu bedienen (bare metal) aber es macht mir spaß zu forschen und rum zu probieren bis es funktioniert.
Angefangen habe ich mit den kleinen 8 bitlern von ATMEL.
Da man die ESP32 sau günstig bekommt, habe ich mich einfach mal da dran getraut. Vieles läuft auch schon, einiges noch nicht so ganz perfekt.
Dafür gibt es ja aber Foren wo man Hilfe bekommen kann ;)
Wenn es der Compiler uebersetzt, heisst das noch nicht, dass es
funktioniert. Du solltest dir fuer den Anfang erstmal ein kleineres
Broetchen backen.
Z.B. einen Timerinterrupt.
Und dann mit offenem Auge erkunden, was der Compiler zu welchem
Zweck wohin positioniert hat, und was es tut.
Per Default, sind die weak definierten, bereits vorhandenen
Interruptroutinen, schon mit einigermassen sinnvollen Aktionen
belegt.
P.S.:
Viele CPUs/Controller schuetzen auch solche Bereiche, und muessen
kwasi erst "entsperrt" werden, wenn man darau herumturnen will.
Ich habe mal den ganzen Projekt Ordner auf eine "*.s" durchsuchen lassen, leider findet er nur eine "x509_crt_bundle.S" dort stehen aber keine ASM Befehle.
Ich habe mal den ganzen Projekt Ordner auf eine "*.s" durchsuchen
lassen, leider findet er nur eine "x509_crt_bundle.S" dort stehen aber
keine ASM Befehle.
Ich habe jetzt doch die passende Datei gefunden. Habe sie mal mit hochgeladen.
Ich frage mich gerade wie man bei einem ESP32 ohne jetzt das IDF
Framework nutzen zu wollen, sondern in C auf Low Level Basis Interrupts
zum laufen zu bekommen.
...
Jetzt meine Frage.. Wie bekomme ich meine Funktion die ausgeführt werden
soll dorthin "gemoppt"?
Schau nach wie es das IDF macht. Mach dir eine Kanne oder zwei deines bevorzugten Heißgetränkes, stell das Telefon auf Flugmodus und die Hausklingel ab, und dann schau in den IDF-Quelltext.
Ich habe mal den ganzen Projekt Ordner auf eine "*.s" durchsuchen
lassen, leider findet er nur eine "x509_crt_bundle.S" dort stehen aber
keine ASM Befehle.
"Dein" Projektordner ist da auch die flasche Stelle zum Suchen.
Die fuer Interrupts darunterliegende Infrastruktur, stellt der
Compiler und "seine" Runtime bereit.
Da musst du suchen. :)
Etwa dort, wo der Compiler seine Libraries aufbewahrt, duerfte
sich auch der Startup-Code, und dessen Bestandteile finden lassen.