The NoICE Debugger is an exceptionally lightweight and powerful remote debugger for microprocessors like the Z80, 8051, 68HC12, and MSP430. While many developers use it for basic assembly stepping and memory inspection, it contains advanced embedded tools that dramatically accelerate hardware troubleshooting.
Below are 7 hidden, high-utility features of NoICE you must integrate into your workflow to maximize your debugging productivity. 1. Macro Command Recording and Playback
Re-typing initialization values, peripheral registers, or target setup steps after every processor reset wastes critical development time. NoICE solves this by allowing you to record a sequence of interactive commands directly into a file and play them back instantly.
You can define these playback files as complex macros that accept variable arguments. This makes it simple to write a single script that flashes a chip, configures the stack pointer, and runs a target system to a specific memory address with one click. 2. Custom C Data Structure Definitions
Looking at a raw hex dump to figure out the state of a complex program state is slow and prone to human error. NoICE features an internal parsing system that allows you to define your custom C data structures, multi-dimensional arrays, and stack-based local variables.
Once defined, the Data pane renders your embedded structures using high-level names and types. This eliminates the need to manually compute memory offsets for nested structure fields while looking at raw bytes. 3. Virtual Floating and Resizable Tabs
The standard NoICE interface organizes the Data, Output, View, Watch, and Memory segments into a compact tabbed dock at the bottom of the screen. However, managing a complex system layout usually requires viewing multiple panes at the exact same time.
You can double-click any view tab to detach it into a floating window. This allows you to drag the Watch window or the Memory dump to a second monitor, optimizing screen real estate and giving you real-time visibility into parallel variables. 4. Dynamic Symbolic Expressions
Instead of forcing you to memorize literal hexadecimal locations for memory reads or breakpoints, NoICE natively extracts line numbers and naming dictionaries from compiler output formats. It explicitly supports formats like IEEE 695, Intel Hex, and Elf/Dwarf.
Once parsed, you can pass descriptive label names directly into command line expressions. For example, typing M MyBuffer 10 instantly displays ten bytes at the variable’s physical address, eliminating manual map-file lookups. 5. Automated Hardware-Free Single Stepping
Standard hardware monitors often limit the available number of simultaneous breakpoints due to target hardware constraints. NoICE bypasses physical chip limitations by utilizing an automated, software-driven single-step engine.
When stepping without physical hardware breakpoint support, NoICE uses an intelligent target layer to dynamically parse instructions ahead of time. It transparently places temporary software markers, executing individual branches safely without modifying permanent lines or data spaces. 6. Interactive Mini-Assembler Code Patching
If you find a minor bug in a loop or want to toggle a specific hardware port for testing, modifying the C source code, recompiling, and reflashing can take several minutes.
NoICE includes a built-in Mini-Assembler that lets you type assembly mnemonics directly into memory. This tool automatically assembles your instructions on the fly and overwrites existing target memory. It provides a rapid method to patch instructions or introduce small code segments instantly. 7. Peripheral-Free Algorithmic Simulation
You do not always need an active hardware target connected to a BDM pod or serial cable to check code logic. NoICE features target instruction-set simulators that model exact microprocessor execution directly on your PC.
The simulator includes an integrated mock UART channel. This channels functions like standard I/O, routing printf data directly to the NoICE output view. It lets you validate math operations, verify memory string algorithms, and test logic before deploying code to physical development boards.
If you want to configure your project layout or macros, let me know:
Which target microprocessor you are building for (e.g., Z80, 8051, 68HC12)? What compiler or assembler format you use?
The specific hardware connection type you use to communicate with your board?
I can generate custom target setup macros or configuration scripts tailored to your specific workbench. NoICE Debugger
Leave a Reply