Skip to content

Commit 89ef021

Browse files
nordic-seglrlubos
authored andcommitted
tests: benchmarks: multicore: Add synchronization between cores
There is difference in boot time between Application and Radio cores. When current consumption test is executed on two cores, synchronize their startup. Signed-off-by: Sebastian Głąb <[email protected]>
1 parent d117c09 commit 89ef021

File tree

6 files changed

+120
-3
lines changed

6 files changed

+120
-3
lines changed

tests/benchmarks/multicore/idle_pwm_led/remote/Kconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,11 @@ config TEST_SLEEP_DURATION_MS
1212
Based on the value of 'min-residency-us' specified for each power state defined in the DTS,
1313
core enters the lowest possible power state.
1414

15+
config TEST_ROLE_REMOTE
16+
bool "Execute test variant for Remote core"
17+
default y
18+
help
19+
KConfig used in synchronization phase.
20+
Set TEST_ROLE_REMOTE=y on core that shall synchronize with the Host core.
21+
1522
source "Kconfig.zephyr"

tests/benchmarks/multicore/idle_pwm_led/src/main.c

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
LOG_MODULE_REGISTER(idle_pwm_led, LOG_LEVEL_INF);
99

1010
#include <zephyr/kernel.h>
11+
#include <zephyr/cache.h>
1112
#include <zephyr/drivers/pwm.h>
1213
#include <zephyr/drivers/gpio.h>
1314
#include <zephyr/pm/device_runtime.h>
@@ -16,9 +17,11 @@ LOG_MODULE_REGISTER(idle_pwm_led, LOG_LEVEL_INF);
1617
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led), gpios);
1718
static const struct pwm_dt_spec pwm_led = PWM_DT_SPEC_GET(DT_ALIAS(pwm_led0));
1819

19-
2020
#define PWM_STEPS_PER_SEC (50)
21-
21+
#define SHM_START_ADDR (DT_REG_ADDR(DT_NODELABEL(cpuapp_cpurad_ipc_shm)))
22+
volatile static uint32_t *shared_var = (volatile uint32_t *) SHM_START_ADDR;
23+
#define HOST_IS_READY (1)
24+
#define REMOTE_IS_READY (2)
2225

2326
int main(void)
2427
{
@@ -71,9 +74,36 @@ int main(void)
7174

7275
LOG_INF("Multicore idle_pwm_led test on %s", CONFIG_BOARD_TARGET);
7376
LOG_INF("Core will sleep for %d ms", CONFIG_TEST_SLEEP_DURATION_MS);
77+
LOG_INF("Shared memory at %p", (void *) shared_var);
7478

7579
#if defined(CONFIG_PM_DEVICE_RUNTIME)
76-
pm_device_runtime_enable(pwm_led.dev);
80+
pm_device_runtime_enable(pwm_led.dev);
81+
#endif
82+
83+
/* Synchronize Remote core with Host core */
84+
#if !defined(CONFIG_TEST_ROLE_REMOTE)
85+
LOG_DBG("HOST starts");
86+
*shared_var = HOST_IS_READY;
87+
sys_cache_data_flush_range((void *) shared_var, sizeof(*shared_var));
88+
LOG_DBG("HOST wrote HOST_IS_READY: %u", *shared_var);
89+
while (*shared_var != REMOTE_IS_READY) {
90+
k_msleep(1);
91+
sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var));
92+
LOG_DBG("shared_var is: %u", *shared_var);
93+
}
94+
LOG_DBG("HOST continues");
95+
#else
96+
LOG_DBG("REMOTE starts");
97+
while (*shared_var != HOST_IS_READY) {
98+
k_msleep(1);
99+
sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var));
100+
LOG_DBG("shared_var is: %u", *shared_var);
101+
}
102+
LOG_DBG("REMOTE found that HOST_IS_READY");
103+
*shared_var = REMOTE_IS_READY;
104+
sys_cache_data_flush_range((void *) shared_var, sizeof(*shared_var));
105+
LOG_DBG("REMOTE wrote REMOTE_IS_READY: %u", *shared_var);
106+
LOG_DBG("REMOTE continues");
77107
#endif
78108

