From 3e294f7ede76c0b1e0f949ae3ba30de491a56beb Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 7 Apr 2023 14:28:49 +0800 Subject: [PATCH] i2s: fixed the test case I2S_thread_concurrent_safety_test --- components/driver/i2s/i2s_common.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/driver/i2s/i2s_common.c b/components/driver/i2s/i2s_common.c index e4399b4492..3f5d887ba2 100644 --- a/components/driver/i2s/i2s_common.c +++ b/components/driver/i2s/i2s_common.c @@ -1030,11 +1030,13 @@ esp_err_t i2s_channel_disable(i2s_chan_handle_t handle) ESP_GOTO_ON_FALSE(handle->state > I2S_CHAN_STATE_READY, ESP_ERR_INVALID_STATE, err, TAG, "the channel has not been enabled yet"); /* Update the state to force quit the current reading/writing operation */ handle->state = I2S_CHAN_STATE_READY; + /* Waiting for reading/wrinting operation quit + * It should be acquired before assigning the pointer to NULL, + * otherwise may cause NULL pointer panic while reading/writing threads haven't release the lock */ + xSemaphoreTake(handle->binary, portMAX_DELAY); /* Reset the descriptor pointer */ handle->dma.curr_ptr = NULL; handle->dma.rw_pos = 0; - /* Waiting for reading/wrinting operation quit */ - xSemaphoreTake(handle->binary, portMAX_DELAY); handle->stop(handle); #if CONFIG_PM_ENABLE esp_pm_lock_release(handle->pm_lock);