summaryrefslogtreecommitdiff
path: root/src/systemtask
diff options
context:
space:
mode:
authorJean-François Milants <jf@codingfield.com>2021-06-10 19:20:27 (GMT)
committerJean-François Milants <jf@codingfield.com>2021-06-10 19:20:27 (GMT)
commitb1925ff28638dd4b8400c4d0c49d796d8990b1af (patch)
treeaf4bb0744ae1819ae53c73865fc74d46e2dbefd1 /src/systemtask
parentcaca6a5cff0025df80241a09baab28e49720ddf8 (diff)
Minor improvements: use std::make_unique when creating unique_ptr, check the code is running from an IRQ before calling xQueueSendFromISR or xQueueSend)
Diffstat (limited to 'src/systemtask')
-rw-r--r--src/systemtask/SystemTask.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index be484bb..4799624 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -27,6 +27,12 @@
using namespace Pinetime::System;
+namespace {
+ static inline bool in_isr(void) {
+ return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
+ }
+}
+
void IdleTimerCallback(TimerHandle_t xTimer) {
NRF_LOG_INFO("IdleTimerCallback");
@@ -392,12 +398,18 @@ void SystemTask::PushMessage(System::Messages msg) {
if (msg == Messages::GoToSleep) {
isGoingToSleep = true;
}
- BaseType_t xHigherPriorityTaskWoken;
- xHigherPriorityTaskWoken = pdFALSE;
- xQueueSendFromISR(systemTasksMsgQueue, &msg, &xHigherPriorityTaskWoken);
- if (xHigherPriorityTaskWoken) {
- /* Actual macro used here is port specific. */
- // TODO: should I do something here?
+
+ if(in_isr()) {
+ BaseType_t xHigherPriorityTaskWoken;
+ xHigherPriorityTaskWoken = pdFALSE;
+ xQueueSendFromISR(systemTasksMsgQueue, &msg, &xHigherPriorityTaskWoken);
+ if (xHigherPriorityTaskWoken) {
+ /* Actual macro used here is port specific. */
+ portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
+
+ }
+ } else {
+ xQueueSend(systemTasksMsgQueue, &msg, portMAX_DELAY);
}
}