79109
#if defined(CONFIG_COVERAGE)

tests/benchmarks/multicore/idle_pwm_loopback/remote/Kconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,11 @@ config TEST_SLEEP_DURATION_MS
1212
Based on the value of 'min-residency-us' specified for each power state defined in the DTS,
1313
core enters the lowest possible power state.
1414

15+
config TEST_ROLE_REMOTE
16+
bool "Execute test variant for Remote core"
17+
default y
18+
help
19+
KConfig used in synchronization phase.
20+
Set TEST_ROLE_REMOTE=y on core that shall synchronize with the Host core.
21+
1522
source "Kconfig.zephyr"

tests/benchmarks/multicore/idle_pwm_loopback/src/main.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
LOG_MODULE_REGISTER(idle_pwm_loop, LOG_LEVEL_INF);
99

1010
#include <zephyr/kernel.h>
11+
#include <zephyr/cache.h>
1112
#include <zephyr/drivers/pwm.h>
1213
#include <zephyr/drivers/gpio.h>
1314
#include <zephyr/pm/device_runtime.h>
@@ -21,6 +22,11 @@ LOG_MODULE_REGISTER(idle_pwm_loop, LOG_LEVEL_INF);
2122
#error "Unsupported board: pwm_to_gpio_loopback node is not defined"
2223
#endif
2324

25+
#define SHM_START_ADDR (DT_REG_ADDR(DT_NODELABEL(cpuapp_cpurad_ipc_shm)))
26+
volatile static uint32_t *shared_var = (volatile uint32_t *) SHM_START_ADDR;
27+
#define HOST_IS_READY (1)
28+
#define REMOTE_IS_READY (2)
29+
2430
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led), gpios);
2531

2632
static const struct gpio_dt_spec pin_in = GPIO_DT_SPEC_GET_BY_IDX(
@@ -126,6 +132,7 @@ int main(void)
126132
LOG_INF("GPIO loopback at %s, pin %d", pin_in.port->name, pin_in.pin);
127133
LOG_INF("Pulse/period: %u/%u usec", pulse / 1000, pwm_out.period / 1000);
128134
LOG_INF("Expected number of edges in 1 second: %u (+/- %u)", edges, tolerance);
135+
LOG_INF("Shared memory at %p", (void *) shared_var);
129136
LOG_INF("===================================================================");
130137

131138
ret = pwm_is_ready_dt(&pwm_out);
@@ -155,6 +162,32 @@ int main(void)
155162

156163
k_timer_init(&my_timer, my_timer_handler, NULL);
157164

165+
/* Synchronize Remote core with Host core */
166+
#if !defined(CONFIG_TEST_ROLE_REMOTE)
167+
LOG_DBG("HOST starts");
168+
*shared_var = HOST_IS_READY;
169+
sys_cache_data_flush_range((void *) shared_var, sizeof(*shared_var));
170+
LOG_DBG("HOST wrote HOST_IS_READY: %u", *shared_var);
171+
while (*shared_var != REMOTE_IS_READY) {
172+
k_msleep(1);
173+
sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var));
174+
LOG_DBG("shared_var is: %u", *shared_var);
175+
}
176+
LOG_DBG("HOST continues");
177+
#else
178+
LOG_DBG("REMOTE starts");
179+
while (*shared_var != HOST_IS_READY) {
180+
k_msleep(1);
181+
sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var));
182+
LOG_DBG("shared_var is: %u", *shared_var);
183+
}
184+
LOG_DBG("REMOTE found that HOST_IS_READY");
185+
*shared_var = REMOTE_IS_READY;
186+
sys_cache_data_flush_range((void *) shared_var, sizeof(*shared_var));
187+
LOG_DBG("REMOTE wrote REMOTE_IS_READY: %u", *shared_var);
188+
LOG_DBG("REMOTE continues");
189+
#endif
190+
158191
#if defined(CONFIG_COVERAGE)
159192
printk("Coverage analysis enabled\n");
160193
while (test_repetitions--)

