mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 18:57:19 +02:00
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:
@ -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.
|
||||||
|
@ -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__); \
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
Reference in New Issue
Block a user