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!
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
Hast du es mal direkt mit 0x40 probiert, also ohne den 'Umweg' über den Header?
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?
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.
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?
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 *
entschuldigt die schlechte Formatierung, in der Vorschau sah es besser aus...
Klar gibt es die. Schau mal in den Makefile. Mit uVision geht es auch ueber die Oberfläche, habs aber gerade nicht vor mir.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.