Skip to content

Commit

Permalink
zephyr: shell: add initial SOF custom commands
Browse files Browse the repository at this point in the history
One of the benefits and common ways to use the Zephyr shell
subsystem is definition of application specific commands.

This commit adds the initial SOF custom command,
"sof test_inject_sched_gap". This new command allows to inject
scheduling gaps into low-latency timer scheduler execution,
using the domain_block() SOF interface. Optional argument
can be used to specify duration of the block in micro seconds.

The intent is to stress test a SOF configuration and test how
the system behaves when audio pipeline is briefly starved.

Example log of what is observed when test_inkect_sched_gap is
run:

[    0.052431] <inf> ll_schedule: zephyr_domain_thread_fn: ll core 0 timer avg 3674, max 4326, overruns 0
[    0.052831] <inf> ll_schedule: zephyr_domain_thread_fn: ll core 0 timer avg 3673, max 4318, overruns 0
~$
~$ sof test_inject_sched_gap 12000
[    0.052968] <inf> ll_schedule: zephyr_domain_block: Blocking LL scheduler
[    0.052973] <inf> ll_schedule: zephyr_domain_unblock: Unblocking LL scheduler
[    0.052973] <inf> host_comp: host_get_copy_bytes_normal: comp:1 0x10004 no bytes to copy, available samples: 0, free_samples: 384
[    0.053231] <inf> ll_schedule: zephyr_domain_thread_fn: ll core 0 timer avg 4074, max 437230, overruns 1

Signed-off-by: Kai Vehmanen <[email protected]>
  • Loading branch information
kv2019i committed Jul 4, 2024
1 parent 2688f63 commit 85e1d68
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
4 changes: 4 additions & 0 deletions zephyr/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -905,6 +905,10 @@ zephyr_library_sources_ifdef(CONFIG_SOF_BOOT_TEST
boot_test.c
)

zephyr_library_sources_ifdef(CONFIG_SHELL
sof_shell.c
)

zephyr_library_link_libraries(SOF)
target_link_libraries(SOF INTERFACE zephyr_interface)

Expand Down
51 changes: 51 additions & 0 deletions zephyr/sof_shell.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
* Copyright(c) 2024 Intel Corporation.
*
* Author: Kai Vehmanen <[email protected]>
*/

#include <rtos/sof.h> /* sof_get() */
#include <sof/schedule/ll_schedule_domain.h>

#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/shell/shell.h>

#define SOF_TEST_INJECT_SCHED_GAP_USEC 1500

static int cmd_sof_test_inject_sched_gap(const struct shell *sh,
size_t argc, char *argv[])
{
uint32_t block_time = SOF_TEST_INJECT_SCHED_GAP_USEC;
char *endptr = NULL;

#ifndef CONFIG_CROSS_CORE_STREAM
shell_fprintf(sh, SHELL_NORMAL, "Domain blocking not supported, not reliable on SMP\n");
#endif

domain_block(sof_get()->platform_timer_domain);

if (argc > 1) {
block_time = strtol(argv[1], &endptr, 0);
if (endptr == argv[1])
return -EINVAL;
}

k_busy_wait(block_time);

domain_unblock(sof_get()->platform_timer_domain);

return 0;
}

SHELL_STATIC_SUBCMD_SET_CREATE(sof_commands,
SHELL_CMD(test_inject_sched_gap, NULL,
"Inject a gap to audio scheduling\n",
cmd_sof_test_inject_sched_gap),

SHELL_SUBCMD_SET_END
);

SHELL_CMD_REGISTER(sof, &sof_commands,
"SOF application commands", NULL);

0 comments on commit 85e1d68

Please sign in to comment.