altos: Replace __critical usage with ao_arch_critical as needed
[fw/altos] / src / stm / ao_arch.h
index 484ce89eb5892232e4109ea232a66cffeba3614f..0c3cfc915f9513813a1153041249746d5e0c1bb9 100644 (file)
  * STM32L definitions and code fragments for AltOS
  */
 
-#define AO_STACK_SIZE  668
+#define AO_STACK_SIZE  512
 
 #define AO_LED_TYPE    uint16_t
 
+#ifndef AO_TICK_TYPE
+#define AO_TICK_TYPE   uint16_t
+#define AO_TICK_SIGNED int16_t
+#endif
+
 /* Various definitions to make GCC look more like SDCC */
 
 #define ao_arch_naked_declare  __attribute__((naked))
@@ -38,7 +43,6 @@
 #define __xdata
 #define __code const
 #define __reentrant
-#define __critical
 #define __interrupt(n)
 #define __at(n)
 
@@ -78,8 +82,29 @@ extern const uint32_t ao_radio_cal;
 #define ao_arch_task_members\
        uint32_t *sp;                   /* saved stack pointer */
 
-#define cli()  asm("cpsid i")
-#define sei()  asm("cpsie i")
+#define ao_arch_block_interrupts()     asm("cpsid i")
+#define ao_arch_release_interrupts()   asm("cpsie i")
+
+#define cli()  ao_arch_block_interrupts()
+#define sei()  ao_arch_release_interrupts()
+
+static uint32_t
+ao_arch_irqsave(void) {
+       uint32_t        primask;
+       asm("mrs %0,primask" : "=&r" (primask));
+       ao_arch_block_interrupts();
+       return primask;
+}
+
+static void
+ao_arch_irqrestore(uint32_t primask) {
+       asm("msr primask,%0" : : "r" (primask));
+}
+
+static void
+ao_arch_memory_barrier() {
+       asm volatile("" ::: "memory");
+}
 
 #define ao_arch_init_stack(task, start) do {                           \
                uint32_t        *sp = (uint32_t *) (task->stack + AO_STACK_SIZE); \
@@ -138,7 +163,7 @@ extern const uint32_t ao_radio_cal;
 
 
 #define ao_arch_cpu_idle() do {                        \
-               asm("wfi");             \
+               asm(".global ao_idle_loc\n\twfi\nao_idle_loc:");        \
        } while (0)
 
 #define ao_arch_restore_stack() do { \