Это для какой ОС? Попробовал потоковый буфер. Кладу:
__attribute__((used)) int _write(int FileHandle, char *Data, int Size) {
(void) FileHandle;
taskENTER_CRITICAL();
Size = xStreamBufferSend( xDebugMsgStream, Data, Size, 0 );
taskEXIT_CRITICAL();
return Size;
}
Вынимаю:
for (;;) {
size_t Size = xStreamBufferReceive( xDebugMsgStream, (void*)Buff, sizeof(Buff), portMAX_DELAY ); //Wait for next message
if (Size > 0) { //Check for sure if some data are available
//Some data need to be transferred
//Blah Blah Blah...
}
}
Есть непонятное. На момент первого входа в xStreamBufferReceive(), на стороне получателя данных, в потоковом буфере пусто. И в структуре потокового буфера, моя функция чтения, ожидающая данных из буфера внутри xStreamBufferReceive(), оказывается прописана в структуре потокового буфера, в поле xTaskWaitingToReceive.
Ну ОК - значит, при появлении данных, по этой метке, будет выбрана эта моя функция, которая сможет обработать порцию данных.
Далее, через время, появляются вызовы функции, кладущей данные в буфер. Тут и проявляется проблема. После завершения вызова xStreamBufferSend(), почему-то затирается значение xTaskWaitingToReceive. А моя задача, вычитывающая данные из буфера, не вызывается.
Несколькими запросами на передачу данных, буфер заполняется до конца, но разблокировки чтения не происходит.
Если же в таймаут поставить значение отличное от portMAX_DELAY, например, единицу, функция, забирающая данные из буфера, начинает разблокироваться по таймеру и забирает данные.
Выглядит странно. Куда копать пока не знаю.