Over a million developers have joined DZone.

Batch Programming with GDB: Segger J-Link and P&E Multilink

Use the command line to do some efficient batch programming for your firmware boards

· IoT Zone

Access the survey results 'State of Industrial Internet Application Development' to learn about latest challenges, trends and opportunities with Industrial IoT, brought to you in partnership with GE Digital.

I need to program several boards with a firmware: a number too small for serious batch/factory programming, but a number too high for doing this with the debugger. I want this:

  1. Connect the board with the debug probe and power it
  2. Run a script to flash the program and run it
  3. Disconnect and restart step 1.

Need to program a few boards…


With “Command Line Programming and Debugging with GDB” I have pretty much everything in place. So I only need to combine things into a solution. Because it's different depending on if you're using the P&E Multilink or Segger J-Link, I have covered both methods. I’m using the Eclipse-based Kinetis Design Studio v3.0.0, but a command line gdb installation can be used too.

P&E Multilink

I’m using the following batch file to start the P&E GDB server, followed by starting the gdb client. Change paths accordingly:

REM Start P&E GDB Server with single session
call "cmd /c start C:\Freescale\KDS_3.0.0\eclipse\plugins\com.pemicro.debug.gdbjtag.pne_2.0.8.201504092111\win32\pegdbserver_console.exe -startserver -singlesession -device=Freescale_K6x_K64FN1M0M12"

REM start gdb with script
C:\Freescale\KDS_3.0.0\arm-none-eabi-gdb -x gdbScript.txt

The option -singlesession to the P&E server is a nice feature: it will terminate the server after the session is finished. I’m using the Freescale K64F in the above example, so make sure the -device option matches your target.

The gdb uses the option -x uses this gdb script file:

# gdbscript.txt: script for gdb. Run it with
# gdb -x <commandFile>

# disable confirmation messages (y or no):
set confirm off

# connect to P&E gdb server:
target remote localhost:7224

# reset target:
monitor reset

# load symbols for application (not necessary for flashing only):
# file MyProject/Debug/MyProject.elf

# load application:
load MyProject/Debug/MyProject.elf

# detach from target. As a side effect, this will start it:

# quit gdb:

Segger J-Link

With the Segger J-Link, I need to launch the GDB server first (make sure it's not already running):


SEGGER GDB Server running

In a separate cmd/shell window, I run this script:

c:\Freescale\KDS_3.0.0\toolchain\bin\arm-none-eabi-gdb.exe -x gdbscript.txt

Segger GDB Script

The script has the following content to load the file, run it and then disconnect:

# gdb script
target remote localhost:2331
monitor device MK64FN1M0xxx12
monitor reset
load ./Debug/FRDM-K64F_FreeRTOS_8.2.1.elf
# load symbols, not necessary for flashing only
# file ./Debug/FRDM-K64F_FreeRTOS_8.2.1.elf
monitor go

Make sure you update the device and target image/path settings.

The difference with the P&E version is that the Segger J-Link server keeps running. I have not found a way to make that part automated.


There is no IDE or complicated setup necessary to batch program a set of boards: all that you need are some gdb scripts, and I can program and run one board after each other in a series of boards.

The IoT Zone is brought to you in partnership with GE Digital.  Discover how IoT developers are using Predix to disrupt traditional industrial development models.


Published at DZone with permission of Erich Styger, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}