Skip to content

Commit 2983988

Browse files
committed
tracing: trace timer calls
Add tracing support for timer expiry and stop function callbacks, enabling measurement of callback execution duration and facilitating debugging of cases where callbacks take longer than expected. Signed-off-by: Vijay Sharma <[email protected]>
1 parent 8c13c07 commit 2983988

File tree

8 files changed

+166
-6
lines changed

8 files changed

+166
-6
lines changed

include/zephyr/tracing/tracing.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,30 @@
19111911
*/
19121912
#define sys_port_trace_k_timer_status_sync_exit(timer, result)
19131913

1914+
/**
1915+
* @brief Trace Timer expiry entry
1916+
* @param timer Timer object
1917+
*/
1918+
#define sys_port_trace_k_timer_expiry_enter(timer)
1919+
1920+
/**
1921+
* @brief Trace Timer expiry exit
1922+
* @param timer Timer object
1923+
*/
1924+
#define sys_port_trace_k_timer_expiry_exit(timer)
1925+
1926+
/**
1927+
* @brief Trace Timer stop function expiry entry
1928+
* @param timer Timer object
1929+
*/
1930+
#define sys_port_trace_k_timer_stop_fn_expiry_enter(timer)
1931+
1932+
/**
1933+
* @brief Trace Timer stop function expiry exit
1934+
* @param timer Timer object
1935+
*/
1936+
#define sys_port_trace_k_timer_stop_fn_expiry_exit(timer)
1937+
19141938
/** @} */ /* end of subsys_tracing_apis_timer */
19151939

19161940
/**

kernel/timer.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,13 @@ void z_timer_expiration_handler(struct _timeout *t)
8484
if (timer->expiry_fn != NULL) {
8585
/* Unlock for user handler. */
8686
k_spin_unlock(&lock, key);
87+
88+
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_timer, expiry, timer);
89+
8790
timer->expiry_fn(timer);
91+
92+
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_timer, expiry, timer);
93+
8894
key = k_spin_lock(&lock);
8995
}
9096

@@ -207,7 +213,11 @@ void z_impl_k_timer_stop(struct k_timer *timer)
207213
}
208214

209215
if (timer->stop_fn != NULL) {
216+
SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_timer, stop_fn_expiry, timer);
217+
210218
timer->stop_fn(timer);
219+
220+
SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_timer, stop_fn_expiry, timer);
211221
}
212222

