Skip to content

Commit 2699949

Browse files
committed
add workaround for close instance with blocked handler
1 parent 56e5cfd commit 2699949

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

examples/tcp/mb_tcp_slave/main/tcp_slave.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141
#define MB_REG_HOLDING_START_AREA2_SIZE ((size_t)((HOLD_OFFSET(holding_area2_end) - HOLD_OFFSET(holding_u8_a)) << 1))
4242

4343
#define MB_PAR_INFO_GET_TOUT (10) // Timeout for get parameter info
44-
#define MB_CHAN_DATA_MAX_VAL (6)
45-
#define MB_CHAN_DATA_OFFSET (1.2f)
44+
#define MB_CHAN_DATA_MAX_VAL (60)
45+
#define MB_CHAN_DATA_OFFSET (10.1f)
4646

4747
#define MB_READ_MASK (MB_EVENT_INPUT_REG_RD \
4848
| MB_EVENT_HOLDING_REG_RD \

modbus/mb_objects/mb_master.c

+8-2
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,11 @@ static mb_err_enum_t mbm_register_default_handlers(mb_base_t *inst)
172172
static mb_err_enum_t mbm_unregister_handlers(mb_base_t *inst)
173173
{
174174
mbm_object_t *mbm_obj = MB_GET_OBJ_CTX(inst, mbm_object_t, base);
175-
(void)mb_delete_command_handlers(&mbm_obj->handler_descriptor);
176-
mbm_obj->handler_descriptor.instance = NULL;
175+
CRITICAL_SECTION(mbm_obj->handler_descriptor.lock) {
176+
ESP_LOGD(TAG, "Close %s command handlers.", mbm_obj->base.descr.parent_name);
177+
(void)mb_delete_command_handlers(&mbm_obj->handler_descriptor);
178+
mbm_obj->handler_descriptor.instance = NULL;
179+
}
177180
CRITICAL_SECTION_CLOSE(mbm_obj->handler_descriptor.lock);
178181
return MB_ENOERR;
179182
}
@@ -427,6 +430,9 @@ mb_err_enum_t mbm_disable(mb_base_t *inst)
427430
{
428431
mb_err_enum_t status = MB_ENOERR;
429432
mbm_object_t *mbm_obj = MB_GET_OBJ_CTX(inst, mbm_object_t, base);
433+
CRITICAL_SECTION(mbm_obj->handler_descriptor.lock) {
434+
ESP_LOGW(TAG, "The function handler for %s object is unlocked.", inst->descr.parent_name);
435+
}
430436
CRITICAL_SECTION(inst->lock)
431437
{
432438
if (mbm_obj->cur_state == STATE_ENABLED) {

modbus/mb_objects/mb_slave.c

+9-3
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,11 @@ static mb_err_enum_t mbs_register_default_handlers(mb_base_t *inst)
159159
static mb_err_enum_t mbs_unregister_handlers(mb_base_t *inst)
160160
{
161161
mbs_object_t *mbs_obj = MB_GET_OBJ_CTX(inst, mbs_object_t, base);
162-
(void)mb_delete_command_handlers(&mbs_obj->handler_descriptor);
163-
mbs_obj->handler_descriptor.instance = NULL;
162+
CRITICAL_SECTION(mbs_obj->handler_descriptor.lock) {
163+
ESP_LOGD(TAG, "Close %s command handlers.", mbs_obj->base.descr.parent_name);
164+
(void)mb_delete_command_handlers(&mbs_obj->handler_descriptor);
165+
mbs_obj->handler_descriptor.instance = NULL;
166+
}
164167
CRITICAL_SECTION_CLOSE(mbs_obj->handler_descriptor.lock);
165168
return MB_ENOERR;
166169
}
@@ -397,7 +400,10 @@ mb_err_enum_t mbs_enable(mb_base_t *inst)
397400
mb_err_enum_t mbs_disable(mb_base_t *inst)
398401
{
399402
mb_err_enum_t status = MB_ENOERR;
400-
mbs_object_t *mbs_obj = MB_GET_OBJ_CTX(inst, mbs_object_t, base);;
403+
mbs_object_t *mbs_obj = MB_GET_OBJ_CTX(inst, mbs_object_t, base);
404+
CRITICAL_SECTION(mbs_obj->handler_descriptor.lock) {
405+
ESP_LOGW(TAG, "The function handler for %s object is unlocked.", inst->descr.parent_name);
406+
}
401407
CRITICAL_SECTION(inst->lock) {
402408
if (mbs_obj->cur_state == STATE_ENABLED) {
403409
MB_OBJ(mbs_obj->base.transp_obj)->frm_stop(mbs_obj->base.transp_obj);

0 commit comments

Comments
 (0)