tests/benchmarks/multicore/idle_wdt/remote/Kconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,11 @@ config TEST_SLEEP_DURATION_MS
1212
Based on the value of 'min-residency-us' specified for each power state defined in the DTS,
1313
core enters the lowest possible power state.
1414

15+
config TEST_ROLE_REMOTE
16+
bool "Execute test variant for Remote core"
17+
default y
18+
help
19+
KConfig used in synchronization phase.
20+
Set TEST_ROLE_REMOTE=y on core that shall synchronize with the Host core.
21+
1522
source "Kconfig.zephyr"

tests/benchmarks/multicore/idle_wdt/src/main.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
LOG_MODULE_REGISTER(idle_wdt, LOG_LEVEL_INF);
99

1010
#include <zephyr/kernel.h>
11+
#include <zephyr/cache.h>
1112
#include <zephyr/drivers/watchdog.h>
1213
#include <zephyr/drivers/gpio.h>
1314

@@ -30,6 +31,11 @@ static int my_wdt_channel;
3031
#endif
3132
static volatile uint32_t wdt_status __attribute__((section(NOINIT_SECTION)));
3233

34+
#define SHM_START_ADDR (DT_REG_ADDR(DT_NODELABEL(cpuapp_cpurad_ipc_shm)))
35+
volatile static uint32_t *shared_var = (volatile uint32_t *) SHM_START_ADDR;
36+
#define HOST_IS_READY (1)
37+
#define REMOTE_IS_READY (2)
38+
3339
/* Variables used to make CPU active for ~1 second */
3440
static struct k_timer my_timer;
3541
static bool timer_expired;
@@ -59,6 +65,7 @@ int main(void)
5965

6066
LOG_INF("Multicore idle_wdt test on %s", CONFIG_BOARD_TARGET);
6167
LOG_INF("Main sleeps for %d ms", CONFIG_TEST_SLEEP_DURATION_MS);
68+
LOG_INF("Shared memory at %p", (void *) shared_var);
6269

6370
k_timer_init(&my_timer, my_timer_handler, NULL);
6471

@@ -97,6 +104,32 @@ int main(void)
97104
__ASSERT(false, "wdt_install_timeout() returned %d\n", my_wdt_channel);
98105
}
99106

107+
/* Synchronize Remote core with Host core */
108+
#if !defined(CONFIG_TEST_ROLE_REMOTE)
109+
LOG_DBG("HOST starts");
110+
*shared_var = HOST_IS_READY;
111+
sys_cache_data_flush_range((void *) shared_var, sizeof(*shared_var));
112+
LOG_DBG("HOST wrote HOST_IS_READY: %u", *shared_var);
113+
while (*shared_var != REMOTE_IS_READY) {
114+
k_msleep(1);
115+
sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var));
116+
LOG_DBG("shared_var is: %u", *shared_var);
117+
}
118+
LOG_DBG("HOST continues");
119+
#else
120+
LOG_DBG("REMOTE starts");
121+
while (*shared_var != HOST_IS_READY) {
122+
k_msleep(1);
123+
sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var));
124+
LOG_DBG("shared_var is: %u", *shared_var);
125+
}
126+
LOG_DBG("REMOTE found that HOST_IS_READY");
127+
*shared_var = REMOTE_IS_READY;
128+
sys_cache_data_flush_range((void *) shared_var, sizeof(*shared_var));
129+
LOG_DBG("REMOTE wrote REMOTE_IS_READY: %u", *shared_var);
130+
LOG_DBG("REMOTE continues");
131+
#endif
132+
100133
/* Start Watchdog */
101134
ret = wdt_setup(my_wdt_device, WDT_OPT_PAUSE_HALTED_BY_DBG | WDT_OPT_PAUSE_IN_SLEEP);
102135
if (ret < 0) {

0 commit comments

Comments
 (0)