Forum: Mikrocontroller und Digitale Elektronik uController - LPC2148 - Vectored Interrupts - OCD - YagartoIDE


von Denis K. (krugman)


Angehängte Dateien:

Lesenswert?

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 :)

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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.

von Denis K. (krugman)


Lesenswert?

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

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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.

von Denis K. (krugman)


Lesenswert?

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

von Denis K. (krugman)


Lesenswert?

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

von Til (Gast)


Lesenswert?

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.

von Denis K. (krugman)


Lesenswert?

Okay.

Ich guck mir das mal an =)

Danke!

von Denis K. (krugman)


Angehängte Dateien:

Lesenswert?

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.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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.

von Krugman (Gast)


Lesenswert?

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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

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:"

von Denis K. (krugman)


Lesenswert?

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
Noch kein Account? Hier anmelden.