ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
16 августа
1535448 Топик полностью
Nikolay_Po (12.08.2025 19:00, просмотров: 115) ответил petrd на как вариант реализации, можно и на статическом буфере
Это для какой ОС? Попробовал потоковый буфер. 

Кладу:

__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, например, единицу, функция, забирающая данные из буфера, начинает разблокироваться по таймеру и забирает данные.
Выглядит странно. Куда копать пока не знаю.