Optimized the number of npl on ESP32C2

pull/10970/head
zwl 2022-12-06 20:54:59 +08:00
rodzic fe18c89961
commit 5cab9686bb
6 zmienionych plików z 133 dodań i 167 usunięć

Wyświetl plik

@ -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;

@ -1 +1 @@
Subproject commit 37a95345db97a6c6ebde522e4be0ab06c751a575
Subproject commit 2d0c9d0d5df1fa825ed3c48df968e3c9b8c434ee

Wyświetl plik

@ -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);

Wyświetl plik

@ -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
}

Wyświetl plik

@ -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)

Wyświetl plik

@ -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;