CAN-Interrupt Linker Error C167 mit Keil

Gast #1456572
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!
Gast #1456652
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
Gast #1457079
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?
Gast #1457643
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.
Gast #1458159
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?
Gast #1460010
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 *
Gast #1460935
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.