Протестировал стрим буфер. Компилятор Keil, максимальная оптимизация по скорости, контроллер STM32F103C8T6. Измерил количество тиков на типовые операции и использование стека в байтах. Получились интересные результаты:
Create / Send / Receive (тики между переходом управления планировщику и получением байта принимающей задачей) / Stack
Стрим буфер = 200 / 572 / 548 / 136
Старая добрая очередь = 290 / 311 / 319 / 176
То есть выигрыш только в стеке? Я надеялся, что и скорость выше будет.
Получается, что есть смысл использовать буферы только если прижимает по стеку, либо ради фишек буферов - Trigger Level для стрим буфера и возможность отправки данных разной длины для буфера сообщений.
Код тестовой программы:
Код
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "stream_buffer.h"
#include "task.h"
#include "queue.h"
StreamBufferHandle_t buf_tmp;
QueueHandle_t que_tmp;
uint8_t i, j, k;
void task_tmp1(void * param) {
while (1) {
i++;
xStreamBufferSend(buf_tmp, &i, sizeof(uint8_t), portMAX_DELAY);
vTaskDelay(100);
i++;
xQueueSend(que_tmp, &i, portMAX_DELAY);
vTaskDelay(100);
}
}
void task_tmp2(void * param) {
while (1) {
xStreamBufferReceive(buf_tmp, &j, sizeof(uint8_t), portMAX_DELAY);
__NOP();
}
}
void task_tmp3(void * param) {
while (1) {
xQueueReceive(que_tmp, &k, portMAX_DELAY);
__NOP();
}
}
int main() {
xTaskCreate(task_tmp1, "tmp1", 128, NULL, 4, NULL);
xTaskCreate(task_tmp2, "tmp2", 128, NULL, 3, NULL);
xTaskCreate(task_tmp3, "tmp3", 128, NULL, 2, NULL);
buf_tmp = xStreamBufferCreate(100 * sizeof(uint8_t), sizeof(uint8_t));
que_tmp = xQueueCreate(100, sizeof(uint8_t));
vTaskStartScheduler();
}
Сообщение отредактировал SMaster - Jan 24 2018, 09:12