kopia lustrzana https://github.com/bristol-seds/pico-tracker
Added semihosting, updated readme name
rodzic
8a71df78c5
commit
80c7440f81
22
Makefile
22
Makefile
|
@ -72,21 +72,30 @@ OBJCOPY := $(TOOLCHAIN)-objcopy
|
||||||
OBJDUMP := $(TOOLCHAIN)-objdump
|
OBJDUMP := $(TOOLCHAIN)-objdump
|
||||||
SIZE := $(TOOLCHAIN)-size
|
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
|
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
|
# Compilation Flags
|
||||||
#
|
#
|
||||||
# Display all warnings. Compile functions and data into their own sections so
|
# Display all warnings. Compile functions and data into their own sections so
|
||||||
# they can be discarded if unused. The linker performs garbage collection of
|
# they can be discarded if unused. The linker performs garbage collection of
|
||||||
# unused input sections.
|
# 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)
|
-ffunction-sections -fdata-sections $(ARCH_FLAGS)
|
||||||
ASFLAGS = -Wall $(ARCH_FLAGS) -a=/dev/null
|
ASFLAGS += -Wall $(ARCH_FLAGS) -a=/dev/null
|
||||||
LDFLAGS = $(COMPILATION_FLAGS) $(LINKER_FLAGS) -Wextra $(ARCH_FLAGS)
|
LDFLAGS += $(COMPILATION_FLAGS) -lm $(LINKER_FLAGS) -lm -Wextra $(ARCH_FLAGS)
|
||||||
|
|
||||||
# Compilation Defines
|
# Compilation Defines
|
||||||
#
|
#
|
||||||
|
@ -95,6 +104,9 @@ LDFLAGS = $(COMPILATION_FLAGS) $(LINKER_FLAGS) -Wextra $(ARCH_FLAGS)
|
||||||
ifdef TARGET_CHIP
|
ifdef TARGET_CHIP
|
||||||
CFLAGS += -D$(TARGET_CHIP) -D__$(TARGET_CHIP)__
|
CFLAGS += -D$(TARGET_CHIP) -D__$(TARGET_CHIP)__
|
||||||
endif
|
endif
|
||||||
|
ifdef SEMIHOSTING
|
||||||
|
CFLAGS += -D__SEMIHOSTING__
|
||||||
|
endif
|
||||||
|
|
||||||
# Startup and system code
|
# Startup and system code
|
||||||
#
|
#
|
||||||
|
@ -226,7 +238,7 @@ etags: $(TAGFILES)
|
||||||
#
|
#
|
||||||
.PHONY: emacs
|
.PHONY: emacs
|
||||||
emacs:
|
emacs:
|
||||||
@emacs $(TAGFILES) Makefile config.mk
|
@emacs $(TAGFILES) Makefile config.mk README.md
|
||||||
|
|
||||||
# Removes everything in the output directory
|
# Removes everything in the output directory
|
||||||
#
|
#
|
||||||
|
|
|
@ -76,6 +76,22 @@ outside of RAM and ROM.
|
||||||
|
|
||||||
These commands can be automated by placing them in a `gdbscript-custom` file.
|
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 ##
|
## Emacs ##
|
||||||
|
|
||||||
The command `make emacs` can be used to quickly launch an instance of
|
The command `make emacs` can be used to quickly launch an instance of
|
|
@ -1 +1 @@
|
||||||
README-nrf51-gcc-blackmagic.md
|
README-samd20-gcc-blackmagic.md
|
|
@ -45,6 +45,8 @@
|
||||||
* __data_end
|
* __data_end
|
||||||
* __bss_start
|
* __bss_start
|
||||||
* __bss_end
|
* __bss_end
|
||||||
|
* __end__
|
||||||
|
* end
|
||||||
* __heap_start
|
* __heap_start
|
||||||
* __heap_end
|
* __heap_end
|
||||||
* __stack_end
|
* __stack_end
|
||||||
|
@ -139,6 +141,7 @@ SECTIONS
|
||||||
.heap (COPY):
|
.heap (COPY):
|
||||||
{
|
{
|
||||||
__end__ = .;
|
__end__ = .;
|
||||||
|
end = __end__;
|
||||||
__heap_start = __end__;
|
__heap_start = __end__;
|
||||||
*(.heap*)
|
*(.heap*)
|
||||||
__HeapLimit = .;
|
__HeapLimit = .;
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "samd20.h"
|
#include "samd20.h"
|
||||||
|
#include "semihosting.h"
|
||||||
|
|
||||||
/* Initialize segments */
|
/* Initialize segments */
|
||||||
extern uint32_t __fixed_start;
|
extern uint32_t __fixed_start;
|
||||||
|
@ -59,6 +60,7 @@ int main(void);
|
||||||
/** \endcond */
|
/** \endcond */
|
||||||
|
|
||||||
void __libc_init_array(void);
|
void __libc_init_array(void);
|
||||||
|
extern void initialise_monitor_handles(void);
|
||||||
|
|
||||||
/* Default empty handler */
|
/* Default empty handler */
|
||||||
void Dummy_Handler(void);
|
void Dummy_Handler(void);
|
||||||
|
@ -174,6 +176,18 @@ void Reset_Handler(void)
|
||||||
/* Initialize the C library */
|
/* Initialize the C library */
|
||||||
__libc_init_array();
|
__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 */
|
/* Branch to main function */
|
||||||
main();
|
main();
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
|
@ -25,6 +25,9 @@
|
||||||
#include "samd20.h"
|
#include "samd20.h"
|
||||||
#include "pindefs.h"
|
#include "pindefs.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "semihosting.h"
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SystemInit();
|
SystemInit();
|
||||||
|
@ -38,6 +41,8 @@ int main(void)
|
||||||
/* Configure the SysTick for 50ms interrupts */
|
/* Configure the SysTick for 50ms interrupts */
|
||||||
SysTick_Config(SystemCoreClock / 20);
|
SysTick_Config(SystemCoreClock / 20);
|
||||||
|
|
||||||
|
semihost_printf("Hello World\n");
|
||||||
|
|
||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Ładowanie…
Reference in New Issue