- Carlotta war ein Ort für Leute mit ausgeprägt einfachem Geschmack. Abends kam auf den Tisch, was man tagsüber überfahren hatte.
- -- Rigby Reardon, "Tote tragen keine Karos"
Ich plane gerade, ein neues Bankswitch-Schema für das Harmony Cartridge zu entwickeln. Das Modul besteht hauptsächlich aus einem ARM Microcontroller, den ich jetzt gerade zu programmieren versuche. Die bisherige Firmware dafür wurde mit der Entwicklungumgebung von Keil programmiert, die allerdings nur für Windows erhältlich ist. Meinen Teil möchte ich gerne mit der GNU Toolchain programmieren, um die Entwicklung unter Linux machen zu können.
Der Code besteht aus reinem ARM7TDMI Assembler, der direkt ohne ein Betriebssystem auf dem Microcontroller läuft. Eine Portierung sieht nicht so schwer aus. Mein größtes Problem ist dabei das Arbeiten mit dem Linker, für den ich ein eigenes Linker-Script entwickeln muss. Das Layout im Flash-Speicher des Microcontrollers soll so aussehen:
Startvektoren
Bootstrapcode
ROM Simulator
2600 ROM Daten
Der Bootstrapcode initialisiert den Microcontroller, kopiert den ROM Simulator ins RAM und startet diesen dann. Der holt dann bei Bedarf die Daten aus dem restlichen Speicher. Die Reihenfolge ist dadurch vorgegeben, das ein ROM-Image durch das Hintereinanderhängen von ARM Code und 2600 Code erzeugt werden soll.
Bisher habe ich folgenden Ansatz: Startvektoren und Bootstrapcode sind in einer Assemblerdatei implementiert, der ROM Simulator in einer zweiten. Das Linkerscript nimmt dann den "bootstrapcode.o" implizit mit rein, nur der "romsimulator.o" wird dem Linker auf der Kommandozeile mitgegeben. Die Fragen, ich nun zu klären habe sind folgende:
- Einige Daten, wie die Größe des ROM Simulators, die für das Kopieren ins RAM benötigt wird, und der Beginn des ROMs stehen ja erst zur Linkzeit fest. Wie bekomme ich hier den Linker und den Code verzahnt?
- Wie kann ich den ROM Simulator an eine andere Adresse linken (den Beginn des RAMs), als er später im Image steht?
- Wie bekomme ich die korrekte Startadresse des ROM Simulators im RAM so dass der Bootstrapcode in anspringen kann?
- Muss ich irgendetwas beachtet, damit der ROM Simulator die Daten nicht auch aus dem RAM hinter sich selbst lesen will?
Hier ist das, was ich mir bisher aus anderen Linkerscripts für mich übernommen habe:
MEMORY {
flash : ORIGIN = 0x00000000, LENGTH = 32K
ram : ORIGIN = 0x40000000, LENGTH = 8K
}
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
.text :
{
__start = .;
bootstrapcode.o (.text)
\*(.text*)
} > flash
. = ALIGN(4);
__image_copy_start = .;
.data : { \*(SORT_BY_ALIGNMENT(.data*)) } > ram
__image_copy_end = .;
. = ALIGN(4);
.romdata : { \*(SORT_BY_ALIGNMENT(.romdata*)) } > flash
. = ALIGN(4);
__image_copy_end = .;
_end = .;
}
Das ist nur ein Ansatz, der zeigen soll, wie ich mir das grob vorstelle, alles andere als fertig.
Kommentare