Hallo, habe ein Problem (warum wuerde ich sonst wohl schreiben). Ich befasse mich gerade mit dem LPC2148 und moechte unbedingt mit 'vectored interrupts' arbeiten. Speziell geht es mir um die UART! Doch mir gelingt es nicht den IRQ (vectored!) zum laufen zu kriegen. Das Projekt habe ich als ZIP-Datei hinterlegt. Bisher ist es mir gelungen die UART zu Pollen und meine Eingaben per HT (Hyper Terminal) abzufangen. Somit kann die UART als Fehlerquelle ausgeschlossen werden. Nun zu meinem Projekt. Ich habe meine Projekt aus mehrere Quellen zusammengebastelt und schliesse daher nicht aus, das es einige Fehler oder fehlende Angaben betreffs 'vectored interrupt' geben kann. Im groben habe ich folgende Autoren oder Projekte integriert: - StartUpFile (P. Lynch) - MakeFile (P. Lynch, modifiziert) - CommandLinkerSkript (P.Lynch) - Main.c (P. Lynch, modifiziert) Anmerk.: P. Lynch hat keine Interrupts verwendet - Sonstige Header oder C-Files (WinARM-Projekt) Ich habe derweil schon einige Stunden Zeit investiert und habe einfach keine weitere Idee woran es liegen koennte. Es gibt zu viele Projekte in denen immer anders herangegangen wird. Deswegen komme ich auch nicht auf einen "gruenen Zweig". Es waere daher schoen, wenn ich nicht irgendeinen Batzen Quellcode vorgeschoben bekomme, der bei euch funktioniert aber meinen Quellcode obsolet macht. Ich hoffe mir kann einer helfen =) Beste Gruesse Krugman PS: Es kann sein, das ich einige unsinnige Optionen drin habe. Bitte trotzdem darauf hinweisen :)
Teile aus meinem GNU-port (sieht so aus, als sei dies mit "WinARM-Projekt" gemeint) der Philips Beispiele kann man nicht einfach so in anderen Code reinwerfen wenn Interrupts genutzt werden. Im Gegensatz zu einigen anderen Beispielen (z.B. denen von Lynch) werden in meiner Portierung die IRQ-ISRs nicht per IRQ-Vector direkt aufgerufen, sondern der IRQ-Vector zeigt auf einen Assembler-Wrapper, der seinerseit die ISR aufruft, auf die VicVectAddress verweist (siehe startup-code aus meiner Portierung). Das Ganze dient dazu, möglichst wenig im Originalcode ändern zu müssen, der für Realview bzw. den alten Keil compiler geschrieben wurde und auch die nicht wirklich in allen Lebenslagen funktionierenden function-attributes für ISRs zu vermeiden.
Ja, okay. So etwas habe ich mir auch schon gedacht. Ich kann also deinen Code nicht anwenden, da er hautpsaechlich fuer Keil und Realview geschrieben wurde. Wenn das nicht geht, wie kann ich dann fuer mein Projekt auf Interrupt Vectors zugreifen. Bzw. was muss ich noch einfuegen .. ? Muss ich auch davon ausgehen, dass ich alle Beispiele (http://ezequiel.aceto.googlepages.com/InsidersGuideToTheArm7Microcontrolle.pdf Seite 70 ff) komplett vergessen, weil dort mit Keil gearbeitet wird? Gibt es denn nirgends ein Beispiel fuer mein Problem?? Das kann doch nicht so schwer sein. Habe doch bis jetzt auch alles hinbekommen, bis auf die Interrupts .. .. aber Pollen will ich nicht. Gruss Krugman
Denis Krug wrote: > Ja, okay. So etwas habe ich mir auch schon gedacht. > Ich kann also deinen Code nicht anwenden, da er hautpsaechlich fuer Keil > und Realview geschrieben wurde. Seltsame Schlussfolgerung. "Mein Code" ist weder für Realview noch für den alten Keil Compiler sondern eine Anpassung des Originalcodes von (damals noch) Philips an GNU toolchain für ARM. Das Allermeiste im Philips-Code ist einfach nur C und compilerunabhängig, nur an einigen Stellen muss man halt die compilerspezifischen Besonderheiten beachten, v.a. bei ISRs. Ich habe versucht, eben dies in meiner Portierung zu demonstrieren, ohne dabei im Originalcode allzu viel ändern zu müssen. > Wenn das nicht geht, wie kann ich dann fuer mein Projekt auf Interrupt > Vectors zugreifen. Bzw. was muss ich noch einfuegen .. ? Interrupt-Service-Routinen richtig deklarieren/definieren. Oder - einfacher - den Assembler-Wrapper aus dem Startup-Code meiner Portierung nehmen, nachvollziehen und gegebebenfalls anpassen. > > Muss ich auch davon ausgehen, dass ich alle Beispiele > (http://ezequiel.aceto.googlepages.com/InsidersGuideToTheArm7Microcontrolle.pdf > Seite 70 ff) komplett vergessen, weil dort mit Keil gearbeitet wird? "Komplett vergessen" wäre Unsinn. Das Hitex-Buch enthält viel brauchbare Information. Eine Anpassung an GNU ist nicht so kniffig, es gibt halt kein __irq, __fiq oder wasauchimmer bei gcc, aber das lässt sich ersetzen. Genau das ist es ja, was ich im GNU-port der Philips-Beispiele gemacht habe. Z.B. hat __irq für den GNU-port keinerlei Funktion. Der GNU Compiler behandelt die Funktion wie jede andere. Die notwendigen Vor- und Nacharbeiten für eine ISR (z.B. Anpassung Rückspungaddresse, retten von ein paar Registern), die der Keil-/Realview compiler automatisch für "__irq" generiert, übernimmt bei der Portierung der Assembler-Wrapper im Startup-Assembler-Code. Es exisitiert auch ein direkter Ersatz für __irq in Form eines gcc function-attributes (vgl. manual auf gcc.gnu.org) aber das funktioniert nicht unter allen Bedingungen problemlos. > Gibt es denn nirgends ein Beispiel fuer mein Problem?? Das kann doch > nicht so schwer sein. Habe doch bis jetzt auch alles hinbekommen, bis > auf die Interrupts .. Ja, mehrere. Z.B. müsste ein Beispiel in meinem GNU-port des Philips-codes enthalten sein. Aber wie wäre es damit, erstmal nachzuvollziehen auf welchem Weg beim Code von Lynch (den ich kaum kenne) und bei meinem GNU-Port des Philips-Codes der Controller in die ISR "findet". > .. aber Pollen will ich nicht. Muss man ja auch nicht, aber irgendwo gefundenen Code ohne Umsicht zusammenzuwerfen "will" man auch nicht.
Hallo Martin, danke fuer diese ausfuehrliche Antwort. Damit hast du geholfen ein wenig Licht ins Dunkel zu bringen. Keil & Co sind halt die Compiler und ich muss gucken was der jeweile Compiler kann und was nicht. Korrekt? Wenn du das ganze schon gemacht hast, dann brauch ich erstmal nur deinen Code nachzuvollziehen. Gut. Weil es fuer mich schwer war zu differenzieren, welcher Code fuer wen gut ist und welchen ich brauche. Zu deinem Code (StartUpFile): Du hast nur das Startupfile angepasst, um keine tieferen Aenderungen der Beispiele von Phillips vorzunehmen. Ich fand dein Startupfile aber ziemlich voll und teilweise hatte ich den Eindruck, das du einige Funktionen im Assembler programmiert hast anstatt mit C. Das macht mir noch ein wenig Kopfschmerz. Vielleicht hab ich das auch noch nicht so durchschaut. (Assembler versuche ich moeglichst zu vermeiden, da ich bis jetzt nur mit C Erfahrung gemacht habe) Gut, ich mach mich dann mal wieder an die Arbeit. Gruss Krugman
Hi. Habe das StartupFile und das CommandlinkerFile in mein Projekt implementiert. Das CLF habe ich nicht veraendert. Das SUF wurde von mir so angepasst, das PLL, MAM und VPBDIV auskommentiert wurden. Diese habe ich ja schon in meiner C-Funktion installiert. Meine Frage ist jetzt, wie schaut es mit dem MakeFile aus? Muss ich noch irgendwas implementieren? Oder kann ich das zur Not auch in das SUF hineinschreiben? Gruss Krugman
Wenn du es dir einfach machen willst, nimm doch was richtiges ;-). Schau mal bei www.segger.com auf die Website. Die Firma Segger macht Embedded Betriebssysteme und andere Middleware. Dort kannst du auch Trialversionen runterladen. Unter anderem halt auch für ARM und Yagarto. Und da ist dann schon ein Startprojekt für den LPC2148 mit dabei. Komplett mit Uart Initialisierung über Interrupts, usw. Und ganz nebenbei hast du direkt ein Betriebssystem auf deinem Board am laufen ;-). Lad dir das einfach mal unter http://segger.com/cpuarm_gnu.html runter.
Okay. Ich guck mir das mal an =) Danke!
Also das mit dem embOS is ziemlich unuebersichtlich und fuer mich nicht nachvollziehbar. Habe jetzt den Interrupt mit Martin T. seinem SUF + CLF und meinem MF zum laufen gebracht. Ich habe allerdings ein Problem... wenn er aus dem Interrupt rausspringt, dann geht er in den Resethandler bzw. startet das Programm neu. Sicherlich ist die Ruecksprungadresse falsch bzw. ich hab wieder irgendwas nicht drin was ihr drin habt. Waere nett, wenn einer mal drueberschauen koennte!! Dank im vorraus! Gruss Krugman PS: Martin T. sein MAKEFILE geht bei mir nicht. Gibt diverse Fehlermeldungen, deswegen habe ich es mit meinem probiert.
Immer noch zusammengewürfelt. Im Startup-Code ist ein Assembler-Wrapper für IRQ-ISRs, warum dann weiterhin das einstreuen von function-attributes? Ohne Details zu "diversen Fehlermeldungen" kann ich nicht betr. makefile nicht weiterhelfen. Mglw. fehlen ein paar Hilfsprogramme, die ich dem WinARM-Packet beilegen, bei anderen Packeten aber mglw. nicht enthalten stin.
Hallo Martin, ich weiß nicht was du mit 'function attributes' meinst. Ich verwende momentan: - Ein "Custom" Makefile - Linker Command File (von dir) - StartUp File (auch von dir) Wenn ich dein MakeFile nutze, dann sagt er mir, das er kein Thumbmode im Startcode ausführen kann. (Kopiere ich morgen auf Arbeit) Desweiteren gibt es eine Fehlermeldung in dem StartUpFile. (siehe CodeZeile)
1 | // Enter the C code
|
2 | //LDR R0,=INIT */
|
3 | LDR R0,=main |
4 | hier->TST R0,#1 // Bit-0 set: main is Thumb |
5 | hier->LDREQ LR,=__exit_ARM // ARM Mode |
6 | hier->LDRNE LR,=__exit_THUMB // Thumb Mode |
7 | BX R0 |
Obwohl die Funktionen dafür eigentlich da sind .. kann damit nix anfangen. Fehlermeldung weiß ich auch nich aus dem Kopf. Reiche ich morgen nach. Gruß Krugman
Hallo, Er meint z.B. diese Code-Zeile:
1 | void UART1Handler(void) __attribute__ ((interrupt("IRQ"))); // Interrupt-Handler |
Die sollte so aussehen:
1 | void UART1Handler(void); // Interrupt-Handler |
Denn das ganze drum herum soll nicht der Compiler machen, sondern diese Assembler-Routine crt.s >> "__IRQ_Wrapper:"
Hey, es funktioniert! Habe den '__attribute__ ((interrupt("IRQ")))' entfernt und neu kompiliert und schwubbs - es ging =)) Ich kann es nicht fassen!! Danke Martin & Co! Jetzt werd ich noch gucken, ob man auch 'pended interrupts' abarbeiten kann. Also wenn ich quasi 2 UART's habe und bei einer eine 10 Sekunden Pause einfuege, dann auf der anderen einen Interrupt setze. (Ohne Nested Interrupts) Theoretisch sollten der ausstehende Interrupt abgearbeitet werden. Ich muss ja per Hand immer den Interrupt 'clearen'. Beste Gruesse Krugman
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.