Bluetooth: controller: Add ISR cputime measurement
Adding ISR cputime measurement for Radio, LLL, ULL_HIGH and ULL_LOW execution contexts. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
c8d1c3ba2c
commit
929dae8cad
5 changed files with 123 additions and 2 deletions
|
@ -5731,13 +5731,17 @@ static void encode_control(struct node_rx_pdu *node_rx,
|
||||||
|
|
||||||
#if defined(CONFIG_BT_CTLR_PROFILE_ISR)
|
#if defined(CONFIG_BT_CTLR_PROFILE_ISR)
|
||||||
case NODE_RX_TYPE_PROFILE:
|
case NODE_RX_TYPE_PROFILE:
|
||||||
BT_INFO("l: %d, %d, %d; t: %d, %d, %d.",
|
BT_INFO("l: %u, %u, %u; t: %u, %u, %u; cpu: %u, %u, %u, %u.",
|
||||||
pdu_data->profile.lcur,
|
pdu_data->profile.lcur,
|
||||||
pdu_data->profile.lmin,
|
pdu_data->profile.lmin,
|
||||||
pdu_data->profile.lmax,
|
pdu_data->profile.lmax,
|
||||||
pdu_data->profile.cur,
|
pdu_data->profile.cur,
|
||||||
pdu_data->profile.min,
|
pdu_data->profile.min,
|
||||||
pdu_data->profile.max);
|
pdu_data->profile.max,
|
||||||
|
pdu_data->profile.radio,
|
||||||
|
pdu_data->profile.lll,
|
||||||
|
pdu_data->profile.ull_high,
|
||||||
|
pdu_data->profile.ull_low);
|
||||||
return;
|
return;
|
||||||
#endif /* CONFIG_BT_CTLR_PROFILE_ISR */
|
#endif /* CONFIG_BT_CTLR_PROFILE_ISR */
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "lll_vendor.h"
|
#include "lll_vendor.h"
|
||||||
#include "lll_clock.h"
|
#include "lll_clock.h"
|
||||||
#include "lll_internal.h"
|
#include "lll_internal.h"
|
||||||
|
#include "lll_prof_internal.h"
|
||||||
|
|
||||||
#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_HCI_DRIVER)
|
#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_HCI_DRIVER)
|
||||||
#define LOG_MODULE_NAME bt_ctlr_lll
|
#define LOG_MODULE_NAME bt_ctlr_lll
|
||||||
|
@ -78,10 +79,14 @@ ISR_DIRECT_DECLARE(radio_nrf5_isr)
|
||||||
{
|
{
|
||||||
DEBUG_RADIO_ISR(1);
|
DEBUG_RADIO_ISR(1);
|
||||||
|
|
||||||
|
lll_prof_enter_radio();
|
||||||
|
|
||||||
isr_radio();
|
isr_radio();
|
||||||
|
|
||||||
ISR_DIRECT_PM();
|
ISR_DIRECT_PM();
|
||||||
|
|
||||||
|
lll_prof_exit_radio();
|
||||||
|
|
||||||
DEBUG_RADIO_ISR(0);
|
DEBUG_RADIO_ISR(0);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -90,6 +95,8 @@ static void rtc0_nrf5_isr(const void *arg)
|
||||||
{
|
{
|
||||||
DEBUG_TICKER_ISR(1);
|
DEBUG_TICKER_ISR(1);
|
||||||
|
|
||||||
|
lll_prof_enter_ull_high();
|
||||||
|
|
||||||
/* On compare0 run ticker worker instance0 */
|
/* On compare0 run ticker worker instance0 */
|
||||||
if (NRF_RTC0->EVENTS_COMPARE[0]) {
|
if (NRF_RTC0->EVENTS_COMPARE[0]) {
|
||||||
NRF_RTC0->EVENTS_COMPARE[0] = 0;
|
NRF_RTC0->EVENTS_COMPARE[0] = 0;
|
||||||
|
@ -99,9 +106,15 @@ static void rtc0_nrf5_isr(const void *arg)
|
||||||
|
|
||||||
mayfly_run(TICKER_USER_ID_ULL_HIGH);
|
mayfly_run(TICKER_USER_ID_ULL_HIGH);
|
||||||
|
|
||||||
|
lll_prof_exit_ull_high();
|
||||||
|
|
||||||
#if !defined(CONFIG_BT_CTLR_LOW_LAT) && \
|
#if !defined(CONFIG_BT_CTLR_LOW_LAT) && \
|
||||||
(CONFIG_BT_CTLR_ULL_HIGH_PRIO == CONFIG_BT_CTLR_ULL_LOW_PRIO)
|
(CONFIG_BT_CTLR_ULL_HIGH_PRIO == CONFIG_BT_CTLR_ULL_LOW_PRIO)
|
||||||
|
lll_prof_enter_ull_low();
|
||||||
|
|
||||||
mayfly_run(TICKER_USER_ID_ULL_LOW);
|
mayfly_run(TICKER_USER_ID_ULL_LOW);
|
||||||
|
|
||||||
|
lll_prof_exit_ull_low();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DEBUG_TICKER_ISR(0);
|
DEBUG_TICKER_ISR(0);
|
||||||
|
@ -111,8 +124,12 @@ static void swi_lll_nrf5_isr(const void *arg)
|
||||||
{
|
{
|
||||||
DEBUG_RADIO_ISR(1);
|
DEBUG_RADIO_ISR(1);
|
||||||
|
|
||||||
|
lll_prof_enter_lll();
|
||||||
|
|
||||||
mayfly_run(TICKER_USER_ID_LLL);
|
mayfly_run(TICKER_USER_ID_LLL);
|
||||||
|
|
||||||
|
lll_prof_exit_lll();
|
||||||
|
|
||||||
DEBUG_RADIO_ISR(0);
|
DEBUG_RADIO_ISR(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,8 +139,12 @@ static void swi_ull_low_nrf5_isr(const void *arg)
|
||||||
{
|
{
|
||||||
DEBUG_TICKER_JOB(1);
|
DEBUG_TICKER_JOB(1);
|
||||||
|
|
||||||
|
lll_prof_enter_ull_low();
|
||||||
|
|
||||||
mayfly_run(TICKER_USER_ID_ULL_LOW);
|
mayfly_run(TICKER_USER_ID_ULL_LOW);
|
||||||
|
|
||||||
|
lll_prof_exit_ull_low();
|
||||||
|
|
||||||
DEBUG_TICKER_JOB(0);
|
DEBUG_TICKER_JOB(0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,6 +18,17 @@
|
||||||
|
|
||||||
#include "lll.h"
|
#include "lll.h"
|
||||||
|
|
||||||
|
static inline void sample(uint32_t *timestamp);
|
||||||
|
static inline void delta(uint32_t timestamp, uint8_t *cputime);
|
||||||
|
|
||||||
|
static uint32_t timestamp_radio;
|
||||||
|
static uint32_t timestamp_lll;
|
||||||
|
static uint32_t timestamp_ull_high;
|
||||||
|
static uint32_t timestamp_ull_low;
|
||||||
|
static uint8_t cputime_radio;
|
||||||
|
static uint8_t cputime_lll;
|
||||||
|
static uint8_t cputime_ull_high;
|
||||||
|
static uint8_t cputime_ull_low;
|
||||||
static uint8_t latency_min = (uint8_t) -1;
|
static uint8_t latency_min = (uint8_t) -1;
|
||||||
static uint8_t latency_max;
|
static uint8_t latency_max;
|
||||||
static uint8_t latency_prev;
|
static uint8_t latency_prev;
|
||||||
|
@ -26,6 +37,46 @@ static uint8_t cputime_max;
|
||||||
static uint8_t cputime_prev;
|
static uint8_t cputime_prev;
|
||||||
static uint32_t timestamp_latency;
|
static uint32_t timestamp_latency;
|
||||||
|
|
||||||
|
void lll_prof_enter_radio(void)
|
||||||
|
{
|
||||||
|
sample(×tamp_radio);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lll_prof_exit_radio(void)
|
||||||
|
{
|
||||||
|
delta(timestamp_radio, &cputime_radio);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lll_prof_enter_lll(void)
|
||||||
|
{
|
||||||
|
sample(×tamp_lll);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lll_prof_exit_lll(void)
|
||||||
|
{
|
||||||
|
delta(timestamp_lll, &cputime_lll);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lll_prof_enter_ull_high(void)
|
||||||
|
{
|
||||||
|
sample(×tamp_ull_high);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lll_prof_exit_ull_high(void)
|
||||||
|
{
|
||||||
|
delta(timestamp_ull_high, &cputime_ull_high);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lll_prof_enter_ull_low(void)
|
||||||
|
{
|
||||||
|
sample(×tamp_ull_low);
|
||||||
|
}
|
||||||
|
|
||||||
|
void lll_prof_exit_ull_low(void)
|
||||||
|
{
|
||||||
|
delta(timestamp_ull_low, &cputime_ull_low);
|
||||||
|
}
|
||||||
|
|
||||||
void lll_prof_latency_capture(void)
|
void lll_prof_latency_capture(void)
|
||||||
{
|
{
|
||||||
/* sample the packet timer, use it to calculate ISR latency
|
/* sample the packet timer, use it to calculate ISR latency
|
||||||
|
@ -134,9 +185,30 @@ void lll_prof_send(void)
|
||||||
p->cur = cputime;
|
p->cur = cputime;
|
||||||
p->min = cputime_min;
|
p->min = cputime_min;
|
||||||
p->max = cputime_max;
|
p->max = cputime_max;
|
||||||
|
p->radio = cputime_radio;
|
||||||
|
p->lll = cputime_lll;
|
||||||
|
p->ull_high = cputime_ull_high;
|
||||||
|
p->ull_low = cputime_ull_low;
|
||||||
|
|
||||||
ull_rx_put(rx->hdr.link, rx);
|
ull_rx_put(rx->hdr.link, rx);
|
||||||
ull_rx_sched();
|
ull_rx_sched();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void sample(uint32_t *timestamp)
|
||||||
|
{
|
||||||
|
radio_tmr_sample();
|
||||||
|
*timestamp = radio_tmr_sample_get();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void delta(uint32_t timestamp, uint8_t *cputime)
|
||||||
|
{
|
||||||
|
uint32_t delta;
|
||||||
|
|
||||||
|
radio_tmr_sample();
|
||||||
|
delta = radio_tmr_sample_get() - timestamp;
|
||||||
|
if (delta < UINT8_MAX && delta > *cputime) {
|
||||||
|
*cputime = delta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -4,6 +4,26 @@
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_BT_CTLR_PROFILE_ISR)
|
||||||
|
void lll_prof_enter_radio(void);
|
||||||
|
void lll_prof_exit_radio(void);
|
||||||
|
void lll_prof_enter_lll(void);
|
||||||
|
void lll_prof_exit_lll(void);
|
||||||
|
void lll_prof_enter_ull_high(void);
|
||||||
|
void lll_prof_exit_ull_high(void);
|
||||||
|
void lll_prof_enter_ull_low(void);
|
||||||
|
void lll_prof_exit_ull_low(void);
|
||||||
|
#else
|
||||||
|
static inline void lll_prof_enter_radio(void) {}
|
||||||
|
static inline void lll_prof_exit_radio(void) {}
|
||||||
|
static inline void lll_prof_enter_lll(void) {}
|
||||||
|
static inline void lll_prof_exit_lll(void) {}
|
||||||
|
static inline void lll_prof_enter_ull_high(void) {}
|
||||||
|
static inline void lll_prof_exit_ull_high(void) {}
|
||||||
|
static inline void lll_prof_enter_ull_low(void) {}
|
||||||
|
static inline void lll_prof_exit_ull_low(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
void lll_prof_latency_capture(void);
|
void lll_prof_latency_capture(void);
|
||||||
void lll_prof_radio_end_backup(void);
|
void lll_prof_radio_end_backup(void);
|
||||||
void lll_prof_cputime_capture(void);
|
void lll_prof_cputime_capture(void);
|
||||||
|
|
|
@ -610,6 +610,10 @@ struct profile {
|
||||||
uint8_t cur;
|
uint8_t cur;
|
||||||
uint8_t min;
|
uint8_t min;
|
||||||
uint8_t max;
|
uint8_t max;
|
||||||
|
uint8_t radio;
|
||||||
|
uint8_t lll;
|
||||||
|
uint8_t ull_high;
|
||||||
|
uint8_t ull_low;
|
||||||
} __packed;
|
} __packed;
|
||||||
#endif /* CONFIG_BT_CTLR_PROFILE_ISR */
|
#endif /* CONFIG_BT_CTLR_PROFILE_ISR */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue