Merge branch 'bugfix/modbus_add_task_affinity_and_callbacks_v42' into 'release/v4.2'

freemodbus: add task affinity and callbacks (backport v4.2)

See merge request espressif/esp-idf!14542
This commit is contained in:
morris
2022-04-08 15:59:33 +08:00
6 changed files with 41 additions and 9 deletions

View File

@ -78,6 +78,29 @@ menu "Modbus configuration"
Modbus UART driver event task priority. Modbus UART driver event task priority.
The priority of Modbus controller task is equal to (CONFIG_FMB_SERIAL_TASK_PRIO - 1). The priority of Modbus controller task is equal to (CONFIG_FMB_SERIAL_TASK_PRIO - 1).
choice FMB_PORT_TASK_AFFINITY
prompt "Modbus task affinity"
default FMB_PORT_TASK_AFFINITY_CPU0
depends on !FREERTOS_UNICORE
help
Allows setting the core affinity of the Modbus controller task, i.e. whether the task is pinned to
particular CPU, or allowed to run on any CPU.
config FMB_PORT_TASK_AFFINITY_NO_AFFINITY
bool "No affinity"
config FMB_PORT_TASK_AFFINITY_CPU0
bool "CPU0"
config FMB_PORT_TASK_AFFINITY_CPU1
bool "CPU1"
endchoice
config FMB_PORT_TASK_AFFINITY
hex
default FREERTOS_NO_AFFINITY if FMB_PORT_TASK_AFFINITY_NO_AFFINITY || FREERTOS_UNICORE
default 0x0 if FMB_PORT_TASK_AFFINITY_CPU0
default 0x1 if FMB_PORT_TASK_AFFINITY_CPU1
config FMB_CONTROLLER_SLAVE_ID_SUPPORT config FMB_CONTROLLER_SLAVE_ID_SUPPORT
bool "Modbus controller slave ID support" bool "Modbus controller slave ID support"
default n default n
@ -130,7 +153,7 @@ menu "Modbus configuration"
config FMB_TIMER_PORT_ENABLED config FMB_TIMER_PORT_ENABLED
bool "Modbus slave stack use timer for 3.5T symbol time measurement" bool "Modbus slave stack use timer for 3.5T symbol time measurement"
default y default n
help help
If this option is set the Modbus stack uses timer for T3.5 time measurement. If this option is set the Modbus stack uses timer for T3.5 time measurement.
Else the internal UART TOUT timeout is used for 3.5T symbol time measurement. Else the internal UART TOUT timeout is used for 3.5T symbol time measurement.

View File

