Monitorprogramm Bamo128

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Burkhart Holznagel
Diskussionsforum in: http://www.mikrocontroller.net/topic/206704#2041796

"When I was your age, we had 8 bit CPUs and assembler! And we liked it! And we didn't complain!"
above is "cut -> copy -> paste -> modify" from http://www.ethernut.de/en

Einleitung

Bamo128 ist ein residentes Monitorprogramm (ein rudimentäres Betriebssystem) für AVR8 Controller. Es wurde im Rahmen meiner Lehrtätigkeit Mikroprozessortechnik/Embedded Systems an der HWR-Berlin unter Mitarbeit vieler Studenten entwickelt. Es ist ein reines Assemblerprojekt, entwickelt unter Linux mit GNU-Tools. Deren letzte stabile Versionen von Compiler, Linker, Assembler usw. findet man gegenwärtig u.a. unter http://www.atmel.no/beta_ware/ versteckt in AVR32Studio.

Bamo128 belegt 4K Worte (8 KByte) Flash-Programm-Speicher, vorteilhafterweise in der Boot-Sektion und 256 Byte des SRAMs. Die Fuses-Bits des Controllers sollte man so programmieren, daß nach Reset mit der Programmabarbeitung im Monitor gestartet wird.

Installation

Die letzte Version von bamo128 kann unter http://bamo128.googlecode.com heruntergeladen werden. Die Installation soll beispielhaft an einem arduinoMega Board (atmega1280) erläutert werden. Im Makefile muß der Pfad zu den GNU-Tools angepasst werden (hier wurde avr32studio in /opt/cross entpackt):
# binary tools in avr32studio !!
BBINDIR = /opt/cross/as4e-ide/plugins/com.atmel.avr.toolchains.linux.x86*/os/linux/x86_64/bin/ Der Monitor wird jetzt mit einem geeigneten Programmer in den Controller "gebrannt". Wir nutzen den AVRISPmkII, für andere Programmierer muß der Makefile entsprechend angepasst werden. Das Board wird über USB mit dem Programmierer und dem PC und mit einem weiteren USB Kabel (vorerst nur zur Stromversorgung) das Megaboard mit dem PC verbunden:
#> make all am
in einer Shell erzeugt das Monitorprogramm und lädt es in den AVR8 Controller.
#> make fuses am
setzt die Fuses ( 4K Word boot section, start after reset in boot section). (Selbstverständlich kann man alles wieder mit der Arduino Entwicklungsumgebung rückgängig machen, aber wer will das noch, wenn er den Monitor getestet hat :-) ). Jetzt kann der Programmer entfernt werden (nur noch die serielle Verbindung (USB), welche auch die Spannungsversorgung bereitstellt) und man kann schon mit dem Terminal (Serial Monitor - 57600 baud) der ArduinoIDE Bamo128 testen. Besser gehts mit minikermit in der an Arduinos angepassten Version arduinokermit http://minikermit.googlecode.com. arduinokermitV**.tar.gz entpacken und unter Linux mit:
#> g++ arduinokermit.c -lncurses -oarduinokermit
das Terminalprogramm übersetzen und starten in einer Shell:
#>./arduinokermit

Funktionen

In mainloop.asm wird u.a. das Promptzeichen ausgegeben, auf ein Eingabekommando vom Terminal gewartet und dieses ausgeführt. 'a' - zeigt Entwickler an (die Liste wurde aus Platzgründen gekürzt) die 4K werden vom Monitor voll ausgenutzt
'h' - Hilfe
'm' - Ram anzeigen/modifizieren
'e' - eeprom anzeigen/modifizieren
'f' - flash anzeigen
'r' - Register/Flags anzeigen/modifizieren ('R')
'w' - Bin-File (übersetztes Programm) laden auf Flashadresse 0
'W' - Bin-File laden auf eine angebbare Flashadresse
'S' - Data-File laden auf eine angebbare Ramadresse
'E' - Data-File laden auf eine angebbare EEPROMadresse
Die Ladekommandos arbeiten zusammen mit arduinokermit nach dem Stk500V1 Protokoll,welches auch die arduinoIDE benutzt. Mit bamo128 können auch C/C++/ASM-Programme ohne arduinokermit (mit der ArdinoIDE oder avrdude mit der Option -carduino, http://www.mikrocontroller.net/articles/AVRDUDE) über die serielle Schnittstelle (USB) geladen werden. Dazu kann Bamo128 das SW-Reset der externen Programmier-SW auswerten! Man kann also auch wie mit dem Original-Bootloader des ArduinoMega über die IDE Sketch-SW auf den Controller laden!!
'g' - Start eine Programms auf Adresse.
's' - Step-Betrieb ab Adresse (realisiert mit Timer-Interrupt)
'x' - Programmabarbeitung bis Breakpoint (realisiert mit Timer-Interrupt)
'b' - Breakpoints setzen/löschen
'u' - Disassemblieren ab Adresse
'c' - Kopieren RAM/RAM, RAM/FLASH, FLASH/RAM, RAM/EEPROM, EEPROM/RAM, EEPROM/EEPROM

Wie mit einem Betriebssystem, lassen sich Monitorfunktionen (der Monitor bleibt ja im Controller, während die Anwendung läuft) bequem vom C/C++/ASM-Anwenderprogramm nutzen. Dazu gibt es mehrere Möglichkeiten, die später hier diskutiert werden können. Wichtig dafür ist die Jumptabelle am Anfang des Monitors.

Getestete Plattformen

Der Monitor läßt sich auf/abrüsten und an eine Vielzahl von AVR8 Prozessoren und Boards anpassen. Wir haben ihn mit dem Board CharonII (atmega128 mit 32 KByte externem RAM), dem Mica2 (atmega128), den arduinoMega (atmega1280) und den arduinoDuemilanove (atmega328p) getestet. Der atmega328p hat nur eine 2KWord Bootsection (0x3800 - 0x3FFF), deswegen wurde hier der Beginn des Monitors auf 0x3000 gelegt und auf der Adresse 0x3800 (Startadresse nach Reset) im Monitor ein Sprung zu 0x3000 eingebaut (besser "eingebastelt", weil wohl der Linker mit mehreren Codesegmenten auf festen vorgegebenen Adressen nicht richtig klar kommt!). Die Anpassung an andere AVR8 Prozessoren ist nicht aufwändig. Dazu müssen im Wesentlichen die Makros in den board/prozessorspezifischen Files (arduinomegadefines.h, arduinomegaivtab.asm,...) angepaßt werden.

Downloads