equeue - avoid Kernel::get_ms_count from IRQ

Kernel::get_ms_count is documented as not working from IRQ.

In RTOS builds it can return misleading answers - see
https://github.com/ARM-software/CMSIS_5/issues/625

In non-RTOS builds, it can trigger an assert, as it upsets the
sleep logic.

Modified code is still not ideal - could be improved further if
there was a fast path for "post now" that didn't bother looking
at timers (both at post time and dispatch time).
pull/10104/head
Kevin Bracey 2019-07-10 10:25:40 +03:00
parent c98b0d0b03
commit 7442da30f9
1 changed files with 15 additions and 1 deletions

View File

@ -37,10 +37,24 @@ using namespace mbed;
#if MBED_CONF_RTOS_API_PRESENT
#include "rtos/Kernel.h"
#include "platform/mbed_os_timer.h"
unsigned equeue_tick()
{
return rtos::Kernel::get_ms_count();
// It is not safe to call get_ms_count from ISRs, both
// because documentation says so, and because it will give
// a stale value from the RTOS if the interrupt has woken
// us out of sleep - the RTOS will not have updated its
// ticks yet.
if (core_util_is_isr_active()) {
// And the documentation further says that this
// should not be called from critical sections, for
// performance reasons, but I don't have a good
// current alternative!
return mbed::internal::os_timer->get_time() / 1000;
} else {
return rtos::Kernel::get_ms_count();
}
}
#else