diff --git a/tests/benchmarks/multicore/idle_ppr/src/main.c b/tests/benchmarks/multicore/idle_ppr/src/main.c index d91e386f235c..8afaee131f43 100644 --- a/tests/benchmarks/multicore/idle_ppr/src/main.c +++ b/tests/benchmarks/multicore/idle_ppr/src/main.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause */ #include +#include #include #include @@ -15,6 +16,11 @@ static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios); static struct k_timer my_timer; static bool timer_expired; +#define SHM_START_ADDR (DT_REG_ADDR(DT_NODELABEL(cpuapp_cpurad_ipc_shm))) +volatile static uint32_t *shared_var = (volatile uint32_t *) SHM_START_ADDR; +#define APP_IS_READY (1) +#define RADIO_IS_READY (2) + void my_timer_handler(struct k_timer *dummy) { timer_expired = true; @@ -42,6 +48,40 @@ int main(void) k_timer_init(&my_timer, my_timer_handler, NULL); + /* Synchronize all three cores. + * APP indicates it's ready. + * Radio waits for APP then indicates it's ready. + * APP and PPR wait for RADIO. + */ +#if defined(CONFIG_SOC_NRF54H20_CPUAPP) + LOG_DBG("APP starts"); + /* Inform that APP is ready */ + *shared_var = APP_IS_READY; + sys_cache_data_flush_range((void *) shared_var, sizeof(*shared_var)); + LOG_DBG("APP wrote APP_IS_READY: %u", *shared_var); +#elif defined(CONFIG_SOC_NRF54H20_CPURAD) + LOG_DBG("RADIO starts"); + /* Wait until APP is ready */ + while (*shared_var != APP_IS_READY) { + k_usleep(500); + sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var)); + LOG_DBG("shared_var is: %u", *shared_var); + } + LOG_DBG("RADIO found that APP_IS_READY"); + /* Inform that RADIO is ready */ + *shared_var = RADIO_IS_READY; + sys_cache_data_flush_range((void *) shared_var, sizeof(*shared_var)); + LOG_DBG("RADIO wrote RADIO_IS_READY: %u", *shared_var); + sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var)); +#endif + /* APP and PPR wait for RADIO */ + while (*shared_var != RADIO_IS_READY) { + k_usleep(500); + sys_cache_data_invd_range((void *) shared_var, sizeof(*shared_var)); + LOG_DBG("shared_var is: %u", *shared_var); + } + LOG_DBG("RADIO_IS_READY"); + /* Run test forever */ while (1) { timer_expired = false;