@ -72,6 +72,9 @@
#define MB_SERIAL_RESP_LEN_MIN (4) #define MB_SERIAL_RESP_LEN_MIN (4)
// The task affinity for Modbus stack tasks
#define MB_PORT_TASK_AFFINITY (CONFIG_FMB_PORT_TASK_AFFINITY)
#define MB_PORT_CHECK(a, ret_val, str, ...) \ #define MB_PORT_CHECK(a, ret_val, str, ...) \
if (!(a)) { \ if (!(a)) { \
ESP_LOGE(MB_PORT_TAG, "%s(%u): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \ ESP_LOGE(MB_PORT_TAG, "%s(%u): " str, __FUNCTION__, __LINE__, ##__VA_ARGS__); \

View File

@ -246,8 +246,10 @@ BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate,
uart_set_always_rx_timeout(ucUartNumber, true); uart_set_always_rx_timeout(ucUartNumber, true);
// Create a task to handle UART events // Create a task to handle UART events
BaseType_t xStatus = xTaskCreate(vUartTask, "uart_queue_task", MB_SERIAL_TASK_STACK_SIZE, BaseType_t xStatus = xTaskCreatePinnedToCore(vUartTask, "uart_queue_task",
NULL, MB_SERIAL_TASK_PRIO, &xMbTaskHandle); MB_SERIAL_TASK_STACK_SIZE,
NULL, MB_SERIAL_TASK_PRIO,
&xMbTaskHandle, MB_PORT_TASK_AFFINITY);
if (xStatus != pdPASS) { if (xStatus != pdPASS) {
vTaskDelete(xMbTaskHandle); vTaskDelete(xMbTaskHandle);
// Force exit from function with failure // Force exit from function with failure

View File

@ -248,8 +248,10 @@ BOOL xMBMasterPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits,
uart_set_always_rx_timeout(ucUartNumber, true); uart_set_always_rx_timeout(ucUartNumber, true);
// Create a task to handle UART events // Create a task to handle UART events
BaseType_t xStatus = xTaskCreate(vUartTask, "uart_queue_task", MB_SERIAL_TASK_STACK_SIZE, BaseType_t xStatus = xTaskCreatePinnedToCore(vUartTask, "uart_queue_task",
NULL, MB_SERIAL_TASK_PRIO, &xMbTaskHandle); MB_SERIAL_TASK_STACK_SIZE,
NULL, MB_SERIAL_TASK_PRIO,
&xMbTaskHandle, MB_PORT_TASK_AFFINITY);
if (xStatus != pdPASS) { if (xStatus != pdPASS) {
vTaskDelete(xMbTaskHandle); vTaskDelete(xMbTaskHandle);
// Force exit from function with failure // Force exit from function with failure

View File

@ -673,12 +673,13 @@ esp_err_t mbc_serial_master_create(mb_port_type_t port_type, void** handler)
MB_MASTER_CHECK((mbm_opts->mbm_event_group != NULL), MB_MASTER_CHECK((mbm_opts->mbm_event_group != NULL),
ESP_ERR_NO_MEM, "mb event group error."); ESP_ERR_NO_MEM, "mb event group error.");
// Create modbus controller task // Create modbus controller task
status = xTaskCreate((void*)&modbus_master_task, status = xTaskCreatePinnedToCore((void*)&modbus_master_task,
"modbus_matask", "modbus_matask",
MB_CONTROLLER_STACK_SIZE, MB_CONTROLLER_STACK_SIZE,
NULL, // No parameters NULL, // No parameters
MB_CONTROLLER_PRIORITY, MB_CONTROLLER_PRIORITY,
&mbm_opts->mbm_task_handle); &mbm_opts->mbm_task_handle,
MB_PORT_TASK_AFFINITY);
if (status != pdPASS) { if (status != pdPASS) {
vTaskDelete(mbm_opts->mbm_task_handle); vTaskDelete(mbm_opts->mbm_task_handle);
MB_MASTER_CHECK((status == pdPASS), ESP_ERR_NO_MEM, MB_MASTER_CHECK((status == pdPASS), ESP_ERR_NO_MEM,

View File

@ -488,12 +488,13 @@ esp_err_t mbc_serial_slave_create(mb_port_type_t port_type, void** handler)
MB_SLAVE_CHECK((mbs_opts->mbs_notification_queue_handle != NULL), MB_SLAVE_CHECK((mbs_opts->mbs_notification_queue_handle != NULL),
ESP_ERR_NO_MEM, "mb notify queue creation error."); ESP_ERR_NO_MEM, "mb notify queue creation error.");
// Create Modbus controller task // Create Modbus controller task
status = xTaskCreate((void*)&modbus_slave_task, status = xTaskCreatePinnedToCore((void*)&modbus_slave_task,
"modbus_slave_task", "modbus_slave_task",
MB_CONTROLLER_STACK_SIZE, MB_CONTROLLER_STACK_SIZE,
NULL, NULL,
MB_CONTROLLER_PRIORITY, MB_CONTROLLER_PRIORITY,
&mbs_opts->mbs_task_handle); &mbs_opts->mbs_task_handle,
MB_PORT_TASK_AFFINITY);
if (status != pdPASS) { if (status != pdPASS) {
vTaskDelete(mbs_opts->mbs_task_handle); vTaskDelete(mbs_opts->mbs_task_handle);
MB_SLAVE_CHECK((status == pdPASS), ESP_ERR_NO_MEM, MB_SLAVE_CHECK((status == pdPASS), ESP_ERR_NO_MEM,