CAN-Interrupt Linker Error C167 mit Keil

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren