From 68da5e7e84fb2987bfbcb692b6b0d8e0dd75d39a Mon Sep 17 00:00:00 2001 From: Ilya Elenskiy Date: Sun, 18 Apr 2021 22:50:40 +0200 Subject: [PATCH] Bootloader actually checking for joystick, docs on debugging --- Firmware/README.md | 74 ++++++++++++++++++++++------ Firmware/boards/emgdmm_v3.json | 2 +- Firmware/boards/optiboot_atmega1284p.hex | 55 --------------------- Firmware/boards/optiboot_atmega1284p_dmm.hex | 55 +++++++++++++++++++++ 4 files changed, 114 insertions(+), 72 deletions(-) delete mode 100644 Firmware/boards/optiboot_atmega1284p.hex create mode 100644 Firmware/boards/optiboot_atmega1284p_dmm.hex diff --git a/Firmware/README.md b/Firmware/README.md index 5bae235..3d8a871 100644 --- a/Firmware/README.md +++ b/Firmware/README.md @@ -41,13 +41,21 @@ $ git clone git@teach.emg.ing.tu-bs.de:dmm/dmm-demo.git $ cd dmm-demo ``` -Es sind zwei PlatformIO-Environments definiert. `release` wird standardmäßig -genutzt und ist auf die Programmierung per Bootloader ausgelegt. `debug` wird -für das Aufspielen des Bootloaders oder Debugging mittels JTAGICE3 genutzt. +Es sind dre PlatformIO-Environments definiert: + * `release` wird standardmäßig +genutzt und ist auf die Programmierung per Bootloader ausgelegt. + * `debug` wird +für das Debugging mittels avr-stub genutzt. + * `jtag` wird zum Aufspielen des Bootloaders mittels externem +JTAGICE3 Programmer genutzt. + +> **In `debug` darf daher kein UART genutzt werden, da es zur Kommunikation mit +> GDB dient**. Entsprechende Programmteile müssen gegebenenfalls mit +>`#ifndef GDBSTUB` deaktiviert werden! Bauen von `release`: ``` -$ pio run +$ pio run -e release ``` Bauen von `debug`: @@ -55,39 +63,42 @@ Bauen von `debug`: $ pio run -e debug ``` +Wenn man `-e ` weglässt, wird immer `debug` gebaut, da dies die +Standartkonfiguration ist, die von dem Debugger von VSCode genutzt werden soll. -Dabei werden neben der Toolchain automatisch die für DMM-Projekte vorgesehenen -[Bibliotheken](https://teach.emg.ing.tu-bs.de/git/dmm/dmm-libs) in den Ordner -`dmm-demo/depends` heruntergeladen. +Die für die DMM-Projekte vorgesehenen +[Bibliotheken](https://teach.emg.ing.tu-bs.de/git/dmm/dmm-libs) sowie die +Toolchain werden durch `pio run` automatisch heruntergeladen und müssen nicht +extra installiert werden. Die Bibliotheken werden dabei im Ordner +`dmm-demo/depends` hinterlegt. ### Programmierung & Nutzung -*GUI*: die aufgeführten Befehle können auch aus dem PlatformIO-Toolbar des -VSCode per Mausklick ausgeführt werden. - +*GUI*: die hier aufgeführten Befehle können auch aus dem PlatformIO-Toolbar des +VSCode per Mausklick ausgeführt werden. #### Aufspielen des Bootloaders Auf einem neuen Board muss zunächst mittels JTAGICE3 ein Bootloader aufgespielt werden. Dazu wird es mit dem JTAG-Header verbunden (Polung beachten!). ``` -$ pio run -t bootloader -e debug +$ pio run -t bootloader -e jtag ``` > Sollte es beim Aufruf zum Fehler `TypeError: expected str, bytes or > os.PathLike object, not NoneType ... > join(platform.get_package_dir("tool-avrdude"), "avrdude.conf")` > kommen, kann dieser durch einmaliges Aufrufen von ->`$ pio run -t program -e debug` ->vor der Installation des Bootloaders behoben werden. +> `$ pio run -t program -e debug` +> vor der Installation des Bootloaders behoben werden. #### Aufspielen des Programms Das Board muss per USB verbunden und Bootloader gestarted werden. *Zum Start des Bootloaders den Joystick in Richtung unten halten, Reset-Taste drücken und den Joystick loslassen. Die Aktivierung des Bootloaders erkennt man -an zwei leuchtenden roten LEDs auf dem Board* +an dreimaligem Blinken und anschließendem Dauerleuchten der LED4 auf dem Board*. ``` -$ pio run -t upload +$ pio run -e release -t upload ``` Anschließend Reset-Taste drücken um das Programm zu starten. @@ -105,7 +116,7 @@ $ pio device monitor Beim Drücken des Joystick im entsprechenden Teil des Demos wird nun eine Meldung angezeigt. -### Unit-Test +#### Unit-Test Die Demo enthält im Ordner `tests` einen Beispiel zur Ausführung von Unit-Tests auf dem Mikrocontroller. Dazu muss wie oben beschrieben der Bootloader aktiviert @@ -117,3 +128,34 @@ Nach dem Befehl wird eine Firmware auf das Board heruntergeladen, die bei der Ausführung per UART (wie auch bei `pio device monitor`) die Ergebnisse der Tests im Terminal ausgibt. +#### Debugging mit avr-stub + +Normallerweise ist zum Debuggen (also Setzen von Breakpoints und Auslesen der +Register) ein JTAG-Adapter notwendig. PlattformIO kann +mittels einer [Bibliothek](https://github.com/jdolinay/avr_debug) die Funktion +der Hardware-Debugger unter Inkaufnahme einiger Nachteile teilweise ersetzen. +Die Kommunikation erfolgt dabei per UART, der nicht mehr im eigenen Programm +genutzt werden kann. +Die Konfiguration `debug` bindet die nötige Bibliothek ein, und schaltet +Optimierung über das Setzen von `build_type` aus und definiert `GDBSTUB`. Am +Anfang des programms muss `debug_init()` aus `avr8-stub.h` aufgerufen werden. + +Debugging wird in VScode mittels "Run & Debug" Tab gestartet. Vorher muss +der Bootloader aktiv sein. + +Zu beachten ist: + * Beakpoints funktionieren nur in Programmteilen, wo Interrupts aktiviert + sind. **Das setzen eines Breakpoints innerhalb einer Interruptroutine führt + immer zum Aufhängen des Programms**. + * Breakpoints werden über das Neuschreiben von Flash gesetzt. Dies hat einen + Verschleiß zufolge, da der Flash nur für 10000 Schreibzyklen ausgelegt ist. + Das "Steppen" einzelner Befehle ist daher sparsam zu verwenden. + * Debugger nutzt das Watchdog-Interrupt, daher darf WDT nicht vom Programm + genutzt werden. Außerdem können die gelegentlichen Interrupts die Timings + beeinflussen. + +> **TODO:** aktuell muss der Port des Debuggers manuell in `platformio.ini` +> unter `debug_port` gesetzt werden! +> (z.B. `/dev/ttyUSBx` unter Linux oder `COMx` unter Windows). +> Für automatisches Auflösen des Ports siehe +> [Issue 253](https://github.com/platformio/platform-atmelavr/issues/253). \ No newline at end of file diff --git a/Firmware/boards/emgdmm_v3.json b/Firmware/boards/emgdmm_v3.json index d3359a5..ab9fb0d 100644 --- a/Firmware/boards/emgdmm_v3.json +++ b/Firmware/boards/emgdmm_v3.json @@ -20,7 +20,7 @@ "require_upload_port": true }, "bootloader": { - "file": "boards/optiboot_atmega1284p.hex", + "file": "boards/optiboot_atmega1284p_dmm.hex", "lfuse": "0xFF", "hfuse": "0x9C", "efuse": "0xFC", diff --git a/Firmware/boards/optiboot_atmega1284p.hex b/Firmware/boards/optiboot_atmega1284p.hex deleted file mode 100644 index 9378ba7..0000000 --- a/Firmware/boards/optiboot_atmega1284p.hex +++ /dev/null @@ -1,55 +0,0 @@ -:020000021000EC -:10FC000001C01BC1112484B7882369F0982F9A7012 -:10FC1000923049F081FF02C097EF94BF282E80E018 -:10FC2000F7D00C94000085E08093810082E08093FF -:10FC3000C00088E18093C10086E08093C20080E12B -:10FC40008093C4008EE0E4D0239A86E020E33CEF6A -:10FC500091E0309385002093840096BBB09BFECF4B -:10FC60001B9AA8954091C00047FD02C0815089F7BA -:10FC700043E0B42EAA24A39451E1752EBDD0813463 -:10FC800071F4BAD0C82FCAD081E0C23821F088E020 -:10FC9000C13809F083E0A9D080E1A7D0EFCF82344A -:10FCA00019F484E1C3D0F8CF853411F485E0FACF9C -:10FCB000853581F4A1D0082F9FD0182F87FF07C06A -:10FCC0008BB781608BBF000F111FA8D0E5CF8BB71A -:10FCD0008E7FF8CF863581F48FD08D3459F48CD057 -:10FCE000CBB78AD0C170880F8C2B8BBF81E09ED0A0 -:10FCF00080E0D1CF83E0FBCF843609F046C07CD0D2 -:10FD0000E82EF12CFE2CEE2477D0E82A75D0682E50 -:10FD1000E701C12CDD24D39446018FEFC81AD80A1D -:10FD20006BD0F40180832197B9F778D0F5E46F1296 -:10FD30000DC0FE01F395EC16FD0609F4ADCF608110 -:10FD4000CE01800F911F91D02196F3CFF801B7BE5D -:10FD5000E89507B600FCFDCFFE01E00FF11FDE01C4 -:10FD6000B3958D919C910C01A7BEE8951124229624 -:10FD7000EC16FD0689F785E0F80187BFE89507B620 -:10FD800000FCFDCF77BEE89587CF8437F9F434D0F7 -:10FD9000C82FD0E0DC2FCC272FD0C82B2DD0D82EC9 -:10FDA0003DD07801F5E4DF120AC0C70156D01DD05E -:10FDB00021978FEFE81AF80A2097B9F76DCFF7016E -:10FDC00087917F0112D02197D1F766CF853739F41B -:10FDD00025D08EE10AD087E908D085E05CCF813557 -:10FDE00009F073CF88E014D070CF9091C00095FFD8 -:10FDF000FCCF8093C60008958091C00087FFFCCFA0 -:10FE00008091C00084FD01C0A8958091C60008952E -:10FE1000E0E6F0E098E1908380830895EDDF8032A2 -:10FE200019F088E0F5DFFFCF84E1DFCFCF93C82F53 -:10FE3000E3DFC150E9F7CF91F1CFFC010A0167BFC1 -:10FE4000E895112407B600FCFDCF667029F0452B1C -:10FE500019F481E187BFE8950895F999FECF92BD25 -:10FE600081BDF89A992780B50895262FF999FECF7C -:10FE70001FBA92BD81BD20BD0FB6F894FA9AF99AC7 -:10FE80000FBE0196089556657273696F6E3D382EE8 -:10FE900031004F505449424F4F545F435553544FD4 -:10FEA0004D5645523D30004465766963653D617449 -:10FEB0006D656761313238347000465F4350553D9F -:10FEC00031363030303030304C00424947424F4FAD -:10FED000543D31004275696C743A4170722031387A -:10FEE00020323032313A31343A32343A35330055F7 -:10FEF0004152543D3000424155445F524154453DCA -:10FF0000313135323030004C45443D4233004C45B0 -:10FF1000445F53544152545F464C41534845533D0E -:02FF20003300AC -:02FFFE000108F8 -:040000031000FC00ED -:00000001FF diff --git a/Firmware/boards/optiboot_atmega1284p_dmm.hex b/Firmware/boards/optiboot_atmega1284p_dmm.hex new file mode 100644 index 0000000..80ab0b3 --- /dev/null +++ b/Firmware/boards/optiboot_atmega1284p_dmm.hex @@ -0,0 +1,55 @@ +:020000021000EC +:10FC000001C020C1112484B7882391F00E98169A60 +:10FC100090B1282F2A70223011F496FF09C081FF7D +:10FC200002C097EF94BF282E80E0F7D00C9400001C +:10FC300085E08093810082E08093C00088E180931A +:10FC4000C10086E08093C20080E18093C40080E020 +:10FC5000E4D0239A86E020E33CEF91E030938500E6 +:10FC60002093840096BBB09BFECF1B9AA895409131 +:10FC7000C00047FD02C0815089F743E0B42EAA249A +:10FC8000A39451E1752EBDD0813471F4BAD0C82F40 +:10FC9000CAD081E0C23821F088E0C13809F083E0A1 +:10FCA000A9D080E1A7D0EFCF823419F484E1C3D08A +:10FCB000F8CF853411F485E0FACF853581F4A1D0F1 +:10FCC000082F9FD0182F87FF07C08BB781608BBF8D +:10FCD000000F111FA8D0E5CF8BB78E7FF8CF8635E8 +:10FCE00081F48FD08D3459F48CD0CBB78AD0C170C9 +:10FCF000880F8C2B8BBF81E09ED080E0D1CF83E03A +:10FD0000FBCF843609F046C07CD0E82EF12CFE2CC7 +:10FD1000EE2477D0E82A75D0682EE701C12CDD24C7 +:10FD2000D39446018FEFC81AD80A6BD0F4018083B0 +:10FD30002197B9F778D0F5E46F120DC0FE01F39565 +:10FD4000EC16FD0609F4ADCF6081CE01800F911F46 +:10FD500091D02196F3CFF801B7BEE89507B600FC25 +:10FD6000FDCFFE01E00FF11FDE01B3958D919C9157 +:10FD70000C01A7BEE89511242296EC16FD0689F722 +:10FD800085E0F80187BFE89507B600FCFDCF77BE98 +:10FD9000E89587CF8437F9F434D0C82FD0E0DC2F32 +:10FDA000CC272FD0C82B2DD0D82E3DD07801F5E40C +:10FDB000DF120AC0C70156D01DD021978FEFE81A75 +:10FDC000F80A2097B9F76DCFF70187917F0112D01C +:10FDD0002197D1F766CF853739F425D08EE10AD047 +:10FDE00087E908D085E05CCF813509F073CF88E0E2 +:10FDF00014D070CF9091C00095FFFCCF8093C600C7 +:10FE000008958091C00087FFFCCF8091C00084FDE1 +:10FE100001C0A8958091C6000895E0E6F0E098E161 +:10FE2000908380830895EDDF803219F088E0F5DF5C +:10FE3000FFCF84E1DFCFCF93C82FE3DFC150E9F7D5 +:10FE4000CF91F1CFFC010A0167BFE895112407B6F5 +:10FE500000FCFDCF667029F0452B19F481E187BFC6 +:10FE6000E8950895F999FECF92BD81BDF89A99273A +:10FE700080B50895262FF999FECF1FBA92BD81BD96 +:10FE800020BD0FB6F894FA9AF99A0FBE019608951C +:10FE900056657273696F6E3D382E31004F5054496C +:10FEA000424F4F545F435553544F4D5645523D308A +:10FEB000004465766963653D61746D6567613132E3 +:10FEC00038347000465F4350553D31363030303065 +:10FED00030304C00424947424F4F543D310042754B +:10FEE000696C743A41707220313820323032313AC4 +:10FEF00032323A30333A303000554152543D3000BE +:10FF0000424155445F524154453D313135323030E4 +:10FF1000004C45443D4233004C45445F53544152EC +:0CFF2000545F464C41534845533D3300AC +:02FFFE000108F8 +:040000031000FC00ED +:00000001FF