Bloombloombloom Bloom Versions Save

A debug interface for AVR-based embedded systems development on GNU/Linux.

v1.0.0

7 months ago

Major release


This release contains breaking and behavioural changes. If you're upgrading from a previous version of Bloom, you'll need to carefully consider the changes made in this release. Please follow the instructions provided in the migration tutorial.

Breaking changes

  • JSON project configuration files (bloom.json) are no longer supported.
  • The avr8 target has been removed - you must now specify the exact target name in your project configuration file.
  • The enabled Insight config parameter has been removed. See the activateOnStartup parameter.
  • The releasePostDebugSession debug tool config parameter has been removed. If you want Bloom to give up control of the debug tool, trigger a shutdown.
  • The old updateDwenFuseBit AVR8 config parameter was renamed to manageDwenFuseBit in version 0.11.0. The old parameter name was still accepted, but has been removed in this release.
  • The debugTool configuration key (in bloom.yaml) has been renamed to tool.
  • The debugServer configuration key (in bloom.yaml) has been renamed to server.

Behavioural changes

  • By default, the Insight GUI will no longer activate on startup. It can be activated, on-demand, via the new monitor insight GDB command. This behaviour can be changed via the new activateOnStartup insight config parameter.
  • Closing the Insight window will no longer trigger a shutdown. This behaviour can be changed via the new shutdownOnClose insight config parameter.
  • Bloom will no longer go into a suspended state when control of the debug tool is lost. Instead, it will just shutdown abruptly.

New Insight config parameters:

insight:
  activateOnStartup: false # <- If true, the Insight GUI will be activated immediately after startup (which is what it used to do, prior to v1.0.0).
  shutdownOnClose: false # <- If true, Bloom will shutdown when the user closes the main Insight window (which is what it used to do, prior to v1.0.0).

Support for additional AVR-DD targets

  • Support for the following targets is included in this release:

    • AVR16DD14 (untested)
    • AVR16DD20 (untested)
    • AVR16DD28 (untested)
    • AVR16DD32 (untested)
    • AVR32DD14 (untested)
    • AVR32DD20 (untested)
    • AVR32DD28 (untested)
    • AVR32DD32 (untested)

Hardware breakpoints

  • Bloom will now make use of any hardware breakpoints available on the target.

  • Once all hardware breakpoint resources have been exhausted, Bloom will fall back to software breakpoints.

  • This functionality can be disabled via the new hardwareBreakpoints target config param:

    target:
      name: "atmega4809"
      physicalInterface: "updi"
      hardwareBreakpoints: false # <-- Setting this param to false will disable Bloom's use of HW breakpoints.
    
  • This functionality is enabled by default (hardwareBreakpoints defaults to true).

  • Upon target activation, Bloom will report the number of available hardware breakpoints on the target:

    2023-09-20 20:36:45.768 BST [TC] [52]: [INFO] Target activated
    2023-09-20 20:36:45.768 BST [TC] [53]: [INFO] Target ID: 0x1e9651
    2023-09-20 20:36:45.768 BST [TC] [54]: [INFO] Target name: ATmega4809
    2023-09-20 20:36:45.768 BST [TC] [55]: [INFO] Available hardware breakpoints: 1
    2023-09-20 20:36:45.809 BST [DS] [58]: [INFO] Starting DebugServer
    

Program memory caching

  • Bloom will now cache the target's program memory

  • This functionality can be enabled/disabled via the new programMemoryCache target config param:

    target:
      name: "atmega4809"
      physicalInterface: "updi"
      programMemoryCache: false # <-- Setting this param to false will disable program memory caching.
    
  • This functionality is enabled by default (programMemoryCache defaults to true).

  • Users should disable this if their application can update program memory (e.g. bootloaders).

