From 5cab9686bb32af86a7c79d95eadb35cf6b39d8c3 Mon Sep 17 00:00:00 2001 From: zwl Date: Tue, 6 Dec 2022 20:54:59 +0800 Subject: [PATCH] Optimized the number of npl on ESP32C2 --- components/bt/controller/esp32c2/bt.c | 8 +- .../bt/controller/lib_esp32c2/esp32c2-bt-lib | 2 +- .../nimble/include/nimble/nimble_port.h | 8 + .../include/nimble/nimble_port_freertos.h | 2 +- .../npl/freertos/src/npl_os_freertos.c | 279 ++++++++---------- components/esp_rom/esp32c2/ld/esp32c2.rom.ld | 1 - 6 files changed, 133 insertions(+), 167 deletions(-) diff --git a/components/bt/controller/esp32c2/bt.c b/components/bt/controller/esp32c2/bt.c index 032628aec9..3a91aebeda 100644 --- a/components/bt/controller/esp32c2/bt.c +++ b/components/bt/controller/esp32c2/bt.c @@ -139,6 +139,7 @@ extern int ble_sm_alg_gen_dhkey(const uint8_t *peer_pub_key_x, extern int ble_sm_alg_gen_key_pair(uint8_t *pub, uint8_t *priv); extern int ble_txpwr_set(esp_ble_enhanced_power_type_t power_type, uint16_t handle, int power_level); extern int ble_txpwr_get(esp_ble_enhanced_power_type_t power_type, uint16_t handle); +extern int ble_get_npl_element_info(esp_bt_controller_config_t *cfg, ble_npl_count_info_t * npl_info); extern uint32_t _bt_bss_start; extern uint32_t _bt_bss_end; extern uint32_t _nimble_bss_start; @@ -590,10 +591,11 @@ void ble_rtc_clk_init(void) } - esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) { esp_err_t ret = ESP_OK; + ble_npl_count_info_t npl_info; + memset(&npl_info, 0, sizeof(ble_npl_count_info_t)); if (ble_controller_status != ESP_BT_CONTROLLER_STATUS_IDLE) { ESP_LOGW(NIMBLE_PORT_LOG_TAG, "invalid controller state"); @@ -627,7 +629,9 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) goto free_mem; } - if (npl_freertos_mempool_init() != 0) { + ble_get_npl_element_info(cfg, &npl_info); + + if (npl_freertos_mempool_init(&npl_info) != 0) { ESP_LOGW(NIMBLE_PORT_LOG_TAG, "npl mempool init failed"); ret = ESP_ERR_INVALID_ARG; goto free_mem; diff --git a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib index 37a95345db..2d0c9d0d5d 160000 --- a/components/bt/controller/lib_esp32c2/esp32c2-bt-lib +++ b/components/bt/controller/lib_esp32c2/esp32c2-bt-lib @@ -1 +1 @@ -Subproject commit 37a95345db97a6c6ebde522e4be0ab06c751a575 +Subproject commit 2d0c9d0d5df1fa825ed3c48df968e3c9b8c434ee diff --git a/components/bt/porting/nimble/include/nimble/nimble_port.h b/components/bt/porting/nimble/include/nimble/nimble_port.h index c0a24ba722..f483a99bae 100644 --- a/components/bt/porting/nimble/include/nimble/nimble_port.h +++ b/components/bt/porting/nimble/include/nimble/nimble_port.h @@ -35,6 +35,14 @@ extern "C" { #endif +typedef struct { + uint16_t evt_count; + uint16_t evtq_count; + uint16_t co_count; + uint16_t sem_count; + uint16_t mutex_count; +} ble_npl_count_info_t; + void nimble_port_init(void); void nimble_port_deinit(void); diff --git a/components/bt/porting/npl/freertos/include/nimble/nimble_port_freertos.h b/components/bt/porting/npl/freertos/include/nimble/nimble_port_freertos.h index c6b38faf4d..232b4aa372 100644 --- a/components/bt/porting/npl/freertos/include/nimble/nimble_port_freertos.h +++ b/components/bt/porting/npl/freertos/include/nimble/nimble_port_freertos.h @@ -35,7 +35,7 @@ void nimble_port_freertos_init(TaskFunction_t host_task_fn); void nimble_port_freertos_deinit(void); void npl_freertos_funcs_init(void); void npl_freertos_funcs_deinit(void); -int npl_freertos_mempool_init(void); +int npl_freertos_mempool_init(ble_npl_count_info_t *npl_info); struct npl_funcs_t * npl_freertos_funcs_get(void); #ifdef __cplusplus } diff --git a/components/bt/porting/npl/freertos/src/npl_os_freertos.c b/components/bt/porting/npl/freertos/src/npl_os_freertos.c index fd8511af34..12a596e61e 100644 --- a/components/bt/porting/npl/freertos/src/npl_os_freertos.c +++ b/components/bt/porting/npl/freertos/src/npl_os_freertos.c @@ -18,6 +18,7 @@ #include "freertos/timers.h" #include "freertos/portable.h" #include "nimble/npl_freertos.h" +#include "nimble/nimble_port.h" #include "os/os_mempool.h" #include "esp_log.h" @@ -32,72 +33,15 @@ static const char *TAG = "Timer"; #define OS_MEM_ALLOC (1) -#define BT_LE_HCI_EVT_HI_BUF_COUNT DEFAULT_BT_LE_HCI_EVT_HI_BUF_COUNT -#define BT_LE_HCI_EVT_LO_BUF_COUNT DEFAULT_BT_LE_HCI_EVT_LO_BUF_COUNT -#define BT_LE_MAX_EXT_ADV_INSTANCES DEFAULT_BT_LE_MAX_EXT_ADV_INSTANCES -#define BT_LE_MAX_CONNECTIONS DEFAULT_BT_LE_MAX_CONNECTIONS - -#if CONFIG_BT_NIMBLE_ENABLED - #if MYNEWT_VAL(BLE_LL_CFG_FEAT_LE_PING) - #define LL_CFG_FEAT_LE_PING_EVT (1) - #else - #define LL_CFG_FEAT_LE_PING_EVT (0) - #endif - - #if MYNEWT_VAL(BLE_LL_CFG_FEAT_CTRL_TO_HOST_FLOW_CONTROL) - #define LL_CTRL_TO_HOST_FLOW_CTRL_EVT (1) - #else - #define LL_CTRL_TO_HOST_FLOW_CTRL_EVT (0) - #endif - - #define BT_LE_LL_EXT_ADV_AUX_PTR_CNT MYNEWT_VAL(BLE_LL_EXT_ADV_AUX_PTR_CNT) - -#else - #define BT_LE_LL_EXT_ADV_AUX_PTR_CNT (5) - #define LL_CFG_FEAT_LE_PING_EVT (1) - #define LL_CTRL_TO_HOST_FLOW_CTRL_EVT (1) +#if (!defined(SOC_ESP_NIMBLE_CONTROLLER) || !SOC_ESP_NIMBLE_CONTROLLER) +#error "not defined SOC_ESP_NIMBLE_CONTROLLER or SOC_ESP_NIMBLE_CONTROLLER is zero" #endif -#define BLE_HS_HCI_EVT_COUNT \ - (BT_LE_HCI_EVT_HI_BUF_COUNT + \ - BT_LE_HCI_EVT_LO_BUF_COUNT) - - -#define LL_NPL_BASE_EVENT_COUNT (11) -#define LL_SCAN_EXT_AUX_EVT_CNT (BT_LE_LL_EXT_ADV_AUX_PTR_CNT) -#define HCI_LL_NPL_EVENT_COUNT (1) -#define ADV_LL_NPL_EVENT_COUNT ((BT_LE_MAX_EXT_ADV_INSTANCES+1)*3) -#define SCAN_LL_NPL_EVENT_COUNT (2) -#define RL_LL_NPL_EVENT_COUNT (1) -#define SYNC_LL_NPL_EVENT_COUNT (7) - - - - - -#define CONN_MODULE_NPL_EVENT_COUNT (((LL_CFG_FEAT_LE_PING_EVT+2)*BT_LE_MAX_CONNECTIONS)+LL_CTRL_TO_HOST_FLOW_CTRL_EVT) - - -#define BLE_LL_EV_COUNT (LL_NPL_BASE_EVENT_COUNT + \ - LL_SCAN_EXT_AUX_EVT_CNT + \ - HCI_LL_NPL_EVENT_COUNT + \ - ADV_LL_NPL_EVENT_COUNT + \ - SCAN_LL_NPL_EVENT_COUNT + \ - RL_LL_NPL_EVENT_COUNT + \ - SYNC_LL_NPL_EVENT_COUNT + \ - CONN_MODULE_NPL_EVENT_COUNT) - -#define BLE_TOTAL_EV_COUNT (BLE_LL_EV_COUNT + BLE_HS_HCI_EVT_COUNT) - -#define BLE_TOTAL_EVQ_COUNT (10) - -#define BLE_TOTAL_CO_COUNT (40) - -#define BLE_TOTAL_SEM_COUNT (10) - -#define BLE_TOTAL_MUTEX_COUNT (10) - -#if SOC_ESP_NIMBLE_CONTROLLER +#define BLE_HOST_CO_COUNT (8) +#define BLE_HOST_EV_COUNT (11 + BLE_HOST_CO_COUNT) +#define BLE_HOST_EVQ_COUNT (3) +#define BLE_HOST_SEM_COUNT (1) +#define BLE_HOST_MUTEX_COUNT (4) struct os_mempool ble_freertos_ev_pool; static os_membuf_t *ble_freertos_ev_buf = NULL; @@ -114,34 +58,7 @@ static os_membuf_t *ble_freertos_sem_buf = NULL; struct os_mempool ble_freertos_mutex_pool; static os_membuf_t *ble_freertos_mutex_buf = NULL; -#else - -struct os_mempool ble_freertos_ev_pool; -static os_membuf_t ble_freertos_ev_buf[ - OS_MEMPOOL_SIZE(BLE_TOTAL_EV_COUNT, sizeof (struct ble_npl_event_freertos)) -]; - -struct os_mempool ble_freertos_evq_pool; -static os_membuf_t ble_freertos_evq_buf[ - OS_MEMPOOL_SIZE(BLE_TOTAL_EVQ_COUNT, sizeof (struct ble_npl_eventq_freertos)) -]; - -struct os_mempool ble_freertos_co_pool; -static os_membuf_t ble_freertos_co_buf[ - OS_MEMPOOL_SIZE(BLE_TOTAL_CO_COUNT, sizeof (struct ble_npl_callout_freertos)) -]; - -struct os_mempool ble_freertos_sem_pool; -static os_membuf_t ble_freertos_sem_buf[ - OS_MEMPOOL_SIZE(BLE_TOTAL_SEM_COUNT, sizeof (struct ble_npl_sem_freertos)) -]; - -struct os_mempool ble_freertos_mutex_pool; -static os_membuf_t ble_freertos_mutex_buf[ - OS_MEMPOOL_SIZE(BLE_TOTAL_MUTEX_COUNT, sizeof (struct ble_npl_mutex_freertos)) -]; - -#endif +static uint16_t ble_freertos_total_event_cnt = 0; bool IRAM_ATTR npl_freertos_os_started(void) @@ -206,9 +123,8 @@ npl_freertos_eventq_init(struct ble_npl_eventq *evq) evq->eventq = os_memblock_get(&ble_freertos_evq_pool); eventq = (struct ble_npl_eventq_freertos*)evq->eventq; BLE_LL_ASSERT(eventq); - memset(eventq, 0, sizeof(*eventq)); - eventq->q = xQueueCreate(BLE_TOTAL_EV_COUNT, sizeof(struct ble_npl_eventq *)); + eventq->q = xQueueCreate(ble_freertos_total_event_cnt, sizeof(struct ble_npl_eventq *)); BLE_LL_ASSERT(eventq->q); } #else @@ -216,9 +132,8 @@ npl_freertos_eventq_init(struct ble_npl_eventq *evq) evq->eventq = malloc(sizeof(struct ble_npl_eventq_freertos)); eventq = (struct ble_npl_eventq_freertos*)evq->eventq; BLE_LL_ASSERT(eventq); - memset(eventq, 0, sizeof(*eventq)); - eventq->q = xQueueCreate(BLE_TOTAL_EV_COUNT, sizeof(struct ble_npl_eventq *)); + eventq->q = xQueueCreate(ble_freertos_total_event_cnt, sizeof(struct ble_npl_eventq *)); BLE_LL_ASSERT(eventq->q); } #endif @@ -1117,113 +1032,153 @@ void npl_freertos_funcs_init(void) memcpy(npl_funcs, &npl_funcs_ro, sizeof(struct npl_funcs_t)); } -int npl_freertos_mempool_init(void) + +int npl_freertos_mempool_init(ble_npl_count_info_t *npl_info) { int rc = -1; + uint16_t ble_total_evt_count = 0; + uint16_t ble_total_co_count = 0; + uint16_t ble_total_evtq_count = 0; + uint16_t ble_total_sem_count = 0; + uint16_t ble_total_mutex_count = 0; -#if SOC_ESP_NIMBLE_CONTROLLER - ble_freertos_ev_buf = malloc(OS_MEMPOOL_SIZE(BLE_TOTAL_EV_COUNT, sizeof (struct ble_npl_event_freertos)) * sizeof(os_membuf_t)); - if(!ble_freertos_ev_buf) { - goto _error; - } - ble_freertos_evq_buf = malloc(OS_MEMPOOL_SIZE(BLE_TOTAL_EVQ_COUNT, sizeof (struct ble_npl_eventq_freertos)) * sizeof(os_membuf_t)); - if(!ble_freertos_evq_buf) { - goto _error; - } - ble_freertos_co_buf = malloc(OS_MEMPOOL_SIZE(BLE_TOTAL_CO_COUNT, sizeof (struct ble_npl_callout_freertos)) * sizeof(os_membuf_t)); - if(!ble_freertos_co_buf) { - goto _error; - } - ble_freertos_sem_buf = malloc(OS_MEMPOOL_SIZE(BLE_TOTAL_SEM_COUNT, sizeof (struct ble_npl_sem_freertos)) * sizeof(os_membuf_t)); - if(!ble_freertos_sem_buf) { - goto _error; - } - ble_freertos_mutex_buf = malloc( OS_MEMPOOL_SIZE(BLE_TOTAL_MUTEX_COUNT, sizeof (struct ble_npl_mutex_freertos)) * sizeof(os_membuf_t)); - if(!ble_freertos_mutex_buf) { - goto _error; + if (!npl_info) { + return -1; } -#endif + ble_total_evt_count = npl_info->evt_count + BLE_HOST_EV_COUNT; + ble_total_evtq_count = npl_info->evtq_count + BLE_HOST_EVQ_COUNT; + ble_total_co_count = npl_info->co_count + BLE_HOST_CO_COUNT; + ble_total_sem_count = npl_info->sem_count + BLE_HOST_SEM_COUNT; + ble_total_mutex_count = npl_info->mutex_count + BLE_HOST_MUTEX_COUNT; + ble_freertos_total_event_cnt = ble_total_evt_count; - rc = os_mempool_init(&ble_freertos_ev_pool, BLE_TOTAL_EV_COUNT, - sizeof (struct ble_npl_event_freertos), ble_freertos_ev_buf, - "ble_freertos_ev_pool"); - if(rc != 0) { - goto _error; + if (ble_total_evt_count) { + ble_freertos_ev_buf = malloc(OS_MEMPOOL_SIZE(ble_total_evt_count, + sizeof (struct ble_npl_event_freertos)) * + sizeof(os_membuf_t)); + if (!ble_freertos_ev_buf) { + goto _error; + } + rc = os_mempool_init(&ble_freertos_ev_pool, ble_total_evt_count, + sizeof (struct ble_npl_event_freertos), ble_freertos_ev_buf, + "ble_freertos_ev_pool"); + if (rc) { + goto _error; + } } - rc = os_mempool_init(&ble_freertos_evq_pool, BLE_TOTAL_EVQ_COUNT, - sizeof (struct ble_npl_eventq_freertos), ble_freertos_evq_buf, - "ble_freertos_evq_pool"); - if(rc != 0) { - goto _error; + if (ble_total_evtq_count) { + ble_freertos_evq_buf = malloc(OS_MEMPOOL_SIZE(ble_total_evtq_count, + sizeof (struct ble_npl_eventq_freertos)) * + sizeof(os_membuf_t)); + if (!ble_freertos_evq_buf) { + goto _error; + } + rc = os_mempool_init(&ble_freertos_evq_pool, ble_total_evtq_count, + sizeof (struct ble_npl_eventq_freertos), ble_freertos_evq_buf, + "ble_freertos_evq_pool"); + if (rc) { + goto _error; + } } - rc = os_mempool_init(&ble_freertos_co_pool, BLE_TOTAL_CO_COUNT, - sizeof (struct ble_npl_callout_freertos), ble_freertos_co_buf, - "ble_freertos_co_pool"); - if(rc != 0) { - goto _error; + if (ble_total_co_count) { + ble_freertos_co_buf = malloc(OS_MEMPOOL_SIZE(ble_total_co_count, + sizeof (struct ble_npl_callout_freertos)) * + sizeof(os_membuf_t)); + if (!ble_freertos_co_buf) { + goto _error; + } + rc = os_mempool_init(&ble_freertos_co_pool, ble_total_co_count, + sizeof (struct ble_npl_callout_freertos), ble_freertos_co_buf, + "ble_freertos_co_pool"); + if (rc) { + goto _error; + } } - rc = os_mempool_init(&ble_freertos_sem_pool, BLE_TOTAL_SEM_COUNT, - sizeof (struct ble_npl_sem_freertos), ble_freertos_sem_buf, - "ble_freertos_sem_pool"); - if(rc != 0) { - goto _error; + if (ble_total_sem_count) { + ble_freertos_sem_buf = malloc(OS_MEMPOOL_SIZE(ble_total_sem_count, + sizeof (struct ble_npl_sem_freertos)) * + sizeof(os_membuf_t)); + if (!ble_freertos_sem_buf) { + goto _error; + } + rc = os_mempool_init(&ble_freertos_sem_pool, ble_total_sem_count, + sizeof (struct ble_npl_sem_freertos), ble_freertos_sem_buf, + "ble_freertos_sem_pool"); + if (rc) { + goto _error; + } } - rc = os_mempool_init(&ble_freertos_mutex_pool, BLE_TOTAL_MUTEX_COUNT, - sizeof (struct ble_npl_mutex_freertos), ble_freertos_mutex_buf, - "ble_freertos_mutex_pool"); - if(rc == 0) { - return rc; + if (ble_total_mutex_count) { + ble_freertos_mutex_buf = malloc(OS_MEMPOOL_SIZE(ble_total_mutex_count, + sizeof (struct ble_npl_mutex_freertos)) * + sizeof(os_membuf_t)); + if (!ble_freertos_mutex_buf) { + goto _error; + } + rc = os_mempool_init(&ble_freertos_mutex_pool, ble_total_mutex_count, + sizeof (struct ble_npl_mutex_freertos), ble_freertos_mutex_buf, + "ble_freertos_mutex_pool"); + if (rc) { + goto _error; + } } + + return 0; _error: - -#if SOC_ESP_NIMBLE_CONTROLLER - if(ble_freertos_ev_buf) { + if (ble_freertos_ev_buf) { free(ble_freertos_ev_buf); + ble_freertos_ev_buf = NULL; } - if(ble_freertos_evq_buf) { + + if (ble_freertos_evq_buf) { free(ble_freertos_evq_buf); + ble_freertos_evq_buf = NULL; } - if(ble_freertos_co_buf) { + + if (ble_freertos_co_buf) { free(ble_freertos_co_buf); + ble_freertos_co_buf = NULL; } - if(ble_freertos_sem_buf) { + + if (ble_freertos_sem_buf) { free(ble_freertos_sem_buf); + ble_freertos_sem_buf = NULL; } - if(ble_freertos_mutex_buf) { + + if (ble_freertos_mutex_buf) { free(ble_freertos_mutex_buf); + ble_freertos_mutex_buf = NULL; } return -1; -#else - - BLE_LL_ASSERT(rc == 0); - return rc; -#endif } void npl_freertos_mempool_deinit(void) { -#if SOC_ESP_NIMBLE_CONTROLLER - if(ble_freertos_ev_buf) { + if (ble_freertos_ev_buf) { free(ble_freertos_ev_buf); + ble_freertos_ev_buf = NULL; } - if(ble_freertos_evq_buf) { + if (ble_freertos_evq_buf) { free(ble_freertos_evq_buf); + ble_freertos_evq_buf = NULL; } - if(ble_freertos_co_buf) { + if (ble_freertos_co_buf) { free(ble_freertos_co_buf); + ble_freertos_co_buf = NULL; } - if(ble_freertos_sem_buf) { + if (ble_freertos_sem_buf) { free(ble_freertos_sem_buf); + ble_freertos_sem_buf = NULL; } - if(ble_freertos_mutex_buf) { + if (ble_freertos_mutex_buf) { free(ble_freertos_mutex_buf); + ble_freertos_mutex_buf = NULL; } -#endif } void npl_freertos_funcs_deinit(void) diff --git a/components/esp_rom/esp32c2/ld/esp32c2.rom.ld b/components/esp_rom/esp32c2/ld/esp32c2.rom.ld index 4ce92cb11f..fe6e7a60af 100644 --- a/components/esp_rom/esp32c2/ld/esp32c2.rom.ld +++ b/components/esp_rom/esp32c2/ld/esp32c2.rom.ld @@ -1138,7 +1138,6 @@ r_ble_lll_conn_get_next_sched_time = 0x40001524; r_ble_lll_conn_halt = 0x4000152c; r_ble_lll_conn_master_common_init = 0x40001530; r_ble_lll_conn_master_new = 0x40001534; -r_ble_lll_conn_module_deinit = 0x40001538; r_ble_lll_conn_module_reset = 0x40001540; r_ble_lll_conn_pre_process = 0x40001548; r_ble_lll_conn_process_acked_pdu = 0x4000154c;