* @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
#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
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;
// 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).
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 *);
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));
#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);
}
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);
}
}
}