kopia lustrzana https://github.com/espressif/esp-idf
esp_ringbuf: Fix assertion xQueueGenericSend queue.c:818
The release of the semaphore indicating the item was successfully sent must be the last semaphore released. The receiver may be in another task and may delete the Ringbuffer (such as with a return code across tasks design pattern) if they are through with the Ringbuffer. The function xRingbufferSendAcquire followed by xRingbufferSendComplete had the semaphores released in the proper order and that same pattern should have been used in xRingbufferSend and xRingbufferSendFromISR. This commit fixes this order. Issue (IDFGH-6030) #7716 describes the problem in more detail. Closes IDFGH-6030, https://github.com/espressif/esp-idf/issues/7716 Closes IDFGH-6036, https://github.com/espressif/esp-idf/pull/7721pull/7830/head
rodzic
8037e2462f
commit
1222f6dd3a
|
@ -1,16 +1,8 @@
|
|||
// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
@ -1041,13 +1033,13 @@ BaseType_t xRingbufferSend(RingbufHandle_t xRingbuffer,
|
|||
*/
|
||||
}
|
||||
|
||||
if (xReturnSemaphore == pdTRUE) {
|
||||
xSemaphoreGive(rbGET_TX_SEM_HANDLE(pxRingbuffer)); //Give back semaphore so other tasks can send
|
||||
}
|
||||
if (xReturn == pdTRUE) {
|
||||
//Indicate item was successfully sent
|
||||
xSemaphoreGive(rbGET_RX_SEM_HANDLE(pxRingbuffer));
|
||||
}
|
||||
if (xReturnSemaphore == pdTRUE) {
|
||||
xSemaphoreGive(rbGET_TX_SEM_HANDLE(pxRingbuffer)); //Give back semaphore so other tasks can send
|
||||
}
|
||||
return xReturn;
|
||||
}
|
||||
|
||||
|
@ -1083,13 +1075,13 @@ BaseType_t xRingbufferSendFromISR(RingbufHandle_t xRingbuffer,
|
|||
}
|
||||
portEXIT_CRITICAL_ISR(&pxRingbuffer->mux);
|
||||
|
||||
if (xReturnSemaphore == pdTRUE) {
|
||||
xSemaphoreGiveFromISR(rbGET_TX_SEM_HANDLE(pxRingbuffer), pxHigherPriorityTaskWoken); //Give back semaphore so other tasks can send
|
||||
}
|
||||
if (xReturn == pdTRUE) {
|
||||
//Indicate item was successfully sent
|
||||
xSemaphoreGiveFromISR(rbGET_RX_SEM_HANDLE(pxRingbuffer), pxHigherPriorityTaskWoken);
|
||||
}
|
||||
if (xReturnSemaphore == pdTRUE) {
|
||||
xSemaphoreGiveFromISR(rbGET_TX_SEM_HANDLE(pxRingbuffer), pxHigherPriorityTaskWoken); //Give back semaphore so other tasks can send
|
||||
}
|
||||
return xReturn;
|
||||
}
|
||||
|
||||
|
|
|
@ -879,7 +879,6 @@ components/esp_pm/pm_locks.c
|
|||
components/esp_pm/pm_trace.c
|
||||
components/esp_pm/test/test_pm.c
|
||||
components/esp_ringbuf/include/freertos/ringbuf.h
|
||||
components/esp_ringbuf/ringbuf.c
|
||||
components/esp_ringbuf/test/test_ringbuf.c
|
||||
components/esp_rom/esp32/esp_rom_caps.h
|
||||
components/esp_rom/esp32/ld/esp32.rom.api.ld
|
||||
|
|
Ładowanie…
Reference in New Issue