Added semihosting, updated readme name

rocketry
Richard Eoin Meadows 2014-07-09 21:05:09 +01:00
rodzic 8a71df78c5
commit 80c7440f81
8 zmienionych plików z 165 dodań i 6 usunięć

Wyświetl plik

@ -72,21 +72,30 @@ OBJCOPY := $(TOOLCHAIN)-objcopy
OBJDUMP := $(TOOLCHAIN)-objdump
SIZE := $(TOOLCHAIN)-size
# The SAM D20 series is based on an ARM Cortex M0 core
# The SAM D20 series is based on an ARM Cortex M0+ core
#
#
ARCH_FLAGS := -mcpu=cortex-m0plus -mthumb
# Flags to be used when semihosting
#
#
ifdef SEMIHOSTING
LDFLAGS += --specs=rdimon.specs -lc -lrdimon
else
LDFLAGS += --specs=nano.specs -lc
endif
# Compilation Flags
#
# Display all warnings. Compile functions and data into their own sections so
# they can be discarded if unused. The linker performs garbage collection of
# unused input sections.
#
CFLAGS = $(COMPILATION_FLAGS) -Wall -Wextra $(ACCEPT_WARN) -std=gnu99 \
CFLAGS += $(COMPILATION_FLAGS) -Wall -Wextra $(ACCEPT_WARN) -std=gnu99 \
-ffunction-sections -fdata-sections $(ARCH_FLAGS)
ASFLAGS = -Wall $(ARCH_FLAGS) -a=/dev/null
LDFLAGS = $(COMPILATION_FLAGS) $(LINKER_FLAGS) -Wextra $(ARCH_FLAGS)
ASFLAGS += -Wall $(ARCH_FLAGS) -a=/dev/null
LDFLAGS += $(COMPILATION_FLAGS) -lm $(LINKER_FLAGS) -lm -Wextra $(ARCH_FLAGS)
# Compilation Defines
#
@ -95,6 +104,9 @@ LDFLAGS = $(COMPILATION_FLAGS) $(LINKER_FLAGS) -Wextra $(ARCH_FLAGS)
ifdef TARGET_CHIP
CFLAGS += -D$(TARGET_CHIP) -D__$(TARGET_CHIP)__
endif
ifdef SEMIHOSTING
CFLAGS += -D__SEMIHOSTING__
endif
# Startup and system code
#
@ -226,7 +238,7 @@ etags: $(TAGFILES)
#
.PHONY: emacs
emacs:
@emacs $(TAGFILES) Makefile config.mk
@emacs $(TAGFILES) Makefile config.mk README.md
# Removes everything in the output directory
#

Wyświetl plik

@ -76,6 +76,22 @@ outside of RAM and ROM.
These commands can be automated by placing them in a `gdbscript-custom` file.
### Semihosting ###
You can build for semihosting by defining the `SEMIHOSTING` variable
in make. Like this:
```
make -kB SEMIHOSTING=1
```
This build will be significantly larger (in terms of RAM and ROM).
For this build, when a debugger is present at startup the
`semihost_printf`, `semihost_puts` and `semihost_putchar` functions
will print to stdio on the host. The Blackmagic Debug Probe supports
this.
## Emacs ##
The command `make emacs` can be used to quickly launch an instance of

Wyświetl plik

@ -1 +1 @@
README-nrf51-gcc-blackmagic.md
README-samd20-gcc-blackmagic.md

Wyświetl plik

@ -45,6 +45,8 @@
* __data_end
* __bss_start
* __bss_end
* __end__
* end
* __heap_start
* __heap_end
* __stack_end
@ -139,6 +141,7 @@ SECTIONS
.heap (COPY):
{
__end__ = .;
end = __end__;
__heap_start = __end__;
*(.heap*)
__HeapLimit = .;

Wyświetl plik

@ -42,6 +42,7 @@
*/
#include "samd20.h"
#include "semihosting.h"
/* Initialize segments */
extern uint32_t __fixed_start;
@ -59,6 +60,7 @@ int main(void);
/** \endcond */
void __libc_init_array(void);
extern void initialise_monitor_handles(void);
/* Default empty handler */
void Dummy_Handler(void);
@ -174,6 +176,18 @@ void Reset_Handler(void)
/* Initialize the C library */
__libc_init_array();
#ifdef __SEMIHOSTING__
/* If there's a debugger attached */
if (DSU->STATUSB.reg & DSU_STATUSB_DBGPRES) {
/* Initialise handles for semihosting */
initialise_monitor_handles();
/* Set semihosting functions */
set_semihosting();
}
#endif /* __SEMIHOSTING__ */
/* Branch to main function */
main();

56
inc/semihosting.h 100644
Wyświetl plik

@ -0,0 +1,56 @@
/*
* Wrapper functions for semihosting
* Copyright (C) 2014 Richard Meadows <richardeoin>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef SEMIHOSTING_H
#define SEMIHOSTING_H
/**
* Please use the semihost_*() wrappers so that semihosting functions
* can be disables from the makefile!
*/
#ifndef __SEMIHOSTING__
/* Dummy function handlers */
#define semihost_putchar(c)
#define semihost_puts(s)
#define semihost_printf(...)
#else
/* We would get a SVC exception if we called stdio without a debug probe */
void set_semihosting(void);
/* Real function handlers */
#define semihost_putchar(c) __putchar(c)
#define semihost_puts(s) __puts(s)
#define semihost_printf(...) __printf(__VA_ARGS__)
void __putchar(char c);
void __puts(const char* s);
void __printf(const char *format, ...);
#endif /* __SEMIHOSTING__ */
#endif /* SEMIHOSTING_H */

Wyświetl plik

@ -25,6 +25,9 @@
#include "samd20.h"
#include "pindefs.h"
#include <stdio.h>
#include "semihosting.h"
int main(void)
{
SystemInit();
@ -38,6 +41,8 @@ int main(void)
/* Configure the SysTick for 50ms interrupts */
SysTick_Config(SystemCoreClock / 20);
semihost_printf("Hello World\n");
while (1);
}

53
src/semihosting.c 100644
Wyświetl plik

@ -0,0 +1,53 @@
/*
* Wrapper functions for semihosting
* Copyright (C) 2014 Richard Meadows <richardeoin>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stdio.h>
#include <stdarg.h>
#include "samd20.h"
uint8_t semihosting_en = 0;
void set_semihosting(void) {
semihosting_en = 1;
}
void __putchar(char c) {
if (semihosting_en) {
putchar(c);
}
}
void __puts(const char* s) {
if (semihosting_en) {
puts(s);
}
}
void __printf(const char *format, ...) {
if (semihosting_en) {
va_list args;
va_start(args, format);
vprintf(format, args);
}
}