Range stepping

  • Bloom is now able to decode and analyse AVR8 opcodes from the target's program memory. This enables the ability to perform range stepping on the target, where GDB will instruct Bloom to step within a PC range and only halt target execution when it goes out of the given range.

  • Bloom will use breakpoints (hardware or software) to intercept any instructions within the given range, that may result in the target leaving the range.

  • In most cases, this results in improved stepping performance. There's at least one known case where this can have a negative effect on stepping performance. See http://bloom.oscillate.io/docs/limitations#stepping-performance for more.

  • This functionality can be enabled/disabled via the new rangeStepping server config param:

    server:
      name: "avr-gdb-rsp"
      ipAddress: "127.0.0.1"
      port: 1442
      rangeStepping: true # <-- Setting this param to true will enable range stepping.
    
  • This functionality is enabled by default (rangeStepping defaults to true).

Other changes

  • Changed implementation of preserveEeprom function to make use of the target's EESAVE fuse bit, which is faster than the backup-erase-restore approach.
  • The Insight component can be removed at build time, via the EXCLUDE_INSIGHT parameter. See the root README.md for more.
  • Added key press event handlers to some Insight windows.
  • Added change list in snapshot diff window.
  • Fractional second added to logs.
  • Renamed debugLoggingEnabled parameter to debugLogging. The old name is still accepted, for now.

Bug fixes

  • The size of the main Insight window was not being properly restored on startup.
  • Missing includes resulting in failing builds with GCC 13+, reported and fixed by @jpf91
  • Breakpoints set by GDB were not being restored after a programming session. This was only noticeable when GDB was configured to keep breakpoints inserted.

v0.12.3

9 months ago

Bug fix release


  • Bloom was failing to manage the DWEN fuse bit on some development boards (Xplained Mini, possibly others). See Debugging debugWire targets with Bloom for more.
  • Intersecting memory regions were not being detected properly.
  • Premature enabling of the hex viewer in the memory inspection pane, after a programming session, was resulting in seg faults.
  • Difference count in the snapshot diff window was including excluded bytes.
  • Fixed version number comparison bug.

v0.12.2

11 months ago

Bug fix release


  • Corrected seg fault which was occurring on some Arch-based distros. Was caused by the distributed libstdc++ shared object (which was incompatible with libGLX_mesa.so). I've removed the distributed libstdc++ from the Arch package, as the package manager can satisfy the dependency.

v0.12.1

1 year ago

Bug fix release


  • Fixed "Unknown family name" error for new AVR EA targets.

v0.12.0

1 year ago

Feature release


EEPROM access via GDB

  • Support for EEPROM access via GDB - all GDB memory access commands can now be used with EEPROM. The 0x00810000 offset must be applied to EEPROM addresses.
  • Support for loading ELFs with EEPROM sections.
  • New monitor eeprom fill command, to fill EEPROM with a given value.

Support for new AVR-EA targets

Insight hex viewer performance improvements (in preparation for memory snapshot viewer and diffs)

  • Refactored the HexViewer to limit the number of QGraphicsItem objects - significantly reducing RAM usage and improving performance when inspecting large memories.
  • Stress tested with memories up to 5MB (meaning over 5 million byte items) - more than enough for current use cases.
  • Additional work done in preparation for nested group items (for object annotations - something that will be looked at later on).

Memory snapshots via Insight

  • A snapshot of the entire contents of RAM, EEPROM or FLASH can now be captured and stored in the project directory.
  • Snapshots can be viewed, individually.
  • Snapshots can be compared to others, or to the current memory.
  • Snapshots can be restored (RAM and EEPROM only).

Flash memory inspection via Insight

  • Flash memory can now be inspected via Insight
  • Snapshots can be taken and be compared against.
  • Worth keeping in mind: Given the sizes of flash memory on some AVR targets, the hex viewer can consume a considerable amount of RAM.

