Skip to content

Commit 9a16487

Browse files
committed
[nrf fromlist] samples: boards: nordic: nrf_sys_event: Extend sample
Add part which is using event register and unregister functionality. Upstream PR #: 99377 Signed-off-by: Krzysztof Chruściński <[email protected]>
1 parent 15ac1e2 commit 9a16487

File tree

6 files changed

+164
-22
lines changed

6 files changed

+164
-22
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
sample_counter: &timer20 {
7+
status = "okay";
8+
};
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#include "nrf54l15dk_nrf54l15_common.dtsi"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#include "nrf54l15dk_nrf54l15_common.dtsi"

samples/boards/nordic/nrf_sys_event/prj.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
CONFIG_NRF_SYS_EVENT=y
5+
CONFIG_COUNTER=y
6+
CONFIG_NRF_SYS_EVENT_IRQ_LATENCY=n

samples/boards/nordic/nrf_sys_event/sample.yaml

Lines changed: 59 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,66 @@ common:
66
type: one_line
77
regex:
88
- "constant latency mode disabled"
9-
platform_allow:
10-
- nrf52dk/nrf52810
11-
- nrf52dk/nrf52832
12-
- nrf52833dk/nrf52820
13-
- nrf52833dk/nrf52833
14-
- nrf52840dk/nrf52811
15-
- nrf52840dk/nrf52840
16-
- nrf5340dk/nrf5340/cpuapp
17-
- nrf5340dk/nrf5340/cpunet
18-
- nrf54h20dk/nrf54h20/cpuapp
19-
- nrf54h20dk/nrf54h20/cpurad
20-
- nrf54l15dk/nrf54l15/cpuapp
21-
- ophelia4ev/nrf54l15/cpuapp
22-
integration_platforms:
23-
- nrf52840dk/nrf52840
24-
- nrf5340dk/nrf5340/cpuapp
25-
- nrf5340dk/nrf5340/cpunet
26-
- nrf54h20dk/nrf54h20/cpuapp
27-
- nrf54h20dk/nrf54h20/cpurad
28-
- nrf54l15dk/nrf54l15/cpuapp
29-
- ophelia4ev/nrf54l15/cpuapp
309
tests:
31-
sample.boards.nordic.nrf_sys_event: {}
10+
sample.boards.nordic.nrf_sys_event:
11+
platform_allow:
12+
- nrf52dk/nrf52810
13+
- nrf52dk/nrf52832
14+
- nrf52833dk/nrf52820
15+
- nrf52833dk/nrf52833
16+
- nrf52840dk/nrf52811
17+
- nrf52840dk/nrf52840
18+
- nrf5340dk/nrf5340/cpuapp
19+
- nrf5340dk/nrf5340/cpunet
20+
- nrf54h20dk/nrf54h20/cpuapp
21+
- nrf54h20dk/nrf54h20/cpurad
22+
- nrf54l15dk/nrf54l15/cpuapp
23+
- ophelia4ev/nrf54l15/cpuapp
24+
integration_platforms:
25+
- nrf52840dk/nrf52840
26+
- nrf5340dk/nrf5340/cpuapp
27+
- nrf5340dk/nrf5340/cpunet
28+
- nrf54h20dk/nrf54h20/cpuapp
29+
- nrf54h20dk/nrf54h20/cpurad
30+
- nrf54l15dk/nrf54l15/cpuapp
31+
- ophelia4ev/nrf54l15/cpuapp
3232
sample.boards.nordic.nrf_sys_event.force_constlat:
33+
platform_allow:
34+
- nrf52dk/nrf52810
35+
- nrf52dk/nrf52832
36+
- nrf52833dk/nrf52820
37+
- nrf52833dk/nrf52833
38+
- nrf52840dk/nrf52811
39+
- nrf52840dk/nrf52840
40+
- nrf5340dk/nrf5340/cpuapp
41+
- nrf5340dk/nrf5340/cpunet
42+
- nrf54h20dk/nrf54h20/cpuapp
43+
- nrf54h20dk/nrf54h20/cpurad
44+
- nrf54l15dk/nrf54l15/cpuapp
45+
- ophelia4ev/nrf54l15/cpuapp
46+
integration_platforms:
47+
- nrf52840dk/nrf52840
48+
- nrf5340dk/nrf5340/cpuapp
49+
- nrf5340dk/nrf5340/cpunet
50+
- nrf54h20dk/nrf54h20/cpuapp
51+
- nrf54h20dk/nrf54h20/cpurad
52+
- nrf54l15dk/nrf54l15/cpuapp
53+
- ophelia4ev/nrf54l15/cpuapp
3354
extra_configs:
3455
- CONFIG_SOC_NRF_FORCE_CONSTLAT=y
56+
sample.boards.nordic.nrf_sys_event.rramc_wakeup:
57+
extra_configs:
58+
- CONFIG_NRF_SYS_EVENT_IRQ_LATENCY=y
59+
- CONFIG_NRF_SYS_EVENT_GRTC_CHAN_CNT=0
60+
platform_allow:
61+
- nrf54l15dk/nrf54l15/cpuapp
62+
integration_platforms:
63+
- nrf54l15dk/nrf54l15/cpuapp
64+
sample.boards.nordic.nrf_sys_event.rramc_wakeup.ppi:
65+
extra_configs:
66+
- CONFIG_NRF_SYS_EVENT_IRQ_LATENCY=y
67+
platform_allow:
68+
- nrf54l15dk/nrf54l15/cpuapp
69+
- nrf54l15dk/nrf54l15/cpuflpr/xip
70+
integration_platforms:
71+
- nrf54l15dk/nrf54l15/cpuapp

