From 25e4abee7df52bd35688f6f9d25f9a9140cba409 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 16 Jan 2021 09:20:23 +1100 Subject: [PATCH] Split power work into own thread Completely forseeable issue. Now that we have _more_ ram available, this is a good option to split power related items out into their own thread. --- .../TS100/Core/BSP/Miniware/fusb302b.cpp | 2 -- workspace/TS100/Core/Inc/main.hpp | 1 + workspace/TS100/Core/Src/main.cpp | 25 ++++++++++------- workspace/TS100/Core/Threads/MOVThread.cpp | 2 -- workspace/TS100/Core/Threads/POWThread.cpp | 27 +++++++++++++++++++ 5 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 workspace/TS100/Core/Threads/POWThread.cpp diff --git a/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp b/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp index fda41003..ac5cbe76 100644 --- a/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp +++ b/workspace/TS100/Core/BSP/Miniware/fusb302b.cpp @@ -244,8 +244,6 @@ void fusb_reset() { fusb_write_byte( FUSB_CONTROL0, 0x44); /* Flush the RX buffer */ fusb_write_byte( FUSB_CONTROL1, FUSB_CONTROL1_RX_FLUSH); - /* Reset the PD logic */ -// fusb_write_byte( FUSB_RESET, FUSB_RESET_PD_RESET); if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { I2CBB::unlock2(); } diff --git a/workspace/TS100/Core/Inc/main.hpp b/workspace/TS100/Core/Inc/main.hpp index ede22bd5..f3a4f49b 100755 --- a/workspace/TS100/Core/Inc/main.hpp +++ b/workspace/TS100/Core/Inc/main.hpp @@ -20,6 +20,7 @@ void vApplicationStackOverflowHook(TaskHandle_t *pxTask, void startGUITask(void const *argument); void startPIDTask(void const *argument); void startMOVTask(void const *argument); +void startPOWTask(void const *argument); extern TaskHandle_t pidTaskNotification; extern uint8_t accelInit; extern TickType_t lastMovementTime; diff --git a/workspace/TS100/Core/Src/main.cpp b/workspace/TS100/Core/Src/main.cpp index c638b0d8..14d27bb5 100755 --- a/workspace/TS100/Core/Src/main.cpp +++ b/workspace/TS100/Core/Src/main.cpp @@ -24,11 +24,17 @@ osThreadId PIDTaskHandle; static const size_t PIDTaskStackSize = 512 / 4; uint32_t PIDTaskBuffer[PIDTaskStackSize]; osStaticThreadDef_t PIDTaskControlBlock; + osThreadId MOVTaskHandle; static const size_t MOVTaskStackSize = 1024 / 4; uint32_t MOVTaskBuffer[MOVTaskStackSize]; osStaticThreadDef_t MOVTaskControlBlock; +osThreadId POWTaskHandle; +static const size_t POWTaskStackSize = 512 / 4; +uint32_t POWTaskBuffer[POWTaskStackSize]; +osStaticThreadDef_t POWTaskControlBlock; + // End FreeRTOS // Main sets up the hardware then hands over to the FreeRTOS kernel int main(void) { @@ -40,20 +46,21 @@ int main(void) { settingsWereReset = restoreSettings(); // load the settings from flash resetWatchdog(); /* Create the thread(s) */ - /* definition and creation of GUITask */ - osThreadStaticDef(GUITask, startGUITask, osPriorityBelowNormal, 0, - GUITaskStackSize, GUITaskBuffer, &GUITaskControlBlock); + /* definition and creation of POWTask - Power management for QC */ + osThreadStaticDef(POWTask, startPOWTask, osPriorityAboveNormal, 0, POWTaskStackSize, POWTaskBuffer, &POWTaskControlBlock); + POWTaskHandle = osThreadCreate(osThread(POWTask), NULL); + + /* definition and creation of GUITask - The OLED control & update*/ + osThreadStaticDef(GUITask, startGUITask, osPriorityBelowNormal, 0, GUITaskStackSize, GUITaskBuffer, &GUITaskControlBlock); GUITaskHandle = osThreadCreate(osThread(GUITask), NULL); - /* definition and creation of PIDTask */ - osThreadStaticDef(PIDTask, startPIDTask, osPriorityRealtime, 0, - PIDTaskStackSize, PIDTaskBuffer, &PIDTaskControlBlock); + /* definition and creation of PIDTask - Heating control*/ + osThreadStaticDef(PIDTask, startPIDTask, osPriorityRealtime, 0, PIDTaskStackSize, PIDTaskBuffer, &PIDTaskControlBlock); PIDTaskHandle = osThreadCreate(osThread(PIDTask), NULL); - osThreadStaticDef(MOVTask, startMOVTask, osPriorityNormal, 0, - MOVTaskStackSize, MOVTaskBuffer, &MOVTaskControlBlock); + /* definition and creation of MOVTask - Accelerometer management */ + osThreadStaticDef(MOVTask, startMOVTask, osPriorityNormal, 0, MOVTaskStackSize, MOVTaskBuffer, &MOVTaskControlBlock); MOVTaskHandle = osThreadCreate(osThread(MOVTask), NULL); - resetWatchdog(); /* Start scheduler */ diff --git a/workspace/TS100/Core/Threads/MOVThread.cpp b/workspace/TS100/Core/Threads/MOVThread.cpp index c26e4294..d9d5d160 100644 --- a/workspace/TS100/Core/Threads/MOVThread.cpp +++ b/workspace/TS100/Core/Threads/MOVThread.cpp @@ -107,7 +107,6 @@ inline void readAccelerometer(int16_t &tx, int16_t &ty, int16_t &tz, Orientation } } void startMOVTask(void const *argument __unused) { - postRToSInit(); detectAccelerometerVersion(); osDelay(TICKS_100MS / 2); // wait ~50ms for setup of accel to finalise lastMovementTime = 0; @@ -168,6 +167,5 @@ void startMOVTask(void const *argument __unused) { } osDelay(TICKS_100MS); // Slow down update rate - power_check(); } } diff --git a/workspace/TS100/Core/Threads/POWThread.cpp b/workspace/TS100/Core/Threads/POWThread.cpp new file mode 100644 index 00000000..f87fed87 --- /dev/null +++ b/workspace/TS100/Core/Threads/POWThread.cpp @@ -0,0 +1,27 @@ +/* + * POWThread.cpp + * + * Created on: 16 Jan 2021 + * Author: Ralim + */ + +#include "BSP.h" +#include "FreeRTOS.h" +#include "QC3.h" +#include "Settings.h" +#include "cmsis_os.h" +#include "main.hpp" +#include "stdlib.h" +#include "task.h" + +// Small worker thread to handle power (mostly QC) related steps + + + +void startPOWTask(void const *argument __unused) { + postRToSInit(); + for (;;) { + osDelay(TICKS_100MS); // Slow down update rate + power_check(); + } +}