213223
if (IS_ENABLED(CONFIG_MULTITHREADING)) {

subsys/tracing/ctf/tracing_ctf.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,10 @@ extern "C" {
180180
sys_trace_k_timer_status_sync_blocking(timer, timeout)
181181
#define sys_port_trace_k_timer_status_sync_exit(timer, result) \
182182
sys_trace_k_timer_status_sync_exit(timer, result)
183+
#define sys_port_trace_k_timer_expiry_enter(timer)
184+
#define sys_port_trace_k_timer_expiry_exit(timer)
185+
#define sys_port_trace_k_timer_stop_fn_expiry_enter(timer)
186+
#define sys_port_trace_k_timer_stop_fn_expiry_exit(timer)
183187

184188
#define sys_port_trace_k_condvar_init(condvar, ret)
185189
#define sys_port_trace_k_condvar_signal_enter(condvar)

subsys/tracing/sysview/tracing_sysview.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,11 @@ void sys_trace_thread_info(struct k_thread *thread);
636636
#define sys_port_trace_k_timer_status_sync_exit(timer, result) \
637637
SEGGER_SYSVIEW_RecordEndCallU32(TID_TIMER_STATUS_SYNC, (uint32_t)result)
638638

639+
#define sys_port_trace_k_timer_expiry_enter(timer)
640+
#define sys_port_trace_k_timer_expiry_exit(timer)
641+
#define sys_port_trace_k_timer_stop_fn_expiry_enter(timer)
642+
#define sys_port_trace_k_timer_stop_fn_expiry_exit(timer)
643+
639644
#define sys_port_trace_syscall_enter(id, name, ...) \
640645
SEGGER_SYSVIEW_RecordString(TID_SYSCALL, (const char *)#name)
641646

subsys/tracing/test/tracing_string_format_test.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,25 @@ void sys_trace_k_timer_status_sync_exit(struct k_timer *timer, uint32_t result)
349349
TRACING_STRING("%s: %p\n", __func__, timer);
350350
}
351351

352+
void sys_trace_k_timer_expiry_enter(struct k_timer *timer)
353+
{
354+
TRACING_STRING("%s: %p\n", __func__, timer);
355+
}
356+
357+
void sys_trace_k_timer_expiry_exit(struct k_timer *timer)
358+
{
359+
TRACING_STRING("%s: %p\n", __func__, timer);
360+
}
361+
362+
void sys_trace_k_timer_stop_fn_expiry_enter(struct k_timer *timer)
363+
{
364+
TRACING_STRING("%s: %p\n", __func__, timer);
365+
}
366+
367+
void sys_trace_k_timer_stop_fn_expiry_exit(struct k_timer *timer)
368+
{
369+
TRACING_STRING("%s: %p\n", __func__, timer);
370+
}
352371

353372
void sys_trace_k_heap_init(struct k_heap *h, void *mem, size_t bytes)
354373
{

subsys/tracing/test/tracing_test.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,14 @@
429429
sys_trace_k_timer_status_sync_blocking(timer)
430430
#define sys_port_trace_k_timer_status_sync_exit(timer, result) \
431431
sys_trace_k_timer_status_sync_exit(timer, result)
432+
#define sys_port_trace_k_timer_expiry_enter(timer) \
433+
sys_trace_k_timer_expiry_enter(timer)
434+
#define sys_port_trace_k_timer_expiry_exit(timer) \
435+
sys_trace_k_timer_expiry_exit(timer)
436+
#define sys_port_trace_k_timer_stop_fn_expiry_enter(timer) \
437+
sys_trace_k_timer_stop_fn_expiry_enter(timer)
438+
#define sys_port_trace_k_timer_stop_fn_expiry_exit(timer) \
439+
sys_trace_k_timer_stop_fn_expiry_exit(timer)
432440

433441
#define sys_port_trace_k_event_init(event) sys_trace_k_event_init(event)
434442
#define sys_port_trace_k_event_post_enter(event, events, events_mask) \
@@ -696,6 +704,10 @@ void sys_trace_k_timer_start(struct k_timer *timer, k_timeout_t duration, k_time
696704
void sys_trace_k_timer_stop(struct k_timer *timer);
697705
void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer);
698706
void sys_trace_k_timer_status_sync_exit(struct k_timer *timer, uint32_t result);
707+
void sys_trace_k_timer_expiry_enter(struct k_timer *timer);
708+
void sys_trace_k_timer_expiry_exit(struct k_timer *timer);
709+
void sys_trace_k_timer_stop_fn_expiry_enter(struct k_timer *timer);
710+
void sys_trace_k_timer_stop_fn_expiry_exit(struct k_timer *timer);
699711

700712
void sys_trace_k_event_init(struct k_event *event);
701713
void sys_trace_k_event_post_enter(struct k_event *event, uint32_t events, uint32_t events_mask);

subsys/tracing/user/tracing_user.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,18 @@ void __weak sys_trace_gpio_fire_callbacks_enter_user(sys_slist_t *list, const st
7575
gpio_pin_t pins) {}
7676
void __weak sys_trace_gpio_fire_callback_user(const struct device *port,
7777
struct gpio_callback *callback) {}
78+
void __weak sys_trace_timer_init_user(struct k_timer *timer) {}
79+
void __weak sys_trace_timer_start_user(struct k_timer *timer, k_timeout_t duration,
80+
k_timeout_t period) {}
81+
void __weak sys_trace_timer_stop_user(struct k_timer *timer) {}
82+
void __weak sys_trace_timer_status_sync_enter_user(struct k_timer *timer) {}
83+
void __weak sys_trace_timer_status_sync_blocking_user(struct k_timer *timer,
84+
k_timeout_t timeout) {}
85+
void __weak sys_trace_timer_status_sync_exit_user(struct k_timer *timer, uint32_t result) {}
86+
void __weak sys_trace_timer_expiry_enter_user(struct k_timer *timer) {}
87+
void __weak sys_trace_timer_expiry_exit_user(struct k_timer *timer) {}
88+
void __weak sys_trace_timer_stop_fn_expiry_enter_user(struct k_timer *timer) {}
89+
void __weak sys_trace_timer_stop_fn_expiry_exit_user(struct k_timer *timer) {}
7890

7991
void sys_trace_thread_create(struct k_thread *thread)
8092
{
@@ -314,3 +326,53 @@ void sys_trace_gpio_fire_callback(const struct device *port, struct gpio_callbac
314326
{
315327
sys_trace_gpio_fire_callback_user(port, callback);
316328
}
329+
330+
void sys_trace_timer_init(struct k_timer *timer)
331+
{
332+
sys_trace_timer_init_user(timer);
333+
}
334+
335+
void sys_trace_timer_start(struct k_timer *timer, k_timeout_t duration, k_timeout_t period)
336+
{
337+
sys_trace_timer_start_user(timer, duration, period);
338+
}
339+
340+
void sys_trace_timer_stop(struct k_timer *timer)
341+
{
342+
sys_trace_timer_stop_user(timer);
343+
}
344+
345+
void sys_trace_timer_status_sync_enter(struct k_timer *timer)
346+
{
347+
sys_trace_timer_status_sync_enter_user(timer);
348+
}
349+
350+
void sys_trace_timer_status_sync_blocking(struct k_timer *timer, k_timeout_t timeout)
351+
{
352+
sys_trace_timer_status_sync_blocking_user(timer, timeout);
353+
}
354+
355+
void sys_trace_timer_status_sync_exit(struct k_timer *timer, uint32_t result)
356+
{
357+
sys_trace_timer_status_sync_exit_user(timer, result);
358+
}
359+
360+
void sys_trace_timer_expiry_enter(struct k_timer *timer)
361+
{
362+
sys_trace_timer_expiry_enter_user(timer);
363+
}
364+
365+
void sys_trace_timer_expiry_exit(struct k_timer *timer)
366+
{
367+
sys_trace_timer_expiry_exit_user(timer);
368+
}
369+
370+
void sys_trace_timer_stop_fn_expiry_enter(struct k_timer *timer)
371+
{
372+
sys_trace_timer_stop_fn_expiry_enter_user(timer);
373+
}
374+
375+
void sys_trace_timer_stop_fn_expiry_exit(struct k_timer *timer)
376+
{
377+
sys_trace_timer_stop_fn_expiry_exit_user(timer);
378+
}

subsys/tracing/user/tracing_user.h

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@ void sys_trace_idle(void);
4949
void sys_trace_idle_exit(void);
5050
void sys_trace_sys_init_enter(const struct init_entry *entry, int level);
5151
void sys_trace_sys_init_exit(const struct init_entry *entry, int level, int result);
52+
void sys_trace_timer_init(struct k_timer *timer);
53+
void sys_trace_timer_start(struct k_timer *timer, k_timeout_t duration, k_timeout_t period);
54+
void sys_trace_timer_stop(struct k_timer *timer);
55+
void sys_trace_timer_status_sync_enter(struct k_timer *timer);
56+
void sys_trace_timer_status_sync_blocking(struct k_timer *timer, k_timeout_t timeout);
57+
void sys_trace_timer_status_sync_exit(struct k_timer *timer, uint32_t result);
58+
void sys_trace_timer_expiry_enter(struct k_timer *timer);
59+
void sys_trace_timer_expiry_exit(struct k_timer *timer);
60+
void sys_trace_timer_stop_fn_expiry_enter(struct k_timer *timer);
61+
void sys_trace_timer_stop_fn_expiry_exit(struct k_timer *timer);
5262

5363
struct gpio_callback;
5464
typedef uint8_t gpio_pin_t;
@@ -367,12 +377,26 @@ void sys_trace_gpio_fire_callback_user(const struct device *port, struct gpio_ca
367377
#define sys_port_trace_k_mem_slab_free_enter(slab)
368378
#define sys_port_trace_k_mem_slab_free_exit(slab)
369379

370-
#define sys_port_trace_k_timer_init(timer)
371-
#define sys_port_trace_k_timer_start(timer, duration, period)
372-
#define sys_port_trace_k_timer_stop(timer)
373-
#define sys_port_trace_k_timer_status_sync_enter(timer)
374-
#define sys_port_trace_k_timer_status_sync_blocking(timer, timeout)
375-
#define sys_port_trace_k_timer_status_sync_exit(timer, result)
380+
#define sys_port_trace_k_timer_init(timer) \
381+
sys_trace_timer_init(timer)
382+
#define sys_port_trace_k_timer_start(timer, duration, period) \
383+
sys_trace_timer_start(timer, duration, period)
384+
#define sys_port_trace_k_timer_stop(timer) \
385+
sys_trace_timer_stop(timer)
386+
#define sys_port_trace_k_timer_status_sync_enter(timer) \
387+
sys_trace_timer_status_sync_enter(timer)
388+
#define sys_port_trace_k_timer_status_sync_blocking(timer, timeout) \
389+
sys_trace_timer_status_sync_blocking(timer, timeout)
390+
#define sys_port_trace_k_timer_status_sync_exit(timer, result) \
391+
sys_trace_timer_status_sync_exit(timer, result)
392+
#define sys_port_trace_k_timer_expiry_enter(timer) \
393+
sys_trace_timer_expiry_enter(timer)
394+
#define sys_port_trace_k_timer_expiry_exit(timer) \
395+
sys_trace_timer_expiry_exit(timer)
396+
#define sys_port_trace_k_timer_stop_fn_expiry_enter(timer) \
397+
sys_trace_timer_stop_fn_expiry_enter(timer)
398+
#define sys_port_trace_k_timer_stop_fn_expiry_exit(timer) \
399+
sys_trace_timer_stop_fn_expiry_exit(timer)
376400

377401
#define sys_port_trace_k_event_init(event)
378402
#define sys_port_trace_k_event_post_enter(event, events, events_mask)

0 commit comments

Comments
 (0)