tracing: ctf: add timer support
Add k_timer tracing to CTF and other formats.
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
diff --git a/include/zephyr/tracing/tracing.h b/include/zephyr/tracing/tracing.h
index e564f23..4a0ff98 100644
--- a/include/zephyr/tracing/tracing.h
+++ b/include/zephyr/tracing/tracing.h
@@ -1823,8 +1823,10 @@
/**
* @brief Trace Timer start
* @param timer Timer object
+ * @param duration Timer duration
+ * @param period Timer period
*/
-#define sys_port_trace_k_timer_start(timer)
+#define sys_port_trace_k_timer_start(timer, duration, period)
/**
* @brief Trace Timer stop
diff --git a/include/zephyr/tracing/tracking.h b/include/zephyr/tracing/tracking.h
index af67e91..db1cefd 100644
--- a/include/zephyr/tracing/tracking.h
+++ b/include/zephyr/tracing/tracking.h
@@ -63,7 +63,7 @@
#define sys_port_track_k_mutex_init(mutex, ret) \
sys_track_k_mutex_init(mutex)
#define sys_port_track_k_timer_stop(timer)
-#define sys_port_track_k_timer_start(timer)
+#define sys_port_track_k_timer_start(timer, duration, period)
#define sys_port_track_k_timer_init(timer) \
sys_track_k_timer_init(timer)
#define sys_port_track_k_queue_peek_tail(queue, ret)
@@ -117,7 +117,7 @@
#define sys_port_track_k_work_init(work)
#define sys_port_track_k_mutex_init(mutex, ret)
#define sys_port_track_k_timer_stop(timer)
-#define sys_port_track_k_timer_start(timer)
+#define sys_port_track_k_timer_start(timer, duration, period)
#define sys_port_track_k_timer_init(timer)
#define sys_port_track_k_queue_peek_tail(queue, ret)
#define sys_port_track_k_queue_peek_head(queue, ret)
diff --git a/kernel/timer.c b/kernel/timer.c
index d5f0a05..474ccf6 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -111,7 +111,7 @@
void z_impl_k_timer_start(struct k_timer *timer, k_timeout_t duration,
k_timeout_t period)
{
- SYS_PORT_TRACING_OBJ_FUNC(k_timer, start, timer);
+ SYS_PORT_TRACING_OBJ_FUNC(k_timer, start, timer, duration, period);
if (K_TIMEOUT_EQ(duration, K_FOREVER)) {
return;
diff --git a/subsys/tracing/ctf/ctf_top.c b/subsys/tracing/ctf/ctf_top.c
index e27ae14..100e770 100644
--- a/subsys/tracing/ctf/ctf_top.c
+++ b/subsys/tracing/ctf/ctf_top.c
@@ -274,24 +274,48 @@
}
/* Timer */
-void sys_trace_k_timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn,
- k_timer_expiry_t stop_fn)
+void sys_trace_k_timer_init(struct k_timer *timer)
{
+ ctf_top_timer_init(
+ (uint32_t)(uintptr_t)timer);
}
void sys_trace_k_timer_start(struct k_timer *timer, k_timeout_t duration,
k_timeout_t period)
{
+ ctf_top_timer_start(
+ (uint32_t)(uintptr_t)timer,
+ k_ticks_to_us_floor32((uint32_t)duration.ticks),
+ k_ticks_to_us_floor32((uint32_t)period.ticks)
+ );
}
void sys_trace_k_timer_stop(struct k_timer *timer)
{
+ ctf_top_timer_stop(
+ (uint32_t)(uintptr_t)timer
+ );
}
-void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer)
+void sys_trace_k_timer_status_sync_enter(struct k_timer *timer)
{
+ ctf_top_timer_status_sync_enter(
+ (uint32_t)(uintptr_t)timer
+ );
+}
+
+void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer, k_timeout_t timeout)
+{
+ ctf_top_timer_status_sync_blocking(
+ (uint32_t)(uintptr_t)timer,
+ k_ticks_to_us_floor32((uint32_t)timeout.ticks)
+ );
}
void sys_trace_k_timer_status_sync_exit(struct k_timer *timer, uint32_t result)
{
+ ctf_top_timer_status_sync_exit(
+ (uint32_t)(uintptr_t)timer,
+ result
+ );
}
diff --git a/subsys/tracing/ctf/ctf_top.h b/subsys/tracing/ctf/ctf_top.h
index 61078b2..845711c 100644
--- a/subsys/tracing/ctf/ctf_top.h
+++ b/subsys/tracing/ctf/ctf_top.h
@@ -97,6 +97,13 @@
CTF_EVENT_MUTEX_LOCK_EXIT = 0x2B,
CTF_EVENT_MUTEX_UNLOCK_ENTER = 0x2C,
CTF_EVENT_MUTEX_UNLOCK_EXIT = 0x2D,
+ CTF_EVENT_TIMER_INIT = 0x2E,
+ CTF_EVENT_TIMER_START = 0x2F,
+ CTF_EVENT_TIMER_STOP = 0x30,
+ CTF_EVENT_TIMER_STATUS_SYNC_ENTER = 0x31,
+ CTF_EVENT_TIMER_STATUS_SYNC_BLOCKING = 0x32,
+ CTF_EVENT_TIMER_STATUS_SYNC_EXIT = 0x33
+
} ctf_event_t;
typedef struct {
@@ -290,4 +297,36 @@
CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_MUTEX_UNLOCK_EXIT), mutex_id);
}
+/* Timer */
+static inline void ctf_top_timer_init(uint32_t timer)
+{
+ CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_INIT), timer);
+}
+
+static inline void ctf_top_timer_start(uint32_t timer, uint32_t duration, uint32_t period)
+{
+ CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_START), timer, duration, period);
+}
+
+static inline void ctf_top_timer_stop(uint32_t timer)
+{
+ CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_STOP), timer);
+}
+
+static inline void ctf_top_timer_status_sync_enter(uint32_t timer)
+{
+ CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_STATUS_SYNC_ENTER), timer);
+}
+
+static inline void ctf_top_timer_status_sync_blocking(uint32_t timer, uint32_t timeout)
+{
+ CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_STATUS_SYNC_BLOCKING), timer, timeout);
+}
+
+static inline void ctf_top_timer_status_sync_exit(uint32_t timer, uint32_t result)
+{
+ CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_STATUS_SYNC_EXIT), timer, result);
+}
+
+
#endif /* SUBSYS_DEBUG_TRACING_CTF_TOP_H */
diff --git a/subsys/tracing/ctf/tracing_ctf.h b/subsys/tracing/ctf/tracing_ctf.h
index a271812..b278c9d 100644
--- a/subsys/tracing/ctf/tracing_ctf.h
+++ b/subsys/tracing/ctf/tracing_ctf.h
@@ -160,6 +160,21 @@
#define sys_port_trace_k_mutex_unlock_exit(mutex, ret) \
sys_trace_k_mutex_unlock_exit(mutex, ret)
+/* Timer */
+#define sys_port_trace_k_timer_init(timer) \
+ sys_trace_k_timer_init(timer)
+#define sys_port_trace_k_timer_start(timer, duration, period) \
+ sys_trace_k_timer_start(timer, duration, period)
+#define sys_port_trace_k_timer_stop(timer) \
+ sys_trace_k_timer_stop(timer)
+#define sys_port_trace_k_timer_status_sync_enter(timer) \
+ sys_trace_k_timer_status_sync_enter(timer)
+#define sys_port_trace_k_timer_status_sync_blocking(timer, timeout) \
+ sys_trace_k_timer_status_sync_blocking(timer, timeout)
+#define sys_port_trace_k_timer_status_sync_exit(timer, result) \
+ sys_trace_k_timer_status_sync_exit(timer, result)
+
+
#define sys_port_trace_k_condvar_init(condvar, ret)
#define sys_port_trace_k_condvar_signal_enter(condvar)
#define sys_port_trace_k_condvar_signal_blocking(condvar, timeout)
@@ -306,13 +321,6 @@
#define sys_port_trace_k_mem_slab_free_enter(slab)
#define sys_port_trace_k_mem_slab_free_exit(slab)
-#define sys_port_trace_k_timer_init(timer)
-#define sys_port_trace_k_timer_start(timer)
-#define sys_port_trace_k_timer_stop(timer)
-#define sys_port_trace_k_timer_status_sync_enter(timer)
-#define sys_port_trace_k_timer_status_sync_blocking(timer, timeout)
-#define sys_port_trace_k_timer_status_sync_exit(timer, result)
-
#define sys_port_trace_k_event_init(event)
#define sys_port_trace_k_event_post_enter(event, events, events_mask)
#define sys_port_trace_k_event_post_exit(event, events, events_mask)
@@ -416,12 +424,14 @@
void sys_trace_k_mutex_unlock_enter(struct k_mutex *mutex);
void sys_trace_k_mutex_unlock_exit(struct k_mutex *mutex, int ret);
-void sys_trace_k_timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn,
- k_timer_expiry_t stop_fn);
+/* Timer */
+void sys_trace_k_timer_init(struct k_timer *timer);
+
void sys_trace_k_timer_start(struct k_timer *timer, k_timeout_t duration,
k_timeout_t period);
void sys_trace_k_timer_stop(struct k_timer *timer);
-void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer);
+void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer, k_timeout_t timeout);
+void sys_trace_k_timer_status_sync_enter(struct k_timer *timer);
void sys_trace_k_timer_status_sync_exit(struct k_timer *timer, uint32_t result);
void sys_trace_k_event_init(struct k_event *event);
diff --git a/subsys/tracing/ctf/tsdl/metadata b/subsys/tracing/ctf/tsdl/metadata
index 3d63983..1b44f6a 100644
--- a/subsys/tracing/ctf/tsdl/metadata
+++ b/subsys/tracing/ctf/tsdl/metadata
@@ -260,3 +260,53 @@
};
};
+event {
+ name = timer_init;
+ id = 0x2E;
+ fields := struct {
+ uint32_t id;
+ };
+};
+
+event {
+ name = timer_start;
+ id = 0x2F;
+ fields := struct {
+ uint32_t id;
+ uint32_t duration;
+ uint32_t period;
+ };
+};
+
+event {
+ name = timer_stop;
+ id = 0x30;
+ fields := struct {
+ uint32_t id;
+ };
+};
+
+event {
+ name = timer_status_sync_enter;
+ id = 0x31;
+ fields := struct {
+ uint32_t id;
+ };
+};
+
+event {
+ name = timer_status_sync_blocking;
+ id = 0x32;
+ fields := struct {
+ uint32_t id;
+ };
+};
+
+event {
+ name = timer_status_sync_exit;
+ id = 0x33;
+ fields := struct {
+ uint32_t id;
+ uint32_t result;
+ };
+};
diff --git a/subsys/tracing/sysview/tracing_sysview.h b/subsys/tracing/sysview/tracing_sysview.h
index 7dd03eb..a66b859 100644
--- a/subsys/tracing/sysview/tracing_sysview.h
+++ b/subsys/tracing/sysview/tracing_sysview.h
@@ -583,8 +583,9 @@
#define sys_port_trace_k_timer_init(timer) \
SEGGER_SYSVIEW_RecordU32(TID_TIMER_INIT, (uint32_t)(uintptr_t)timer)
-#define sys_port_trace_k_timer_start(timer) \
- SEGGER_SYSVIEW_RecordU32(TID_TIMER_START, (uint32_t)(uintptr_t)timer)
+#define sys_port_trace_k_timer_start(timer, duration, period) \
+ SEGGER_SYSVIEW_RecordU32x3(TID_TIMER_START, (uint32_t)(uintptr_t)timer, \
+ (uint32_t)duration.ticks, (uint32_t)period.ticks)
#define sys_port_trace_k_timer_stop(timer) \
SEGGER_SYSVIEW_RecordU32(TID_TIMER_STOP, (uint32_t)(uintptr_t)timer)
diff --git a/subsys/tracing/test/tracing_string_format_test.c b/subsys/tracing/test/tracing_string_format_test.c
index 348d2e4..e79e5f1 100644
--- a/subsys/tracing/test/tracing_string_format_test.c
+++ b/subsys/tracing/test/tracing_string_format_test.c
@@ -316,7 +316,8 @@
void sys_trace_k_timer_start(struct k_timer *timer, k_timeout_t duration,
k_timeout_t period)
{
- TRACING_STRING("%s: %p, duration: %d, period: %d\n", __func__, timer, duration, period);
+ TRACING_STRING("%s: %p, duration: %d, period: %d\n", __func__, timer,
+ (uint32_t)duration.ticks, (uint32_t)period.ticks);
}
void sys_trace_k_timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn,
diff --git a/subsys/tracing/test/tracing_test.h b/subsys/tracing/test/tracing_test.h
index 7e49bd9..e8077ea 100644
--- a/subsys/tracing/test/tracing_test.h
+++ b/subsys/tracing/test/tracing_test.h
@@ -412,7 +412,8 @@
#define sys_port_trace_k_mem_slab_free_exit(slab) sys_trace_k_mem_slab_free_exit(slab, mem)
#define sys_port_trace_k_timer_init(timer) sys_trace_k_timer_init(timer, expiry_fn, stop_fn)
-#define sys_port_trace_k_timer_start(timer) sys_trace_k_timer_start(timer, duration, period)
+#define sys_port_trace_k_timer_start(timer, duration, period) \
+ sys_trace_k_timer_start(timer, duration, period)
#define sys_port_trace_k_timer_stop(timer) sys_trace_k_timer_stop(timer)
#define sys_port_trace_k_timer_status_sync_enter(timer)
#define sys_port_trace_k_timer_status_sync_blocking(timer, timeout) \
diff --git a/subsys/tracing/user/tracing_user.h b/subsys/tracing/user/tracing_user.h
index df2b963..3757627 100644
--- a/subsys/tracing/user/tracing_user.h
+++ b/subsys/tracing/user/tracing_user.h
@@ -309,7 +309,7 @@
#define sys_port_trace_k_mem_slab_free_exit(slab)
#define sys_port_trace_k_timer_init(timer)
-#define sys_port_trace_k_timer_start(timer)
+#define sys_port_trace_k_timer_start(timer, duration, period)
#define sys_port_trace_k_timer_stop(timer)
#define sys_port_trace_k_timer_status_sync_enter(timer)
#define sys_port_trace_k_timer_status_sync_blocking(timer, timeout)