реклама на сайте
подробности

 
 
> FreeRTOS 10, теперь под лицензией MIT
arhiv6
сообщение Nov 30 2017, 05:37
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Вот такая новость появилась: FreeRTOS перешёл под крыло Amazon и выпущен под лицензией MIT
Раньше была GPLv2 с модификациями, теперь MIT. Кто-нибудь, кто разбирается в лицензия, может пояснить какие это плюсы или минусы даёт? Вроде и раньше можно было исходники не открывать даже при модификации. Из плюсов пока только вижу - в предыдущей версии лицензии был пункт, что нельзя сравнивать производительность ОС по сравнению с другими, теперь, похоже, этот пункт убрали.


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SMaster
сообщение Jan 24 2018, 08:59
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 9-03-06
Пользователь №: 15 099



Протестировал стрим буфер. Компилятор Keil, максимальная оптимизация по скорости, контроллер STM32F103C8T6. Измерил количество тиков на типовые операции и использование стека в байтах. Получились интересные результаты:

Create / Send / Receive (тики между переходом управления планировщику и получением байта принимающей задачей) / Stack

Стрим буфер = 200 / 572 / 548 / 136

Старая добрая очередь = 290 / 311 / 319 / 176

То есть выигрыш только в стеке? Я надеялся, что и скорость выше будет. crying.gif Получается, что есть смысл использовать буферы только если прижимает по стеку, либо ради фишек буферов - 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
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016