samples/boards/nordic/nrf_sys_event/src/main.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,87 @@
55
*/
66

77
#include <nrf_sys_event.h>
8+
#include <zephyr/drivers/counter.h>
9+
#include <zephyr/cache.h>
810
#include <stdio.h>
911

12+
#ifdef CONFIG_NRF_SYS_EVENT_IRQ_LATENCY
13+
static void counter_handler(const struct device *counter_dev, uint8_t ch_id,
14+
uint32_t ticks, void *user_data)
15+
{
16+
k_sem_give((struct k_sem *)user_data);
17+
}
18+
19+
static uint32_t counter_alarm_execute(const struct device *counter_dev,
20+
struct counter_alarm_cfg *alarm_cfg, k_timeout_t timeout)
21+
{
22+
struct k_sem sem;
23+
uint32_t now;
24+
int err;
25+
26+
k_sem_init(&sem, 0, 1);
27+
alarm_cfg->user_data = &sem;
28+
29+
now = k_cycle_get_32();
30+
err = counter_set_channel_alarm(counter_dev, 0, alarm_cfg);
31+
if (err < 0) {
32+
printf("Failed to set the counter alarm.\n");
33+
return 0;
34+
}
35+
err = k_sem_take(&sem, timeout);
36+
if (err < 0) {
37+
printf("Failed waiting for counter alarm.\n");
38+
return 0;
39+
}
40+
41+
return k_cycle_get_32() - now;
42+
}
43+
44+
static void sys_event_irq_latency(void)
45+
{
46+
const struct device *counter = DEVICE_DT_GET(DT_NODELABEL(sample_counter));
47+
struct counter_alarm_cfg alarm_cfg;
48+
uint32_t delay = 1000;
49+
uint32_t delay_adj = 8;
50+
uint32_t rpt = 100;
51+
uint32_t cyc;
52+
int event_handle;
53+
54+
counter_start(counter);
55+
alarm_cfg.flags = 0;
56+
alarm_cfg.ticks = counter_us_to_ticks(counter, delay);
57+
alarm_cfg.callback = counter_handler;
58+
59+
cyc = 0;
60+
for (int i = 0; i < rpt; i++) {
61+
sys_cache_instr_invd_all();
62+
cyc += counter_alarm_execute(counter, &alarm_cfg, K_USEC(delay + 100));
63+
}
64+
65+
cyc /= rpt;
66+
printf("Alarm set for %d us, execution took:%d (no event registered)\n", delay, cyc);
67+
68+
cyc = 0;
69+
for (int i = 0; i < rpt; i++) {
70+
sys_cache_instr_invd_all();
71+
/* Event is delayed because it is registered early and not as it should just
72+
* before starting. Triggering event too early may result in RRAMC going back
73+
* to sleep before actual event wakes up the CPU.
74+
*/
75+
event_handle = nrf_sys_event_register(delay + delay_adj, true);
76+
if (event_handle < 0) {
77+
printf("Failed to register an event:%d\n", event_handle);
78+
return;
79+
}
80+
cyc += counter_alarm_execute(counter, &alarm_cfg, K_USEC(delay + 100));
81+
(void)nrf_sys_event_unregister(event_handle, false);
82+
}
83+
84+
cyc /= rpt;
85+
printf("Alarm set for %d us, execution took:%d\n", delay, cyc);
86+
}
87+
#endif /* CONFIG_NRF_SYS_EVENT_IRQ_LATENCY */
88+
1089
int main(void)
1190
{
1291
printf("request global constant latency mode\n");
@@ -37,5 +116,9 @@ int main(void)
37116
}
38117

39118
printf("constant latency mode disabled\n");
119+
120+
#ifdef CONFIG_NRF_SYS_EVENT_IRQ_LATENCY
121+
sys_event_irq_latency();
122+
#endif
40123
return 0;
41124
}

0 commit comments

Comments
 (0)