]> code.bitgloo.com Git - clyne/stmdsp.git/commitdiff
fix fault handling; fix LEDs for rev2
authorClyne Sullivan <clyne@bitgloo.com>
Sat, 30 Oct 2021 20:49:20 +0000 (16:49 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Sat, 30 Oct 2021 20:49:20 +0000 (16:49 -0400)
source/board/board_l4.c
source/board/l4/board.h
source/conversion.cpp
source/conversion.hpp
source/handlers.cpp
source/monitor.cpp

index 31d1d518a1d5a2874decc0f66e2ca82bd3e66611..55af697e47b3399a6aceb3bbcc6d99f24e3928f2 100644 (file)
@@ -277,9 +277,12 @@ bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
  * @note    You can add your board-specific code here.\r
  */\r
 void boardInit(void) {\r
-    palSetLineMode(LINE_LED_GREEN, PAL_MODE_OUTPUT_PUSHPULL);\r
-    palSetLineMode(LINE_LED_YELLOW, PAL_MODE_OUTPUT_PUSHPULL);\r
     palSetLineMode(LINE_LED_RED, PAL_MODE_OUTPUT_PUSHPULL);\r
+    palSetLineMode(LINE_LED_GREEN, PAL_MODE_OUTPUT_PUSHPULL);\r
+    palSetLineMode(LINE_LED_BLUE, PAL_MODE_OUTPUT_PUSHPULL);\r
+    palClearLine(LINE_LED_RED);\r
+    palClearLine(LINE_LED_GREEN);\r
+    palClearLine(LINE_LED_BLUE);\r
 \r
     SCB->CPACR |= 0xF << 20; // Enable FPU\r
 \r
index e4dcf03cc393d8dd2862182f8a6c5d3d86e5b6db..4b2642a516820f41626f9348f60bb1f4ca10c348 100644 (file)
@@ -1502,8 +1502,8 @@ extern "C" {
 #endif\r
 #endif /* _FROM_ASM_ */\r
 \r
-#define LINE_LED_GREEN  PAL_LINE(GPIOC_BASE, 10U)\r
-#define LINE_LED_YELLOW PAL_LINE(GPIOC_BASE, 11U)\r
-#define LINE_LED_RED    PAL_LINE(GPIOC_BASE, 12U)\r
+#define LINE_LED_RED   PAL_LINE(GPIOC_BASE, 10U)\r
+#define LINE_LED_GREEN PAL_LINE(GPIOC_BASE, 11U)\r
+#define LINE_LED_BLUE  PAL_LINE(GPIOC_BASE, 12U)\r
 \r
 #endif /* BOARD_H */\r
index c9dc0c950e40125defd8138fc05e4e9f9db3f7f3..6fdea0778c97d43ea58301bfce39cfb9a87f5927 100644 (file)
@@ -83,11 +83,11 @@ thread_t *ConversionManager::getMonitorHandle()
     return m_thread_monitor;
 }
 
-void ConversionManager::abort()
+void ConversionManager::abort(bool fpu_stacked)
 {
     ELFManager::unload();
     EM.add(Error::ConversionAborted);
-    run_status = RunStatus::Recovering;
+    //run_status = RunStatus::Recovering;
 
     // Confirm that the exception return thread is the algorithm...
     uint32_t *psp;
@@ -104,7 +104,7 @@ void ConversionManager::abort()
         // We do this by rebuilding the thread's stacked exception return.
         auto newpsp = reinterpret_cast<uint32_t *>(m_thread_runner_stack.data() + 
                                                    m_thread_runner_stack.size() -
-                                                   8 * sizeof(uint32_t));
+                                                   (fpu_stacked ? 26 : 8) * sizeof(uint32_t));
         // Set the LR register to the thread's entry point.
         newpsp[5] = reinterpret_cast<uint32_t>(threadRunner);
         // Overwrite the instruction we'll return to with "bx lr" (jump to address in LR).
index 6af4972177bc82900fcc12830c7dbb8d90de01e4..a26dd199515bf033c25f69912ebf0d7014bbe177 100644 (file)
@@ -39,7 +39,7 @@ public:
     static thread_t *getMonitorHandle();
 
     // Internal only: Aborts a running conversion.
-    static void abort();
+    static void abort(bool fpu_stacked = true);
 
 private:
     static void threadMonitor(void *);
index 2ff948ddbe165823716420b7746b8b4c9c0b91d7..43e65c379cb0780661a4c3070f0e5f10fbd81dca 100644 (file)
@@ -108,7 +108,7 @@ void MemManage_Handler()
     asm("mov %0, lr" : "=r" (lr));
 
     // 2. Recover from the fault.
-    ConversionManager::abort();
+    ConversionManager::abort((lr & (1 << 4)) ? false : true);
 
     // 3. Return.
     asm("mov lr, %0; bx lr" :: "r" (lr));
index 08a62d5f0a276781aebfb1c02bea3c9138b1ac93..6ef97e93a44d96da2d305d618775f515ee7a0eb8 100644 (file)
@@ -39,30 +39,31 @@ void Monitor::threadMonitor(void *)
 #endif
     };
 
-    palClearLine(LINE_LED_RED);
-    palClearLine(LINE_LED_YELLOW);
+    palSetLine(LINE_LED_RED);
+    palSetLine(LINE_LED_GREEN);
+    palSetLine(LINE_LED_BLUE);
 
     while (1) {
         bool isidle = run_status == RunStatus::Idle;
-        auto led = isidle ? LINE_LED_GREEN : LINE_LED_YELLOW;
+        auto led = isidle ? LINE_LED_GREEN : LINE_LED_BLUE;
         auto delay = isidle ? 500 : 250;
 
-        palSetLine(led);
+        palToggleLine(led);
         chThdSleepMilliseconds(delay);
-        palClearLine(led);
+        palToggleLine(led);
         chThdSleepMilliseconds(delay);
 
-        if (run_status == RunStatus::Idle && readButton()) {
-            palSetLine(LINE_LED_RED);
-            palSetLine(LINE_LED_YELLOW);
+        if (isidle && readButton()) {
+            palClearLine(LINE_LED_GREEN);
+            palClearLine(LINE_LED_BLUE);
             chSysLock();
             while (readButton())
                 asm("nop");
             while (!readButton())
                 asm("nop");
             chSysUnlock();
-            palClearLine(LINE_LED_RED);
-            palClearLine(LINE_LED_YELLOW);
+            palSetLine(LINE_LED_GREEN);
+            palSetLine(LINE_LED_BLUE);
             chThdSleepMilliseconds(500);
         }
 
@@ -70,9 +71,9 @@ void Monitor::threadMonitor(void *)
         if (auto err = EM.hasError(); err ^ erroron) {
             erroron = err;
             if (err)
-                palSetLine(LINE_LED_RED);
-            else
                 palClearLine(LINE_LED_RED);
+            else
+                palSetLine(LINE_LED_RED);
         }
     }
 }