Skip to content

testing/sched: fix invalid timerjitter results - #3675

Open
Zepp-Hanzj wants to merge 1 commit into
apache:masterfrom
Zepp-Hanzj:fix/timerjitter-invalid-results
Open

testing/sched: fix invalid timerjitter results#3675
Zepp-Hanzj wants to merge 1 commit into
apache:masterfrom
Zepp-Hanzj:fix/timerjitter-invalid-results

Conversation

@Zepp-Hanzj

Copy link
Copy Markdown
Contributor

Summary

  • preserve the original 1 ms default interval when possible, while raising it to USEC_PER_TICK on lower-resolution systems
  • round up the default iteration count so the default run always collects at least one sample
  • reject intervals below the system tick and reject zero iterations
  • keep minimum and maximum jitter values signed
  • aggregate missed-frame reporting after the measurement instead of printing inside the catch-up loop

Fixes #3634

Root cause

The default interval was changed from 1000 us to 1000 * USEC_PER_TICK. With a 10 ms system tick this becomes 10 seconds, so USEC_PER_SEC / DEFAULT_INTERVAL evaluates to zero. The test then reports an uninitialized minimum and divides the accumulated latency by zero.

A requested interval below USEC_PER_TICK cannot be represented by the tick-based POSIX timer. The timer expires at tick resolution while timerjitter advances its expected timestamp by the smaller requested interval. This produces many missed frames. Printing every missed frame from the catch-up loop adds serial I/O latency and can create still more missed frames.

The measured difference is an int64_t, but the minimum and maximum fields were unsigned long. Assigning a negative difference to these fields wrapped it to a large positive value.

Hardware validation

The change was validated on real hardware with the following environment:

  • MCU: STM32F407ZG (Arm Cortex-M4F)
  • NuttX board configuration: stm32f407zg-p1
  • NuttX runtime: 13.0.0
  • Toolchain: arm-none-eabi-gcc 9.2.1 20191025
  • CONFIG_USEC_PER_TICK=10000
  • CONFIG_TESTING_TIMERJITTER=y
  • CONFIG_LIBC_FLOATINGPOINT=y

Before

The captured log reached 27 consecutive missed-frame messages:

NuttShell (NSH) NuttX-13.0.0
nsh> timerjitter
timer jitter in 0 run:
(latency/us) min: 4294967295, avg: nan, max 0
nsh> timerjitter 10000 10
timer jitter in 10 run:
(latency/us) min: 10000, avg: 10000, max 10000
nsh> timerjitter 100 5
time frame missed 1
time frame missed 2
time frame missed 3
time frame missed 4
time frame missed 5
time frame missed 6
time frame missed 7
time frame missed 8
time frame missed 9
time frame missed 10
time frame missed 11
time frame missed 12
time frame missed 13
time frame missed 14
time frame missed 15
time frame missed 16
time frame missed 17
time frame missed 18
time frame missed 19
time frame missed 20
time frame missed 21
time frame missed 22
time frame missed 23
time frame missed 24
time frame missed 25
time frame missed 26
time frame missed 27

After

NuttShell (NSH) NuttX-13.0.0
nsh> timerjitter
timer jitter in 100 run:
(latency/us) min: 10000, avg: 10000, max 10000
nsh> timerjitter -m 10000 10
timer jitter in 10 run:
(latency/us) min: 10000, avg: 10000, max 10000
nsh> timerjitter 100 5
interval must be at least 10000 us
nsh> timerjitter 10000 0
iteration must be greater than 0
nsh>

The 10000 us values are the expected tick-resolution behavior of this configuration; this change fixes invalid statistics and runaway reporting, not the target timer resolution.

Additional checks

  • nxstyle testing/sched/timerjitter/timerjitter.c
  • strict host compilation with -Wall -Wextra -Werror
  • complete STM32F407ZG NuttX build

Signed-off-by: hanzhijian <hanzhijian@zepp.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] testing/sched/timerjitter: unexpected results under normal usage

3 participants