From df3ce87e020f7bf31bd2d89c6686a8b2f5a30e37 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 7 Jul 2018 09:59:10 +1000 Subject: [PATCH] HAL_ChibiOS: implement thread_create() --- libraries/AP_HAL_ChibiOS/Scheduler.cpp | 57 ++++++++++++++++++++++++++ libraries/AP_HAL_ChibiOS/Scheduler.h | 6 +++ 2 files changed, 63 insertions(+) diff --git a/libraries/AP_HAL_ChibiOS/Scheduler.cpp b/libraries/AP_HAL_ChibiOS/Scheduler.cpp index a0d67e7f1d..8c58c048ec 100644 --- a/libraries/AP_HAL_ChibiOS/Scheduler.cpp +++ b/libraries/AP_HAL_ChibiOS/Scheduler.cpp @@ -435,4 +435,61 @@ void Scheduler::restore_interrupts(void *state) chSysRestoreStatusX((syssts_t)(uintptr_t)state); } +/* + trampoline for thread create +*/ +void Scheduler::thread_create_trampoline(void *ctx) +{ + AP_HAL::MemberProc *t = (AP_HAL::MemberProc *)ctx; + (*t)(); + free(t); +} + +/* + create a new thread +*/ +bool Scheduler::thread_create(AP_HAL::MemberProc proc, const char *name, uint32_t stack_size, priority_base base, int8_t priority) +{ + // take a copy of the MemberProc, it is freed after thread exits + AP_HAL::MemberProc *tproc = (AP_HAL::MemberProc *)malloc(sizeof(proc)); + if (!tproc) { + return false; + } + *tproc = proc; + + uint8_t thread_priority = APM_IO_PRIORITY; + static const struct { + priority_base base; + uint8_t p; + } priority_map[] = { + { PRIORITY_BOOST, APM_MAIN_PRIORITY_BOOST}, + { PRIORITY_MAIN, APM_MAIN_PRIORITY}, + { PRIORITY_SPI, APM_SPI_PRIORITY}, + { PRIORITY_I2C, APM_I2C_PRIORITY}, + { PRIORITY_CAN, APM_CAN_PRIORITY}, + { PRIORITY_TIMER, APM_TIMER_PRIORITY}, + { PRIORITY_RCIN, APM_RCIN_PRIORITY}, + { PRIORITY_IO, APM_IO_PRIORITY}, + { PRIORITY_UART, APM_UART_PRIORITY}, + { PRIORITY_STORAGE, APM_STORAGE_PRIORITY}, + }; + for (uint8_t i=0; i