Easyelectronics.ru • Просмотр темы - FreeRtos и его таски

Easyelectronics.ru

Электроника для всех
Текущее время: 16 авг 2018, 10:50

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 14:30 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 202
Есть два таска - главный и логер с одинаковым приоритетом.В логере я записываю во флеш память большой кусок данных 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 дозаписать текущий байт или выйдет посередине?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 14:57 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
ну так приоритет же одинаковый, с чего ему передавать то управление?

тут или разносить приоритеты, понижая задачу логгирования до уровня фонового процесса.
или как вариант, делать переключение контекста принудительно в цикле.

и, как мне кажется, не самое лучше решение иметь потенциально бесконечный цикл в задаче. что будет, если spi по какой-нибудь причине встанет?

что касается, даст или нет, зависит от реализации. если аппартаная запись через dma, то планировщик никак не сможет повлиять. если ручками перекладывать, то могут возникнуть нюансы ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 15:02 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2103
Кто такой скедюлер и что он должен дать?? Scheduler (посмотрите произношение в гугл-трансляторе) - планировшик задач?
А как вы определяете, что задача висит?
Если другая задача у вас написана так, что она передает управление по taskYELD(), то дойдя до этой строчки, она передаст управление другой задаче, не дожидаясь истечения кванта времени.
Как конкретно у вас написано - мы этого не видим.
Вероятно, ф-ция отправки по SPI предполагает ожидание готовности, и это ожидание совпадает с периодами переключения задач.

Нет, если приоритеты одинаковы, то процессорное время между ними делится поровну, если одна из задач не выполняется в критической секции с блокированием планировщика.
Бесконечные циклы в задаче имеют место быть. И даже более того, задача сама должна представлять собой целиком такой цикл, иначе порушите операционку. Выхода из функции задачи в вытесняющей ОС быть не должно, переключение между функциями выполняет вытесняющий планировщик.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 15:26 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 202
Так как же переделать? Практически? Понизить приоритет таска логера? Что делать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 15:31 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 371
Откуда: дальнее надмосковье
BusMaster писал(а):
Scheduler (посмотрите произношение в гугл-трансляторе)


<оффтоп>
Кстати, по разному - в американском английском произносится как "скеджулер", а английском - "шеджулер". Можете проверить разницу посещая гугл-транслятор с доменом co.uk.
</оффтоп>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 16:39 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
BusMaster писал(а):
... Бесконечные циклы в задаче имеют место быть. ...


я про ситуацию, когда произойдет зависание на цикле типа while(!SPI_BUSY) или while(!SPI_TX_Complete)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 17:16 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
Так а с чего он будет передавать управление, если приоритет то одинаковый? Он же не делит время между ними поровну, а запускает по очереди, точную очередность не помню. Обычно у логгеров низкий приоритет, чтобы кто угодно мог его перебить. Прервать таск логгера он естественно может в любом месте, однако затем, как только вернет управление, пойдёт с того места где прервал. Если вы считаете, что там есть какая-то критическая секция, которую ну никак нельзя прерывать (к примеру разблокировка флеш, там две инструкции должны идти четко друг за другом), то для этого есть спец макросы фриртоса, которые запрещают работа планировщика, и как следствие задачу никто не прервёт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 17:29 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 202
Hold писал(а):
Так а с чего он будет передавать управление, если приоритет то одинаковый? Он же не делит время между ними поровну, а запускает по очереди, точную очередность не помню. Обычно у логгеров низкий приоритет, чтобы кто угодно мог его перебить. Прервать таск логгера он естественно может в любом месте, однако затем, как только вернет управление, пойдёт с того места где прервал. Если вы считаете, что там есть какая-то критическая секция, которую ну никак нельзя прерывать (к примеру разблокировка флеш, там две инструкции должны идти четко друг за другом), то для этого есть спец макросы фриртоса, которые запрещают работа планировщика, и как следствие задачу никто не прервёт.

мне как раз и надо - прервать таск логера чтоб он не стопорил главный таск. я понизил ему приоритет но все равно вижу что главный таск стопориться.
а вернется он в логер на то же место? я не потеряю текущий байт при записи в SPI?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 17:45 
Старожил
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 223
Откуда: Таганрог
как реализована функция записи через SPI? (код покажите)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 17:47 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2664
Не потеряете, нормально всё будет. Периферию то фриртос не прерывает, байт в любом случае отошлется как только вы закинете в какой-нибудь SPI1->DR. Ну и атомарность фриртос никак не нарушит, если данные не более 32 бит. Вот если будет какой-нибудь длинный массив, куда вы будете по байту писать, там прервать может в любой момент записи.
Если у вас у главной задачи приоритет больше чем у логгера, то он обязан отбирать у него управление, посмотрите включен ли вытесняющий режим.
Ну и можно для наглядности статьи Курница почитать, там с графиками всё красиво показано


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 17:48 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 371
Откуда: дальнее надмосковье
А как там у ТС настрон FreeRTOS - переключение задач через "pre-emption mode" или "co-operative mode"? Это регулируется через дефайн configUSE_PREEMPTION в FreeRTOSConfig.h.

configUSE_PREEMPTION

Setting configUSE_PREEMPTION to 1 will cause the pre-emptive scheduler to be used.
Setting configUSE_PREEMPTION to 0 will cause the co-operative scheduler to be used.

When the pre-emptive scheduler is used the kernel will execute during each tick interrupt, which can result in a context switch occurring in the tick interrupt.

When the co-operative scheduler is used a context switch will only occur when either:
1. A task explicitly calls taskYIELD().
2. A task explicitly calls an API function that results in it entering the Blocked state.
3. An application defined interrupt explicitly performs a context switch.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRtos и его таски
СообщениеДобавлено: 06 июн 2018, 18:08 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 202
у меня preemptive RTOS scheduler.
а блок данных 4К - 4096 байт и записываю в СПИ побайтно
Код:
do
{
     spi_rw_flash(0x00, &flash_data);
    *buff_in++ = flash_data;    /* read data to buffer */               
     leng--;
}while( leng > 0);


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB