mirror of https://github.com/ARMmbed/mbed-os.git
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
parent
c98b0d0b03
commit
7442da30f9
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue