Skip to content

Commit b32b996

Browse files
committed
Use us ticker for tickless on devs with wrapper
The low power ticker wrapper layer adds a large amount of interrupt latency. This can cause dropped bytes at a baud of 115200 on some devices. To prevent this by default use the microsecond ticker for tickless on devices which make use of the low power ticker wrapper.
1 parent c07410d commit b32b996

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

rtos/TARGET_CORTEX/mbed_rtx_idle.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "platform/mbed_power_mgmt.h"
2525
#include "TimerEvent.h"
2626
#include "lp_ticker_api.h"
27+
#include "us_ticker_api.h"
2728
#include "mbed_critical.h"
2829
#include "mbed_assert.h"
2930
#include <new>
@@ -35,7 +36,12 @@ extern "C" {
3536

3637
using namespace mbed;
3738

38-
#if (defined(MBED_TICKLESS) && DEVICE_LPTICKER)
39+
#ifdef MBED_TICKLESS
40+
41+
MBED_STATIC_ASSERT(!MBED_CONF_TARGET_TICKLESS_FROM_US_TICKER || DEVICE_USTICKER,
42+
"Microsecond ticker required when MBED_CONF_TARGET_TICKLESS_FROM_US_TICKER is true");
43+
MBED_STATIC_ASSERT(MBED_CONF_TARGET_TICKLESS_FROM_US_TICKER || DEVICE_LPTICKER,
44+
"Low power ticker required when MBED_CONF_TARGET_TICKLESS_FROM_US_TICKER is false");
3945

4046
#include "rtos/TARGET_CORTEX/SysTimer.h"
4147

@@ -47,7 +53,11 @@ extern "C" {
4753
{
4854
// Do not use SingletonPtr since this relies on the RTOS
4955
if (NULL == os_timer) {
50-
os_timer = new (os_timer_data) rtos::internal::SysTimer();
56+
#if MBED_CONF_TARGET_TICKLESS_FROM_US_TICKER
57+
os_timer = new (os_timer_data) rtos::internal::SysTimer(get_us_ticker_data());
58+
#else
59+
os_timer = new (os_timer_data) rtos::internal::SysTimer(get_lp_ticker_data());
60+
#endif
5161
os_timer->setup_irq();
5262
}
5363

@@ -94,7 +104,8 @@ extern "C" {
94104
static void default_idle_hook(void)
95105
{
96106
uint32_t ticks_to_sleep = osKernelSuspend();
97-
const bool block_deep_sleep = ticks_to_sleep <= MBED_CONF_TARGET_DEEP_SLEEP_LATENCY;
107+
const bool block_deep_sleep = MBED_CONF_TARGET_TICKLESS_FROM_US_TICKER ||
108+
(ticks_to_sleep <= MBED_CONF_TARGET_DEEP_SLEEP_LATENCY);
98109

99110
if (block_deep_sleep) {
100111
sleep_manager_lock_deep_sleep();

targets/targets.json

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
"default-form-factor": {
3939
"help": "Default form factor of this board taken from supported_form_factors. This must be a lowercase string such as 'arduino'",
4040
"value": null
41+
},
42+
"tickless-from-us-ticker": {
43+
"help": "Run tickless from the microsecond ticker rather than the low power ticker. Running tickless off of the microsecond ticker improves interrupt latency on targets which use lpticker_delay_ticks",
44+
"value": false
4145
}
4246
}
4347
},
@@ -1854,7 +1858,8 @@
18541858
}
18551859
},
18561860
"overrides": {
1857-
"deep-sleep-latency": 3
1861+
"deep-sleep-latency": 3,
1862+
"tickless-from-us-ticker": true
18581863
},
18591864
"device_has": [
18601865
"USTICKER",
@@ -7002,7 +7007,8 @@
70027007
"device_name": "NUC472HI8AE",
70037008
"bootloader_supported": true,
70047009
"overrides": {
7005-
"network-default-interface-type": "ETHERNET"
7010+
"network-default-interface-type": "ETHERNET",
7011+
"tickless-from-us-ticker": true
70067012
}
70077013
},
70087014
"NCS36510": {
@@ -7125,7 +7131,10 @@
71257131
],
71267132
"release_versions": ["2", "5"],
71277133
"device_name": "M453VG6AE",
7128-
"bootloader_supported": true
7134+
"bootloader_supported": true,
7135+
"overrides": {
7136+
"tickless-from-us-ticker": true
7137+
}
71297138
},
71307139
"NUMAKER_PFM_NANO130": {
71317140
"core": "Cortex-M0",
@@ -7187,7 +7196,10 @@
71877196
"SPI_ASYNCH"
71887197
],
71897198
"release_versions": ["5"],
7190-
"device_name": "NANO130KE3BN"
7199+
"device_name": "NANO130KE3BN",
7200+
"overrides": {
7201+
"tickless-from-us-ticker": true
7202+
}
71917203
},
71927204
"HI2110": {
71937205
"inherits": ["Target"],
@@ -7508,7 +7520,8 @@
75087520
"release_versions": ["5"],
75097521
"bootloader_supported": true,
75107522
"overrides": {
7511-
"network-default-interface-type": "ETHERNET"
7523+
"network-default-interface-type": "ETHERNET",
7524+
"tickless-from-us-ticker": true
75127525
}
75137526
},
75147527
"NUMAKER_PFM_M487": {
@@ -7745,7 +7758,8 @@
77457758
"detect_code": ["1305"],
77467759
"release_versions": ["5"],
77477760
"device_name": "M2351KIAAEES",
7748-
"bootloader_supported": true
7761+
"bootloader_supported": true,
7762+
"tickless-from-us-ticker": true
77497763
},
77507764
"TMPM3H6": {
77517765
"inherits": ["Target"],

0 commit comments

Comments
 (0)