Other improvements

  • The Insight window now uses ~60% less RAM, and is much more responsive.
  • Focused memory regions can now span multiple lines.
  • Replaced stack highlighting with stack grouping in RAM inspection pane - stack memory is now displayed as a separate group, with additional annotations, to clearly distinguish it from the rest of the target's RAM.
  • Background tasks window
  • Task progress bar on memory inspection pane
  • Added some new "Copy Selection" actions to hex viewer
  • Added preserveEeprom AVR8 target config boolean parameter, to control the backup-then-restore function employed for JTAG and UPDI targets. Setting this to false will improve upload times for those who don't care about losing EEPROM data when uploading program changes.
  • Added OCDEN fuse bit management for JTAG-enabled targets. Controlled via the new manageOcdenFuseBit AVR8 target config boolean parameter. See https://bloom.oscillate.io/docs/configuration
  • Improved error messages
  • For hybrid debug tools (MPLAB Snap and PICkit 4), Bloom will now check if the device is in AVR mode and report back to the user if the device was found on the system, but not in AVR mode.

Bug fixes

  • Memory inspection panes were remaining disabled when switching between them.
  • From CLion version 2023.1, Bloom was failing to detect CLion managing its process, resulting in the known shutdown bug.
  • Interrupts from GDB were not being properly handled, resulting in some being ignored.

v0.11.1

1 year ago

Bug fix release


Fixes:

  • YAML parsing exceptions were not being properly handled Exceptions thrown by the yaml-cpp library, when processing the user's project configuration file (bloom.yaml), were not being handled properly. This was resulting in syntax errors in bloom.yaml causing Bloom's process to unexpectedly abort.

  • Intermittent 'illegal target state' error on AVR8 targets, after a target reset After resetting an AVR8 target, the EDBG debug tool would sometimes report an 'illegal target state' error in response to any command that was sent immediately after receiving the break event (triggered by the reset). It seems as if the target is not fully reset (or stopped?), even after the point of receiving the break event. This was fixed by ensuring that the target is given some time after a reset, before sending any other commands.

  • Incorrect value annotation font style in hex viewer Due to a bug in the AnnotationItem class, annotation item labels were not being rendered correctly. This issue was intermittent.

v0.11.0

1 year ago

Feature release


Project configuration

  • Project configuration files are now expected to be in YAML format.
  • The init command will now produce a YAML configuration file (bloom.yaml).
  • To minimise disruption for current users, JSON configuration is still accepted. In the absence of a bloom.yaml file, Bloom will fall back to bloom.json.
  • Renamed the updateDwenFuseBit AVR8 config param to manageDwenFuseBit. The old param is still supported but will be removed in a later release.

Insight

  • Memory inspection panes
    • Can now be detached from the main Insight window
    • Auto-refresh is disabled by default (can be enabled by right-clicking the refresh tool button)
    • Individual bytes can be selected in the hex viewer and copied to the clipboard
    • Address labels in the hex viewer can be configured to display absolute or relative addresses (via a context menu presented when right-clicking any address label). This setting is persisted through debug sessions.
    • Added endianness/first-byte indicator on value annotations of focused memory regions, in the hex viewer.
    • Stale memory indicator
  • Some minor style tweaks to the bitset widget on the register inspection window.

SVD generation via GDB monitor command

  • monitor svd - Generates SVD and outputs to a file in the project directory.
  • monitor svd --out - Generates SVD and sends the output to GDB, to display as command output. GDB front-ends (IDEs) can utilise this without requiring any user action.
  • The monitor target-info machine command has been removed.

Other

  • Upgraded Qt dependency to 6.2.4 LTS
  • Verifying AVR8 physical interface configuration
    • Before activating the AVR8 target, Bloom will now confirm the selected physical interface is supported by the selected target. Upon confirmation failure, Bloom will warn the user and provide a list of the physical interfaces supported by the selected target.
    • Bloom will not abandon the startup routine upon confirmation failure, due to the possibility of false-positives.
    • Bloom can only perform this check in environments where the specific AVR8 target name has been provided in the environment configuration. Use of the generic avr8 target name will disable Bloom's ability to perform this check.

