STM8 toolchain with GDB debugger and SDCC for cygwin

This is the open source STM8 development toolchain effort with binutils, gdb, gas, openocd and sdcc. STM8 is a 8-bit microcontroller platform from STMicroelectronics. Everything is based on the latest versions of the sources.

gdb 7.12.1
binuils 2.27
openocd 0.10.0
sdcc 3.6.0

Contributions are welcome, testing the tools is of course the main issue. If you have suggestions, bug reports or wishes post a comment to the stm8-binutils-gdb discussion forum.

DOWNLOAD

Precompiled binaries for cygwin and cygwin64 can be installed by running the netinstaller for i686 and x86_64:

https://sourceforge.net/projects/stm8-binutils-gdb/files

GDB

A new stm8 target was added to gdb. In addition two new remote settings were added to facilitate debugging with IDE's like eclipse. These settings will make gdb behave like if it is debugging native code removing the necessity to use remote, load and continue commands.

set remote run-connect on (default is on)

The run-connect setting makes gdb automatically connect to localhost port 3333 (openocd server port) when run command is entered.

set remote run-load on (default is on)

The run-load setting makes gdb automatically load the program when run command is entered.

BINUTILS

The regular tools like ld, objcopy, readelf, objdump etc.

GAS

A new stm8 assembler (as).

OPENOCD

A new target for stm8 in addition to updated and fixed SWIM support. Hopefully this will be merged upstream.

There are a few stm8 specific commands:

stm8_reset_rop: Erase read out protection in option byte 0. This will also erase the whole program area.

enable-stm8l 1: Configure openocd to use FLASH registers for stm8l. 1 = is stm8l enable and 0 = stm8l disable.

enable-step-irq 1: Stepping with step command in gdb will follow any interrupts generated. 1 = enable and 0 = disable.

SDCC

SDCC already had a back end for stm8. Unfortunately not so much debugging info although most of the debugging code was already available. However it is still lacking dwarf CFI (call frame info) so sdcc hade to be patched to use a frame pointer to assist gdb unwinding the stack. The soft frame pointer register is enabled with the --debug and --out-fmt-elf option. The sdlk linker was updated to supply proper entry point address in the ELF header.

The startup code now also includes initialization of the stackpointer.

BUILDING BINARIES

Building the binaries is basically the process of downloading the sources and applying the patches. There are helper scripts to assist with the process. In addition there are also config scripts for sdcc, openocd and binutils-gdb. If you want explicit configuration options edit these config scripts.

First set your installation directory if you want it in a specific location. Otherwise skip this step to keep the default(s).

export PREFIX=<path>

To download, patch and configure:

./patch_binutils.sh
./configure_binutils.sh

./patch_sdcc.sh
./configure_sdcc.sh

Until stm8 openocd official binaries are available:

./patch_openocd.sh
./configure_openocd.sh

Next step is the regular building and install:

cd binutils-gdb
make
make install
cd ..

cd sdcc-3.6.0
make
make install
cd ..

cd openocd-0.10.0
make
make install
cd ..

USAGE EXAMPLES

Compiling with sdcc and debug info:

sdcc -mstm8 led.c --out-fmt-elf --all-callee-saves --debug --verbose --stack-auto --fverbose-asm  --float-reent --no-peep

launch openocd in a second shell:

openocd.exe -f interface/stlink-v1.cfg -f target/stm8s105.cfg -c "init" -c "reset halt"

 

or if you will be using stlink-v2:

openocd.exe -f interface/stlink-v2.cfg -f target/stm8s105.cfg -c "init" -c "reset halt"

or if you prefer the vanilla configuration (for medium size flash stm8s)

openocd.exe -f interface/stlink-v2.cfg -f target/stm8.cfg -c "init" -c "reset halt"

Currently config files for stm8s003, stm8s105 and stm8l152 are available. Feel free to submit new configuration files to
the stm8-binutils-gdb discussion forum.

Then start gdb:

stm8-gdb test.elf --tui
start

or if you prefer to load manually:

stm8-gdb test.elf --tui
target extended-remote localhost:3333
load
break main
continue

USING ECLIPSE CDT AS GDB FRONTEND

Using eclipse cdt as gdb front end is now much more straight forward with the modifications of the way gdb ‘run’ command works. What is happening when ‘start’ or ‘run’ command is entered is gdb automatically connects to openocd server on localhost:3333. This is similar to entering the commands ‘target ext localhost:3333’ and ‘load’ then ‘continue’ which is familiar to you who are used to debug with ‘Insight gdb’ or gdb with TUI (which is not that bad actually).

To create a ’debug’ project in eclipse, open ‘File’ menu and click ‘Import’. Click ‘C/C++ Executable’.
Click ‘Next’

 

In the Import Executable dialog browse to your elf file you wish to debug.
Click ‘Next’.

 

Now a project will be created. Use the defult settings or change project name.
Click Finish.

 

Now the ’Debug Configurations’ dialog is automatically shown.
Click the ‘Debugger’ tab.

 

Browse to where the stm8-gdb.exe binary is located.
Next select ‘Source’ tab.

 

To use eclipse in windows with cygwin as ‘operating system’ for gdb some configuration of eclipse is necessary. This step is specific when using cygwin and can be skipped if you use eclipse with Linux.

We have to map the path relations between cygwin and windows.  Basically what happens is when gdb sees a reference to ‘/cygdrive/c/temp/test’ it will be converted into a windows path ‘c:/temp/test1’.

Under the tab ‘Source’ click Add and then ‘Path Mapping’

 

In the Path Mappings dialog enter the cygwin path and the windows path.
Click OK.

 

Now it should look like this:
Click Apply then Debug

 

The program should load and break on the first line in main():