-
Notifications
You must be signed in to change notification settings - Fork 3k
Description
Description
#10818 Highlighted a failure of the wait_ns
test when it is compiled with ARMC6 and run on NRF52_DK.
On my setup, a Mac, the test doesn't fail out of the box; it fails when compiled with the following flags that replicates the one used within the CI:
-DMBED_HEAP_STATS_ENABLED=1 -DMBED_STACK_STATS_ENABLED=1 -DMBED_TRAP_ERRORS_ENABLED=1 -DMBED_CPU_STATS_ENABLED -DMBED_THREAD_STATS_ENABLED -DMBED_SYS_STATS_ENABLED -DMBED_ALL_STATS_ENABLED
On @LDong-Arm setup (a linux installation); it fails out of the box without adding extra flags to mbed test -n mbed-os-tests-mbed_platform-wait_ns
. On both setup ARM compiler 6 version 11 has been used. (Note: version 12 fail as well).
When the duration tested is changed - I've tried from 20ms to 5s - the drift remain constant: 1.64% of the duration expected. The test fails with the same ratio whether lp ticker or us ticker is used to track the time.
The test results seems also highly dependent on compilation options and what is put in the binary:
- The test always succeeds when
-O0
or-O2
is used. It fails only with-Os
. - Adding extra cases makes the test pass
// replace
Case cases[] = {
#if DEVICE_LPTICKER
Case("Test: wait_ns - compare with lp_timer 1s", test_wait_ns_time_measurement<1000, LowPowerTimer>),
#endif
Case("Test: wait_ns - compare with us_timer 1s", test_wait_ns_time_measurement<1000, Timer>)
};
// with
Case cases[] = {
#if DEVICE_LPTICKER
Case("Test: wait_ns - compare with lp_timer 1s", test_wait_ns_time_measurement<1000, LowPowerTimer>),
#endif
Case("Test: wait_ns - compare with us_timer 1s", test_wait_ns_time_measurement<1000, Timer>),
#if DEVICE_LPTICKER
Case("Test: wait_ns - compare with lp_timer 1s", test_wait_ns_time_measurement<1000, LowPowerTimer>),
#endif
Case("Test: wait_ns - compare with us_timer 1s", test_wait_ns_time_measurement<1000, Timer>)
};
- Using a plain function instead of the assembly array used by
wait_ns
makes the test pass.
void delay_loop(uint32_t count) {
while (--count) {
__NOP();
__NOP();
}
}
Issue request type
[ ] Question
[ ] Enhancement
[x] Bug
@kjbracey-arm Do you have any idea of what may be going on here ?