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

 
 
> FreeRtos и его таски
Jenya7
сообщение Jun 6 2018, 08:55
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть два таска - главный и логер с одинаковым приоритетом.В логере я записываю во флеш память большой кусок данных 4096 байт по SPI.
Код
do
{
     spi_rw_flash(0x00, &flash_data);
    *buff_in++ = flash_data;    /* read data to buffer */                
     leng--;
}while( leng > 0);
время записи 20 милисекунд. время переключения между тасками 2 милисекунды. по идее за эти 20 милисекунд должно быть 10 переключений между тасками.на деле я вижу что во время записи в логер главный таск застревает.Вопрос почему? И второй вопрос - если пришло время переключения таска - скедюлер даст SPI дозаписать текущий байт или выйдет посередине?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Lagman
сообщение Jun 6 2018, 11:36
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Все зависит от того в каком режиме RTOS работает, preemptive RTOS scheduler, or cooperative RTOS scheduler.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 6 2018, 11:44
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Lagman @ Jun 6 2018, 16:36) *
Все зависит от того в каком режиме RTOS работает, preemptive RTOS scheduler, or cooperative RTOS scheduler.


у меня preemptive RTOS scheduler. может стоит перейти на cooperative?
Go to the top of the page
 
+Quote Post
Lagman
сообщение Jun 6 2018, 12:41
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Цитата(Jenya7 @ Jun 6 2018, 14:44) *
у меня preemptive RTOS scheduler. может стоит перейти на cooperative?

Наоборот, поведение похоже на cooperative.

Как работает в FreeRTOS
Any number of tasks can share the same priority. If configUSE_TIME_SLICING is not defined, or if configUSE_TIME_SLICING is set to 1, then Ready state tasks of equal priority will share the available processing time using a time sliced round robin scheduling scheme.

https://freertos.org/RTOS-task-priority.html

Еще https://freertos.org/a00110.html#configUSE_TIME_SLICING
configUSE_TIME_SLICING
By default (if configUSE_TIME_SLICING is not defined, or if configUSE_TIME_SLICING is defined as 1) FreeRTOS uses prioritised preemptive scheduling with time slicing. That means the RTOS scheduler will always run the highest priority task that is in the Ready state, and will switch between tasks of equal priority on every RTOS tick interrupt. If configUSE_TIME_SLICING is set to 0 then the RTOS scheduler will still run the highest priority task that is in the Ready state, but will not switch between tasks of equal priority just because a tick interrupt has occurred.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 13:00
Рейтинг@Mail.ru


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