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


von Gast (Gast)


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!

von Gast (Gast)


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

von Michi (Gast)


Lesenswert?

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

von jochen64 (Gast)


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?

von ... (Gast)


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.

von Jochen.L. (Gast)


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?

von Gast (Gast)


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 *

von Gast (Gast)


Lesenswert?

entschuldigt die schlechte Formatierung, in der Vorschau sah es besser 
aus...

von Agro_ (Gast)


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.

von Gast (Gast)


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'...

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.