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.
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
LDRR0,=main
4
hier->TSTR0,#1// Bit-0 set: main is Thumb
5
hier->LDREQLR,=__exit_ARM// ARM Mode
6
hier->LDRNELR,=__exit_THUMB// Thumb Mode
7
BXR0
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
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