summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2021-07-22 16:18:54 +1000
committerDamien George <damien@micropython.org>2021-07-22 22:22:03 +1000
commita5ac3d5645e99a897f3213149587a43b62779c35 (patch)
treeed91afebd9cc7b6690971c26cb0a5a2b875ec233
parent7649f5fbd2fb2e9b9153da47a4af4b538ca3ae65 (diff)
samd: Add support for building with user C modules.
Fixes issue #7545. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/samd/Makefile19
-rw-r--r--ports/samd/main.c5
-rw-r--r--ports/samd/sections.ld16
3 files changed, 36 insertions, 4 deletions
diff --git a/ports/samd/Makefile b/ports/samd/Makefile
index d29d9c5b2..a84fc3b12 100644
--- a/ports/samd/Makefile
+++ b/ports/samd/Makefile
@@ -33,7 +33,11 @@ CFLAGS_MCU_SAMD21 = -mtune=cortex-m0plus -mcpu=cortex-m0plus -msoft-float
CFLAGS_MCU_SAMD51 = -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard
CFLAGS = $(INC) -Wall -Werror -std=c99 -nostdlib -mthumb $(CFLAGS_MCU_$(MCU_SERIES)) -fsingle-precision-constant -Wdouble-promotion
CFLAGS += -DMCU_$(MCU_SERIES) -D__$(CMSIS_MCU)__
+CFLAGS += $(CFLAGS_MOD)
+
LDFLAGS = -nostdlib $(addprefix -T,$(LD_FILES)) -Map=$@.map --cref
+LDFLAGS += $(LDFLAGS_MOD)
+
LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
# Tune for Debugging or Optimization
@@ -45,6 +49,14 @@ LDFLAGS += --gc-sections
CFLAGS += -fdata-sections -ffunction-sections
endif
+# Flags for optional C++ source code
+CXXFLAGS += $(filter-out -std=c99,$(CFLAGS))
+CXXFLAGS += $(CXXFLAGS_MOD)
+ifneq ($(SRC_CXX)$(SRC_MOD_CXX),)
+LIBSTDCPP_FILE_NAME = "$(shell $(CXX) $(CXXFLAGS) -print-file-name=libstdc++.a)"
+LDFLAGS += -L"$(shell dirname $(LIBSTDCPP_FILE_NAME))"
+endif
+
SRC_C = \
main.c \
modutime.c \
@@ -70,6 +82,10 @@ SRC_C = \
shared/runtime/pyexec.c \
shared/runtime/stdout_helpers.c \
+SRC_C += $(SRC_MOD)
+
+SRC_CXX += $(SRC_MOD_CXX)
+
ifeq ($(MCU_SERIES),SAMD21)
SRC_S = shared/runtime/gchelper_m0.s
else
@@ -77,10 +93,11 @@ SRC_S = shared/runtime/gchelper_m3.s
endif
# List of sources for qstr extraction
-SRC_QSTR += modutime.c modmachine.c
+SRC_QSTR += modutime.c modmachine.c $(SRC_MOD) $(SRC_CXX)
OBJ += $(PY_O)
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
+OBJ += $(addprefix $(BUILD)/, $(SRC_CXX:.cpp=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
# Workaround for bug in older gcc, warning on "static usbd_device_t _usbd_dev = { 0 };"
diff --git a/ports/samd/main.c b/ports/samd/main.c
index 1c72f04ab..5d84a9e88 100644
--- a/ports/samd/main.c
+++ b/ports/samd/main.c
@@ -87,6 +87,11 @@ void nlr_jump_fail(void *val) {
}
}
+void abort(void) {
+ for (;;) {
+ }
+}
+
#ifndef NDEBUG
void MP_WEAK __assert_func(const char *file, int line, const char *func, const char *expr) {
mp_printf(MP_PYTHON_PRINTER, "Assertion '%s' failed, at file %s:%d\n", expr, file, line);
diff --git a/ports/samd/sections.ld b/ports/samd/sections.ld
index cbcad463d..743e70a30 100644
--- a/ports/samd/sections.ld
+++ b/ports/samd/sections.ld
@@ -11,10 +11,20 @@ SECTIONS
*(.rodata*)
. = ALIGN(4);
_etext = .;
- _sidata = _etext;
} >FLASH
- .data : AT ( _sidata )
+ /* For C++ exception handling */
+ .ARM :
+ {
+ __exidx_start = .;
+ *(.ARM.exidx*)
+ __exidx_end = .;
+ } >FLASH
+
+ /* Used by the start-up code to initialise data */
+ _sidata = LOADADDR(.data);
+
+ .data :
{
. = ALIGN(4);
_sdata = .;
@@ -22,7 +32,7 @@ SECTIONS
*(.data*)
. = ALIGN(4);
_edata = .;
- } >RAM
+ } >RAM AT> FLASH
.bss :
{