So verhindern Sie, dass CodeVision den Interrupt-Vektor generiert

CodeVision hat viele nette Features, darunter die automatische Generierung des Interrupt-Vektors.

Allerdings arbeite ich jetzt an einem sehr kleinen Bootloader und kann mir keine Interrupts leisten. CodeVision generiert den Interrupt-Vektor immer noch gerne am Anfang des Flash-Speichers, und ich konnte keine Möglichkeit finden, ihn auszuschalten.

Er ist entscheidend, da der Interrupt-Vektor beim kleinsten Bootloader 25 % des Platzes im Flash-Speicher einnehmen würde. (Bootloader mit 128 Wörtern, und der Interrupt-Vektor benötigt 32 Wörter für einen 16k-Atmega)

Ich setze "Externe Startup-Initialisierungsdatei verwenden" und verwende meine eigene startup.asm. Auch wenn ich nichts über die Interrupt-Vektoren einfüge, werden sie dennoch für die ausführbare Datei generiert.

Können Sie Ihren Startcode und Ihre Konfiguration hier einfügen?
Selbst wenn ich meine startup.asm komplett leer habe und (für den Test) keine Initialisierung für irgendetwas (Ports, Timer, Interrupts usw.) habe, wird der Interrupt-Vektor immer noch vom Compiler generiert. void main(){}Tatsächlich erzeugt eine vollständig leere startup.asm und eine Hauptquelldatei, die nur noch enthält, die Interrupt-Vektoren. In der Projektkonfiguration konnte ich nichts Relevantes finden und habe bei Google nach möglichen #pragmaEinstellungen gesucht, bisher erfolglos.
Wie ist Ihre Codegenerierungskonfiguration? Haben Sie den Programmtyp als „Anwendung“ oder „Bootloader“ angegeben?
Bootloader, aber es passiert mit beiden.
Haben Sie diese FAQ gesehen ? Ich denke, es ist eher gcc-spezifisch, aber es könnte eine Lektüre wert sein, insbesondere Nr. 18.
Ja, ich habe diese FAQ gesehen, aber sie hat nichts damit zu tun, diesen speziellen Compiler so einzurichten, dass er den Reset-Vektor nicht generiert. Vielleicht könnte ich den Verknüpfungsprozess irgendwie kapern ...?
Dann präzisieren Sie bitte Ihre Frage. Welche Interrupt-Vektoren möchten Sie entfernen? Die im Bootloader-Bereich, richtig? Unter der Annahme, dass der Compiler selbst nichts dagegen tun kann, außer eine Vektortabelle zu generieren, warum nicht ein Linker-Skript oder ähnliches verwenden, wie in der genannten FAQ beschrieben, um den Linker die unerwünschten und unbenutzten Abschnitte entfernen zu lassen?
Weil CodeVision dafür nicht flexibel genug ist. Ich kann nicht einmal nur den Linker alleine ausführen. Zumindest ist es großzügig genug, mir eine asm-Datei zur Verfügung zu stellen, nicht nur ein Hex, also kann ich einfach das generierte asm nehmen, den Reset-Vektor manuell entfernen und DAS dann mit einem anderen Compiler kompilieren, aber dann könnte ich es genauso gut verwenden ein anderer Compiler für das Ganze.

Antworten (2)

Um einen ganzen Abschnitt wie diesen zu entfernen, müssen Sie im Allgemeinen ein benutzerdefiniertes Linker-Skript verwenden, und Sie müssen möglicherweise einen Teil des Startcodes hinter den Kulissen ändern oder entfernen, den Compiler normalerweise einwerfen. Obwohl Sie es für einen Bootloader mit 128 Wörtern sein können besser gedient, es in Assembler zu schreiben.

Ich weiss. Dies wurde in den Kommentaren diskutiert. Die Frage ist, wie genau das geht, da ich im erwähnten Compiler keinen Weg dafür finden konnte. Und wenn ich alles in Assembly schreibe, muss ich es immer noch in Maschinencode kompilieren.

Die CodeVision Advanced (kostet 50 € mehr als die Standardversion) hat eine Option dafür im Menü Project|Configure|C Compiler|Advanced.