fix(openthread): make ot task queue sending non-permanent blocking

This commit is contained in:
zwx 2024-07-09 11:12:31 +08:00
parent 3883a17f54
commit 050030f039
6 changed files with 60 additions and 45 deletions

@ -1 +1 @@
Subproject commit 34d698a274940730901b934caa023a3281aca53e Subproject commit 203c78501e9a6ea9ca3a929e6f9b6b9691ef16ee

View File

@ -99,8 +99,11 @@ static void ot_cli_loop(void *context)
printf("Internal error: %s\n", esp_err_to_name(err)); printf("Internal error: %s\n", esp_err_to_name(err));
} }
} else { } else {
esp_openthread_cli_input(line); if (esp_openthread_cli_input(line) == ESP_OK) {
xTaskNotifyWait(0, 0, NULL, portMAX_DELAY); xTaskNotifyWait(0, 0, NULL, portMAX_DELAY);
} else {
printf("Openthread task is busy, failed to run command: %s\n", line);
}
} }
linenoiseHistoryAdd(line); linenoiseHistoryAdd(line);
} }

View File

@ -23,6 +23,12 @@
#define OPENTHREAD_IP6_MTU 1280 #define OPENTHREAD_IP6_MTU 1280
#if CONFIG_OPENTHREAD_BORDER_ROUTER
#if CONFIG_LWIP_IPV6_NUM_ADDRESSES != 12
#error CONFIG_LWIP_IPV6_NUM_ADDRESSES should be set to 12, please configure it using `idf.py menuconfig`
#endif
#endif
static err_t openthread_netif_init(struct netif *netif); static err_t openthread_netif_init(struct netif *netif);
static void openthread_netif_input(void *h, void *buffer, size_t len, void *eb); static void openthread_netif_input(void *h, void *buffer, size_t len, void *eb);

View File