Bug fixes

  • Widgets on the Insight window were overlapping on KDE Plasma desktops, due to the minimum window size being ignored. This was fixed by moving away from fixed minimum sizes on the memory inspection panel widget. See https://github.com/navnavnav/Bloom/issues/48 for more.
  • Bloom was failing to program some UPDI targets due to some buffers from GDB being misaligned, along with the lack of grouped flash writes. This was affecting targets such as the Atmega4809 on the Xplained Pro evaluation board.
  • Bloom wasn't resetting the target after programming.
  • Long memory reads issued by the Insight GUI were occupying the TargetController for too long, preventing it from servicing commands from the GDB debug server, resulting in GDB timeouts (which GDB would report as packet errors). These memory reads have now been split into batches, so that the TargetController can service other commands in-between, reducing the likelihood of timeouts when servicing a GDB command.
  • Some instances of the error dialogue were displaying escaped characters.
  • When using CLion's 'Embedded GDB Server' configuration, CLion was not allowing Bloom any opportunity to shutdown safely. As a result, the connected hardware was being left in an unknown state, which sometimes resulted in startup failures upon the user starting a new debug session. For information on how this was fixed, see #53.

v0.10.0

1 year ago

Feature release


Support for programming

Bloom can now write to the target's program memory. GDB's load command can be used to program the target. Bloom users no longer need to rely on other software to apply code changes during their debug sessions.

Bug fixes:

  • Alignment bug that resulted in EDBG-based debug tools returning an error when attempting to access non-word-aligned addresses in flash memory.
  • A typo was resulting in invalid CMSIS command packet sizes, taking the size above the HID report size, resulting in an error when attempting to send commands with a large payload. This was affecting the EDBG driver.
  • Incorrect buffering was resulting in invalid CMSIS AVR command sizes, resulting in a similar issue as described above. As with above, this issue only affected the EDBG driver and only became apparent when sending commands with a large payload.
  • Insight was needlessly refreshing data upon the start of a debug session.

v0.9.1

2 years ago

Bug fix release


Fixes:

  • GDB generating invalid backtraces for debugWire sessions Bloom was incorrectly applying an offset to all paged flash memory reads. This meant that it was reading the wrong areas in memory. This was resulting in GDB generating invalid backtraces. This bug only affected debugWIre sessions. See https://github.com/navnavnav/Bloom/issues/40

  • GDB attempting to access flash memory at invalid addresses Bloom was not providing GDB with a target memory map, so GDB would attempt to access flash memory at invalid addresses. Bloom now supports the qXfer:memory-map:read:: GDB command packet - meaning we now provide GDB with a memory map upon request.

v0.9.0

2 years ago

Feature release


This release includes significant changes to Bloom's internals. Although best efforts have gone into testing the release, users may face some issues as a result of the changes. In the event that you come across any issues, please report them as soon as possible.

Debug tool drivers:

  • JTAGICE3, requested by @septatrix and @maximevince

For configuration values, see https://bloom.oscillate.io/docs/configuration#debug-tool-target-config

Custom GDB commands (via the monitor GDB command)

  • monitor help - Displays help text, describing the supported monitor commands.
  • monitor version - Displays Bloom's version number.
  • monitor version machine - Outputs Bloom's version number in JSON format.
  • monitor target-info machine - Outputs information on the connected target, in JSON format.
  • monitor reset - Resets the target and holds it in a stopped state. See https://github.com/navnavnav/Bloom/issues/24 for more.

Other

  • --version-machine CLI command - Outputs Bloom's version number in JSON format.

Bug fixes

  • Insight was needlessly refreshing GPIO pin states twice, when the user would update a PORT register via the register inspection window.
  • The GDB debug server would fail and shutdown (causing the rest of Bloom to follow) when an exception was thrown during the processing of a TargetExecutionResumed event (sending a stop reply packet to the GDB client).
  • Bloom wasn't operating correctly when used with CLion 2022.1 (and possibly some other versions proceeding 2021.1) - CLion was configuring GDB to include frames before the entry point, when generating backtraces. This was resulting in GDB requesting memory reads at invalid memory addresses, which Bloom was handling incorrectly. See https://github.com/navnavnav/Bloom/issues/37 for more.