summaryrefslogtreecommitdiff
path: root/ports/atmel-samd
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-12-07 15:34:43 -0500
committerGitHub <noreply@github.com>2018-12-07 15:34:43 -0500
commit2fbaceb2b15ff7d2c368a6cf4dfc10881f5979e7 (patch)
tree60210206b73c579e74288333a3ecc4e8f233dd1b /ports/atmel-samd
parent481c4954afd161448aa37d353fa577d409d880c6 (diff)
parent89ef6eef575501e736ae528f13d9979e1302be63 (diff)
Merge pull request #1294 from tannewt/stack_check4.0.0-alpha.4
Add stack validity check and raise an error when it happens.
Diffstat (limited to 'ports/atmel-samd')
-rw-r--r--ports/atmel-samd/background.c11
-rw-r--r--ports/atmel-samd/background.h1
-rw-r--r--ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/arduino_zero/mpconfigboard.h3
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h3
-rw-r--r--ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h1
-rwxr-xr-xports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h1
-rw-r--r--ports/atmel-samd/boards/gemma_m0/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h1
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/meowmeow/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h1
-rw-r--r--ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/trinket_m0/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h1
-rw-r--r--ports/atmel-samd/common-hal/nvm/ByteArray.c3
-rw-r--r--ports/atmel-samd/mpconfigport.h11
-rw-r--r--ports/atmel-samd/supervisor/port.c67
29 files changed, 87 insertions, 51 deletions
diff --git a/ports/atmel-samd/background.c b/ports/atmel-samd/background.c
index 099cb8b23..94763bc43 100644
--- a/ports/atmel-samd/background.c
+++ b/ports/atmel-samd/background.c
@@ -29,11 +29,15 @@
#include "tick.h"
#include "supervisor/usb.h"
+#include "py/runtime.h"
#include "shared-module/displayio/__init__.h"
#include "shared-module/network/__init__.h"
+#include "supervisor/shared/stack.h"
volatile uint64_t last_finished_tick = 0;
+bool stack_ok_so_far = true;
+
void run_background_tasks(void) {
#if (defined(SAMD21) && defined(PIN_PA02)) || defined(SAMD51)
audio_dma_background();
@@ -41,6 +45,7 @@ void run_background_tasks(void) {
#ifdef CIRCUITPY_DISPLAYIO
displayio_refresh_display();
#endif
+
#if MICROPY_PY_NETWORK
network_module_background();
#endif
@@ -49,6 +54,12 @@ void run_background_tasks(void) {
last_finished_tick = ticks_ms;
}
+void run_background_vm_tasks(void) {
+ assert_heap_ok();
+ run_background_tasks();
+ assert_heap_ok();
+}
+
bool background_tasks_ok(void) {
return ticks_ms - last_finished_tick < 1000;
}
diff --git a/ports/atmel-samd/background.h b/ports/atmel-samd/background.h
index e841049a4..8d1316e73 100644
--- a/ports/atmel-samd/background.h
+++ b/ports/atmel-samd/background.h
@@ -30,6 +30,7 @@
#include <stdbool.h>
void run_background_tasks(void);
+void run_background_vm_tasks(void);
bool background_tasks_ok(void);
#endif // MICROPY_INCLUDED_ATMEL_SAMD_BACKGROUND_H
diff --git a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
index 1e8d926fd..1deda871a 100644
--- a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
+++ b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h
@@ -5,6 +5,8 @@
#define MICROPY_PORT_B (0)
#define MICROPY_PORT_C (0)
+#define MICROPY_HW_LED_STATUS (&pin_PB23)
+
#define CIRCUITPY_INTERNAL_NVM_SIZE 0
#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000)
diff --git a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
index 9a6256c68..7ab09d447 100644
--- a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
+++ b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h
@@ -1,7 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Arduino Zero"
#define MICROPY_HW_MCU_NAME "samd21g18"
-// #define MICROPY_HW_LED_MSC &pin_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_LED_TX &pin_PA27
#define MICROPY_HW_LED_RX &pin_PB03
diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
index 2ad13e81c..e6a7e0676 100644
--- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit CircuitPlayground Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
// Don't allow touch on A0 (PA02), because it's connected to the speaker.
#define PA02_NO_TOUCH (true)
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
index 250300858..e66d9c40e 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit CircuitPlayground Express with Crickit libraries"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
// No framebuf on CRICKit version to save space.
#define MICROPY_PY_FRAMEBUF (0)
diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
index c28c4aafb..787a3ee55 100644
--- a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h
@@ -1,5 +1,6 @@
// LEDs
-//#define MICROPY_HW_LED_MSC PIN_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Adalogger"
#define MICROPY_HW_MCU_NAME "samd21g18"
diff --git a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
index d66efb36f..2a21b8f02 100644
--- a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h
@@ -1,5 +1,5 @@
// LEDs
-//#define MICROPY_HW_LED_MSC PIN_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Basic"
#define MICROPY_HW_MCU_NAME "samd21g18"
diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
index 1f02ee995..7c10a92ec 100644
--- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08
diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h
index b5544e253..abbf0b08c 100644
--- a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 Express with Crickit libraries"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08
diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
index c385a97ea..a0f79ed72 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h
@@ -1,5 +1,5 @@
// LEDs
-//#define MICROPY_HW_LED_MSC PIN_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 RFM69"
#define MICROPY_HW_MCU_NAME "samd21g18"
diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
index 1e3a0bda0..85c24bfd0 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h
@@ -1,5 +1,5 @@
// LEDs
-//#define MICROPY_HW_LED_MSC PIN_PA17 // red
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_BOARD_NAME "Adafruit Feather M0 RFM9x"
#define MICROPY_HW_MCU_NAME "samd21g18"
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
index 6bf1df156..5ad265bf1 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.h
@@ -3,6 +3,8 @@
#define MICROPY_HW_BOARD_NAME "Hacked Feather M0 Express with 8Mbyte SPI flash"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define MICROPY_HW_NEOPIXEL (&pin_PA06)
#define SPI_FLASH_MOSI_PIN &pin_PA08
diff --git a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
index 98906a844..ed1dfe763 100644
--- a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h
@@ -5,6 +5,7 @@
// Rev E
+#define MICROPY_HW_LED_STATUS (&pin_PA23)
#define MICROPY_HW_NEOPIXEL (&pin_PB03)
// These are pins not to reset.
diff --git a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
index c4e025178..7df31f3a9 100755
--- a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
+++ b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.h
@@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Feather RadioFruit Zigbee"
#define MICROPY_HW_MCU_NAME "samr21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA27)
#define MICROPY_HW_NEOPIXEL (&pin_PA22)
#define SPI_FLASH_MOSI_PIN &pin_PA31
diff --git a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
index 08d1803f2..59e0b3c61 100644
--- a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
+++ b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Gemma M0"
#define MICROPY_HW_MCU_NAME "samd21e18"
+#define MICROPY_HW_LED_STATUS (&pin_PA23)
+
#define MICROPY_HW_APA102_MOSI (&pin_PA00)
#define MICROPY_HW_APA102_SCK (&pin_PA01)
diff --git a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
index 57078eaea..e1bef0019 100644
--- a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h
@@ -5,6 +5,8 @@
// This is for Rev B which is green and has the SD card slot at the edge of the board.
+#define MICROPY_HW_LED_STATUS (&pin_PB01)
+
#define MICROPY_HW_LED_TX &(pin_PC30)
#define MICROPY_HW_LED_RX &(pin_PC31)
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
index 5869c01ff..1a570092b 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h
@@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "HalloWing M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA23)
#define MICROPY_HW_NEOPIXEL (&pin_PA12)
#define SPI_FLASH_MOSI_PIN &pin_PB10
diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
index 4de28d388..530e7e4c3 100644
--- a/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/itsybitsy_m0_express/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Adafruit ItsyBitsy M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
+
#define CIRCUITPY_BITBANG_APA102
#define MICROPY_HW_APA102_MOSI (&pin_PA01)
#define MICROPY_HW_APA102_SCK (&pin_PA00)
diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
index 5bbfec9ce..f4d17ac64 100644
--- a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.h
@@ -4,6 +4,8 @@
#define CIRCUITPY_MCU_FAMILY samd51
// This is for Rev B
+#define MICROPY_HW_LED_STATUS (&pin_PA22)
+
#define MICROPY_HW_APA102_MOSI (&pin_PB03)
#define MICROPY_HW_APA102_SCK (&pin_PB02)
diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
index f07eb9cce..fe741a0f7 100644
--- a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
+++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h
@@ -1,6 +1,8 @@
#define MICROPY_HW_BOARD_NAME "Meow Meow"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PB23)
+
// These are pins not to reset.
#define MICROPY_PORT_A (0)
#define MICROPY_PORT_B (0)
diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
index f08d129dc..4835ee7d2 100644
--- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h
@@ -1,6 +1,7 @@
#define MICROPY_HW_BOARD_NAME "Adafruit Metro M0 Express"
#define MICROPY_HW_MCU_NAME "samd21g18"
+#define MICROPY_HW_LED_STATUS (&pin_PA17)
#define MICROPY_HW_LED_TX &pin_PA27
// Comment this out if you have trouble connecting over SWD. It's one of the SWD pins.
#define MICROPY_HW_LED_RX &pin_PA31
diff --git a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
index 06feb1a22..073468899 100644
--- a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h
@@ -8,6 +8,8 @@
#define MICROPY_HW_LED_TX (&pin_PA27)
#define MICROPY_HW_LED_RX (&pin_PB06)
+#define MICROPY_HW_LED_STATUS (&pin_PA16)
+
#define MICROPY_HW_NEOPIXEL (&pin_PB22)
// These are pins not to reset.
diff --git a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
index 338e8b7c9..cd754924e 100644
--- a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
+++ b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.h
@@ -3,6 +3,8 @@
#define CIRCUITPY_MCU_FAMILY samd51
+#define MICROPY_HW_LED_STATUS (&pin_PA15)
+
// RGB Status LED Pins
#define MICROPY_HW_APA102_MOSI (&pin_PB03)
#define MICROPY_HW_APA102_SCK (&pin_PB02)
diff --git a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
index c311f540c..cef35983e 100644
--- a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
+++ b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h
@@ -2,6 +2,8 @@
#define MICROPY_HW_MCU_NAME "samd21e18"
// Rev B - Black
+#define MICROPY_HW_LED_STATUS (&pin_PA10)
+
#define MICROPY_HW_APA102_MOSI (&pin_PA00)
#define MICROPY_HW_APA102_SCK (&pin_PA01)
diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
index dfbd873b6..369d84b8b 100644
--- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
+++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.h
@@ -2,6 +2,7 @@
#define MICROPY_HW_MCU_NAME "samd21e18"
// Rev B - Black
+#define MICROPY_HW_LED_STATUS (&pin_PA10)
// #define MICROPY_HW_APA102_MOSI (&pin_PA00)
// #define MICROPY_HW_APA102_SCK (&pin_PA01)
diff --git a/ports/atmel-samd/common-hal/nvm/ByteArray.c b/ports/atmel-samd/common-hal/nvm/ByteArray.c
index ab9cd7d80..12a127f53 100644
--- a/ports/atmel-samd/common-hal/nvm/ByteArray.c
+++ b/ports/atmel-samd/common-hal/nvm/ByteArray.c
@@ -28,6 +28,8 @@
#include "hal_flash.h"
+#include "supervisor/shared/stack.h"
+
#include <stdint.h>
#include <string.h>
@@ -42,6 +44,7 @@ bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t *self,
struct flash_descriptor desc;
desc.dev.hw = NVMCTRL;
flash_write(&desc, (uint32_t) self->start_address + start_index, values, len);
+ assert_heap_ok();
return true;
}
diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h
index 8df56ec4e..4fc32157c 100644
--- a/ports/atmel-samd/mpconfigport.h
+++ b/ports/atmel-samd/mpconfigport.h
@@ -182,7 +182,7 @@ typedef long mp_off_t;
#define MICROPY_PY_SYS_PLATFORM "MicroChip SAMD51"
#define PORT_HEAP_SIZE (0x20000) // 128KiB
#define SPI_FLASH_MAX_BAUDRATE 24000000
-#define CIRCUITPY_DEFAULT_STACK_SIZE 8192
+#define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000
#define MICROPY_CPYTHON_COMPAT (1)
#define MICROPY_MODULE_WEAK_LINKS (1)
#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (1)
@@ -432,10 +432,6 @@ extern const struct _mp_obj_module_t wiznet_module;
#define MP_STATE_PORT MP_STATE_VM
-void run_background_tasks(void);
-#define MICROPY_VM_HOOK_LOOP run_background_tasks();
-#define MICROPY_VM_HOOK_RETURN run_background_tasks();
-
#include "peripherals/samd/dma.h"
#include "supervisor/flash_root_pointers.h"
@@ -454,6 +450,11 @@ void run_background_tasks(void);
mp_obj_t gamepad_singleton; \
NETWORK_ROOT_POINTERS \
+void run_background_tasks(void);
+void run_background_vm_tasks(void);
+#define MICROPY_VM_HOOK_LOOP run_background_vm_tasks();
+#define MICROPY_VM_HOOK_RETURN run_background_vm_tasks();
+#define CIRCUITPY_SUPERVISOR_BACKGROUND run_background_tasks();
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt"
diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c
index 9f951b035..941838618 100644
--- a/ports/atmel-samd/supervisor/port.c
+++ b/ports/atmel-samd/supervisor/port.c
@@ -64,6 +64,9 @@
#include "reset.h"
#include "tick.h"
+#include "supervisor/shared/safe_mode.h"
+#include "supervisor/shared/stack.h"
+
#include "tusb.h"
#ifdef CIRCUITPY_GAMEPAD_TICKS
@@ -80,7 +83,7 @@ extern volatile bool mp_msc_enabled;
#define TRACE_BUFFER_SIZE (1 << (TRACE_BUFFER_MAGNITUDE_PACKETS + 1))
// Size in bytes. 4 bytes per uint32_t.
#define TRACE_BUFFER_SIZE_BYTES (TRACE_BUFFER_SIZE << 2)
-__attribute__((__aligned__(TRACE_BUFFER_SIZE_BYTES))) uint32_t mtb[TRACE_BUFFER_SIZE];
+__attribute__((__aligned__(TRACE_BUFFER_SIZE_BYTES))) uint32_t mtb[TRACE_BUFFER_SIZE] = {0};
#endif
safe_mode_t port_init(void) {
@@ -153,35 +156,6 @@ safe_mode_t port_init(void) {
samd_peripherals_enable_cache();
#endif
-// On power on start or external reset, set _ezero to the canary word. If it
-// gets killed, we boot in safe mode. _ezero is the boundary between statically
-// allocated memory including the fixed MicroPython heap and the stack. If either
-// misbehaves, the canary will not be intact after soft reset.
-#ifdef CIRCUITPY_CANARY_WORD
-#ifdef SAMD21
- bool power_on_or_external_reset = hri_pm_get_RCAUSE_POR_bit(PM) || hri_pm_get_RCAUSE_EXT_bit(PM);
- bool system_reset = hri_pm_get_RCAUSE_SYST_bit(PM);
-#endif
-#ifdef SAMD51
- bool power_on_or_external_reset = hri_rstc_get_RCAUSE_POR_bit(RSTC) || hri_rstc_get_RCAUSE_EXT_bit(RSTC);
- bool system_reset = hri_rstc_get_RCAUSE_SYST_bit(RSTC);
-#endif
- if (power_on_or_external_reset) {
- _ezero = CIRCUITPY_CANARY_WORD;
- } else if (system_reset) {
- // If we're starting from a system reset we're likely coming from the
- // bootloader or hard fault handler. If we're coming from the handler
- // the canary will be CIRCUITPY_SAFE_RESTART_WORD and we don't want to
- // revive the canary so that a second hard fault won't restart. Resets
- // from anywhere else are ok.
- if (_ezero == CIRCUITPY_SAFE_RESTART_WORD) {
- _ezero = ~CIRCUITPY_CANARY_WORD;
- } else {
- _ezero = CIRCUITPY_CANARY_WORD;
- }
- }
-#endif
-
#ifdef SAMD21
hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, 2);
_pm_init();
@@ -200,13 +174,6 @@ safe_mode_t port_init(void) {
// Init the board last so everything else is ready
board_init();
- #ifdef CIRCUITPY_CANARY_WORD
- // Run in safe mode if the canary is corrupt.
- if (_ezero != CIRCUITPY_CANARY_WORD) {
- return HARD_CRASH;
- }
- #endif
-
#ifdef SAMD21
if (PM->RCAUSE.bit.BOD33 == 1 || PM->RCAUSE.bit.BOD12 == 1) {
return BROWNOUT;
@@ -280,15 +247,33 @@ void reset_to_bootloader(void) {
reset();
}
+void reset_cpu(void) {
+ reset();
+}
+
+extern uint32_t _ebss;
+// Place the word to save just after our BSS section that gets blanked.
+void port_set_saved_word(uint32_t value) {
+ _ebss = value;
+}
+
+uint32_t port_get_saved_word(void) {
+ return _ebss;
+}
+
/**
* \brief Default interrupt handler for unused IRQs.
*/
__attribute__((used)) void HardFault_Handler(void)
{
+#ifdef ENABLE_MICRO_TRACE_BUFFER
+ // Turn off the micro trace buffer so we don't fill it up in the infinite
+ // loop below.
+ REG_MTB_MASTER = 0x00000000 + 6;
+#endif
+
+ reset_into_safe_mode(HARD_CRASH);
while (true) {
- asm("");
- }
- for (uint32_t i = 0; i < 100000; i++) {
- asm("noop;");
+ asm("nop;");
}
}