This reserves 512 bytes of memory for a stack, then makes sure that
exceptions continue to use that stack while processes use the per-task
stack.
Signed-off-by: Keith Packard <keithp@keithp.com>
ao_cur_task_index = AO_NO_TASK_INDEX;
#endif
ao_cur_task = NULL;
ao_cur_task_index = AO_NO_TASK_INDEX;
#endif
ao_cur_task = NULL;
+#if HAS_ARCH_START_SCHEDULER
+ ao_arch_start_scheduler();
+#endif
MEMORY {
rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K
MEMORY {
rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K
- ram (!w) : ORIGIN = 0x20000000, LENGTH = 16K
+ ram (!w) : ORIGIN = 0x20000000, LENGTH = 15872
+ stack (!w) : ORIGIN = 0x20003e00, LENGTH = 512
- PROVIDE(__stack__ = ORIGIN(ram) + LENGTH(ram));
+
+ PROVIDE(__stack__ = ORIGIN(stack) + LENGTH(stack));
+#define HAS_ARCH_START_SCHEDULER 1
+
+static inline void ao_arch_start_scheduler(void) {
+ uint32_t sp;
+ uint32_t control;
+
+ asm("mrs %0,msp" : "=&r" (sp));
+ asm("msr psp,%0" : : "r" (sp));
+ asm("mrs %0,control" : "=&r" (control));
+ control |= (1 << 1);
+ asm("msr control,%0" : : "r" (control));
+}
+
#define ao_arch_isr_stack()
#define ao_arch_wait_interrupt() do { \
#define ao_arch_isr_stack()
#define ao_arch_wait_interrupt() do { \