@ -21,6 +21,8 @@ static QueueHandle_t s_task_queue = NULL;
static int s_task_queue_event_fd = -1; static int s_task_queue_event_fd = -1;
static const char *task_queue_workflow = "task_queue"; static const char *task_queue_workflow = "task_queue";
#define OT_TASK_QUEUE_SENDING_WAIT_TIME pdMS_TO_TICKS(100)
typedef struct { typedef struct {
esp_openthread_task_t task; esp_openthread_task_t task;
void *arg; void *arg;
@ -60,7 +62,7 @@ esp_err_t IRAM_ATTR esp_openthread_task_queue_post(esp_openthread_task_t task, v
ESP_RETURN_ON_FALSE_ISR(xQueueSendFromISR(s_task_queue, &task_storage, &task_woken), ESP_FAIL, OT_PLAT_LOG_TAG, ESP_RETURN_ON_FALSE_ISR(xQueueSendFromISR(s_task_queue, &task_storage, &task_woken), ESP_FAIL, OT_PLAT_LOG_TAG,
"Failed to post task to OpenThread task queue"); "Failed to post task to OpenThread task queue");
} else { } else {
ESP_RETURN_ON_FALSE(xQueueSend(s_task_queue, &task_storage, portMAX_DELAY), ESP_FAIL, OT_PLAT_LOG_TAG, ESP_RETURN_ON_FALSE(xQueueSend(s_task_queue, &task_storage, OT_TASK_QUEUE_SENDING_WAIT_TIME), ESP_FAIL, OT_PLAT_LOG_TAG,
"Failed to post task to OpenThread task queue"); "Failed to post task to OpenThread task queue");
} }
ret = write(s_task_queue_event_fd, &val, sizeof(val)); ret = write(s_task_queue_event_fd, &val, sizeof(val));

View File

@ -73,29 +73,15 @@ static void ot_task_worker(void *aContext)
// Initialize the OpenThread stack // Initialize the OpenThread stack
ESP_ERROR_CHECK(esp_openthread_init(&config)); ESP_ERROR_CHECK(esp_openthread_init(&config));
// Initialize border routing features
esp_openthread_lock_acquire(portMAX_DELAY);
#if CONFIG_OPENTHREAD_STATE_INDICATOR_ENABLE
ESP_ERROR_CHECK(esp_openthread_state_indicator_init(esp_openthread_get_instance()));
#endif
ESP_ERROR_CHECK(esp_netif_attach(openthread_netif, esp_openthread_netif_glue_init(&config))); ESP_ERROR_CHECK(esp_netif_attach(openthread_netif, esp_openthread_netif_glue_init(&config)));
esp_openthread_lock_acquire(portMAX_DELAY);
(void)otLoggingSetLevel(CONFIG_LOG_DEFAULT_LEVEL); (void)otLoggingSetLevel(CONFIG_LOG_DEFAULT_LEVEL);
esp_openthread_cli_init(); esp_openthread_cli_init();
#if CONFIG_OPENTHREAD_BR_AUTO_START
ESP_ERROR_CHECK(esp_openthread_border_router_init());
otOperationalDatasetTlvs dataset;
otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset);
ESP_ERROR_CHECK(esp_openthread_auto_start((error == OT_ERROR_NONE) ? &dataset : NULL));
#endif // CONFIG_OPENTHREAD_BR_AUTO_START
esp_cli_custom_command_init(); esp_cli_custom_command_init();
esp_openthread_cli_create_task();
esp_openthread_lock_release(); esp_openthread_lock_release();
// Run the main loop // Run the main loop
esp_openthread_cli_create_task();
esp_openthread_launch_mainloop(); esp_openthread_launch_mainloop();
// Clean up // Clean up
@ -105,36 +91,15 @@ static void ot_task_worker(void *aContext)
vTaskDelete(NULL); vTaskDelete(NULL);
} }
void app_main(void) void ot_br_init(void *ctx)
{ {
// Used eventfds:
// * netif
// * task queue
// * border router
esp_vfs_eventfd_config_t eventfd_config = {
#if CONFIG_OPENTHREAD_RADIO_NATIVE || CONFIG_OPENTHREAD_RADIO_SPINEL_SPI
// * radio driver (A native radio device needs a eventfd for radio driver.)
// * SpiSpinelInterface (The Spi Spinel Interface needs a eventfd.)
// The above will not exist at the same time.
.max_fds = 4,
#else
.max_fds = 3,
#endif
};
ESP_ERROR_CHECK(esp_vfs_eventfd_register(&eventfd_config));
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
#if CONFIG_EXAMPLE_CONNECT_WIFI #if CONFIG_EXAMPLE_CONNECT_WIFI
#if CONFIG_OPENTHREAD_BR_AUTO_START #if CONFIG_OPENTHREAD_BR_AUTO_START
ESP_ERROR_CHECK(example_connect()); ESP_ERROR_CHECK(example_connect());
ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_MAX_MODEM));
#if CONFIG_ESP_COEX_SW_COEXIST_ENABLE && CONFIG_OPENTHREAD_RADIO_NATIVE #if CONFIG_ESP_COEX_SW_COEXIST_ENABLE && CONFIG_OPENTHREAD_RADIO_NATIVE
ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_MIN_MODEM));
ESP_ERROR_CHECK(esp_coex_wifi_i154_enable()); ESP_ERROR_CHECK(esp_coex_wifi_i154_enable());
#else #else
ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE));
#if CONFIG_EXTERNAL_COEX_ENABLE #if CONFIG_EXTERNAL_COEX_ENABLE
ot_br_external_coexist_init(); ot_br_external_coexist_init();
@ -155,5 +120,44 @@ void app_main(void)
ESP_ERROR_CHECK(mdns_init()); ESP_ERROR_CHECK(mdns_init());
ESP_ERROR_CHECK(mdns_hostname_set("esp-ot-br")); ESP_ERROR_CHECK(mdns_hostname_set("esp-ot-br"));
xTaskCreate(ot_task_worker, "ot_br_main", 20480, xTaskGetCurrentTaskHandle(), 5, NULL);
// Initialize border routing features
esp_openthread_lock_acquire(portMAX_DELAY);
#if CONFIG_OPENTHREAD_STATE_INDICATOR_ENABLE
ESP_ERROR_CHECK(esp_openthread_state_indicator_init(esp_openthread_get_instance()));
#endif
#if CONFIG_OPENTHREAD_BR_AUTO_START
ESP_ERROR_CHECK(esp_openthread_border_router_init());
otOperationalDatasetTlvs dataset;
otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset);
ESP_ERROR_CHECK(esp_openthread_auto_start((error == OT_ERROR_NONE) ? &dataset : NULL));
#endif // CONFIG_OPENTHREAD_BR_AUTO_START
esp_openthread_lock_release();
vTaskDelete(NULL);
}
void app_main(void)
{
// Used eventfds:
// * netif
// * task queue
// * border router
esp_vfs_eventfd_config_t eventfd_config = {
#if CONFIG_OPENTHREAD_RADIO_NATIVE || CONFIG_OPENTHREAD_RADIO_SPINEL_SPI
// * radio driver (A native radio device needs a eventfd for radio driver.)
// * SpiSpinelInterface (The Spi Spinel Interface needs a eventfd.)
// The above will not exist at the same time.
.max_fds = 4,
#else
.max_fds = 3,
#endif
};
ESP_ERROR_CHECK(esp_vfs_eventfd_register(&eventfd_config));
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
xTaskCreate(ot_task_worker, "ot_br_main", 8192, xTaskGetCurrentTaskHandle(), 5, NULL);
xTaskCreate(ot_br_init, "ot_br_init", 6144, NULL, 4, NULL);
} }

View File

@ -31,7 +31,7 @@ CONFIG_OPENTHREAD_RADIO_SPINEL_UART=y
# lwIP # lwIP
# #
CONFIG_LWIP_IPV6_FORWARD=y CONFIG_LWIP_IPV6_FORWARD=y
CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 CONFIG_LWIP_IPV6_NUM_ADDRESSES=12
CONFIG_LWIP_MULTICAST_PING=y CONFIG_LWIP_MULTICAST_PING=y
CONFIG_LWIP_NETIF_STATUS_CALLBACK=y CONFIG_LWIP_NETIF_STATUS_CALLBACK=y
CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y