www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CAN-Interrupt Linker Error C167 mit Keil


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe zu einem bestehenden Programm den CAN-Bus hinzugefügt, 
kompiliert auch alles ohne Fehler, nur wenn ich dann die ISR hinzufüge 
bekomme ich die Fehlermeldung (warning):

*** WARNING 5: SECTION LOCATED OUTSIDE CLASS AREA
    SECTION: ?C_STARTUP_CODE
    CLASS:   ICODE

mein Aufruf (also von DaVE):

void CAN_viIsr(void) interrupt XP0INT
{
// habe den Code zur Fehlersuche komplett auskommentiert
}

XPOINT ist im Header mit 0x40 definiert, wenn ich -unsinniger Weise- 
interrupt 0x10 angebe klappt es auch ohne Probleme, aber ist ja der 
falsche Vektor. CAN wird auch initialisiert und anschliessend die 
Interrupts enabled.

Hat jemand evtl. ne Ahnung, was ich falsch gemacht habe bzw übersehen 
habe?

Vielen Dank!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls es hilft, folgende Interrupts sind außerdem in Gebrauch:

interrupt 0x02
interrupt 0x04
interrupt 0x06
interrupt 0x0A
interrupt 0x20 using Intregs0
interrupt 0x21
interrupt 0x23
interrupt 0x26 using Intregs6
interrupt 0x28 using IntregsAD
interrupt 0x29

Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du es mal direkt mit 0x40 probiert, also ohne den 'Umweg' über den 
Header?

Autor: jochen64 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du schon mal mit den Speichermodellen experimentiert?
Ist bei mir schon 'ne Weile her, aber ich glaube ICODE steht für 
"interner Code Speicher", und der ist vielleicht zu klein.
Es gibt bei den Linker Options Einstellungen dafür, wie man seinen 
Adressraum in Klassen einteilen will.
Vielleicht hilft es auch, die Interrupt Routine "far" zu definieren, um 
Platz im internen Code Speicher frei zu machen. Reicht dein Code 
Speicher überhaut aus? Hast du externen Speicher dran?

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank erstmal für die Antworten!

>Hast du es mal direkt mit 0x40 probiert, also ohne den 'Umweg' über den
>Header?

Ja,das macht keinen Unterschied


>Hast du schon mal mit den Speichermodellen experimentiert?
>Ist bei mir schon 'ne Weile her, aber ich glaube ICODE steht für
>"interner Code Speicher", und der ist vielleicht zu klein.
>Es gibt bei den Linker Options Einstellungen dafür, wie man seinen
>Adressraum in Klassen einteilen will.
>Vielleicht hilft es auch, die Interrupt Routine "far" zu definieren, um
>Platz im internen Code Speicher frei zu machen. Reicht dein Code
>Speicher überhaut aus? Hast du externen Speicher dran

Also in der Linkerfile werden die erste 512 Byte frei gelassen für die 
Interrupts danach folgen mit ICODE weitere Einteilungen. Aber ich glaube 
die 512 reichen doch, da dort doch nur an die entsprechende Stelle (in 
meinem Fall 0x40) die Sprungadresse eingetragen wird, wo die ISR steht, 
oder liege ich da falsch? Ansonsten denke ich der Speicher reicht aus. 
In meinem Code braucht die ISR ja kaum Speicher, ist ja ein leerer 
Funktionsaufruf. Aber das mit dem far Aufruf probiere ich mal, habe auch 
noch externen Speicher zu Verfügung.

Autor: Jochen.L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ansonsten schau mal ob es ein MAP-File gibt (heisst glaub ich M66). Wenn 
es wegen des Linker-Fehlers nicht erzeugt wird, dann schmeiss erst mal 
testweise die Teile aus deinem Code raus, die das Linken verhindern und 
schau dir dann das MAP-File an. Ist da noch Platz an der Stelle, wo 
deine ISR hin soll?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal Danke Jochen! Habe nun mal mit far probiert, gibt leider keine 
Änderung. Jetzt habe ich mir mal die .M66 angeschaut und musste 
feststellen, dass dort tatsächlich ein Eintrag vorhanden ist, wo 
eigentlich die ISR rein müsste (also bei 0x40). Da ich aber doch den CAN 
initialisiere, verstehe ich nicht, wieso der Compiler dort etwas anderes 
reinschreibt. Platz ist auch noch genug vorhanden (sogar intern). Gibt 
es eine Möglichkeit CLRMEMSEC zu verschieben?

-- Auszug aus der .M66 --
000000H   000003H   000004H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *
000008H   00000BH   000004H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *
000010H   000013H   000004H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *
000018H   00001BH   000004H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *
000028H   00002BH   000004H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *
00002CH   000039H   00000EH   HDATA WORD   ---  ---  GLOB  --- 
?C_INITSEC
00003AH   00006BH   000032H   CONST WORD   ---  ---  PRIV  --- 
?C_CLRMEMSEC
000080H   000087H   000008H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *
00008CH   00008FH   000004H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *
000098H   00009BH   000004H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *
0000A0H   0000AFH   000010H   ---   --- ---  ---  ---   * INTVECTOR 
TABLE *

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
entschuldigt die schlechte Formatierung, in der Vorschau sah es besser 
aus...

Autor: Agro_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar gibt es die. Schau mal in den Makefile. Mit uVision geht es auch 
ueber die Oberfläche, habs aber gerade nicht vor mir.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten, habe jetzt in der Linkerfile ICODE im Speicher 
verschoben, jetzt compiliert es ohne Fehlermeldung. Ich hoffe mal ich 
habe damit nichts 'kaputt gemacht'...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.