|
|
  |
FreeRTOS общие вопросы |
|
|
|
Nov 17 2009, 12:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Terminator @ Nov 17 2009, 14:31)  Т.е. получается, что в худшем случае высокоприоритетная задача будет ждать 1 тик? Точнее время IDLE, которое все-же меньше тика и только в том случае, если прерывание попадет на IDLE. Можно сделать аккуратно обход проблемы, можно и абсолютно бездумно железно-тупо не разбирая очереди влепить заплатку от этого, например, взводить глобальный флаг запроса вызова yield() в IDLE, если было послано сообщение из обработчика прерывания вызванного из IDLE. Для малозагруженных систем, которые в основном в IDLE и пребывают некий эффект даст.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 19 2009, 13:20
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Nov 19 2009, 15:34)  Подскажите пожалуйста ответ на два вопроса. 1. Как "кошерно" заблокировать переключение нужного (или текущего) треда во FreeRTOS-овском прерывании от таймера. То есть, работая в этом треде чтобы не произошло (неожиданного) переключения на другой тред. vTaskSuspendScheduler()/xTaskResumeScheduler() это максимально кошерно с фиксацией пропусков тиков, наверстыванием упущенного.... Ну а если чуть-чуть, то запретить прерывания. Цитата 2. Какую функцию системы надо вызвать, чтобы при очередном YIELD() (или после portRESTORE_CONTEXT() на выходе из прерывания) стал активным какой-то заданный тред. YIELD и RESTORE_CONTEXT это вещи вообще-то несколько разные, хотя первая и включает в себя вторую. Добавить его в соответствующую очередь (не забыть убрать, если уже в какой-то есть). Либо аккуратно 'ручками', либо тупо изменив/задрав ему приоритет через vTaskPrioritySet(). Только, полагаю, Вы опять зря такие манипуляции делать собираетесь  . Обычно достаточно иметь заранее созданные спящие задачи с нужным, путь максимальным приоритетом и просто xTaskResumeFromISR()
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 19 2009, 13:53
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Nov 19 2009, 19:20)  Ну а если чуть-чуть, то запретить прерывания. Эта идея у меня была первой, но она сбиват счётчик тиков таймера и влияет на delay() для других тредов. Цитата(zltigo @ Nov 19 2009, 19:20)  Только, полагаю, Вы опять зря такие манипуляции делать собираетесь  . Обычно достаточно иметь заранее созданные спящие задачи с нужным, путь максимальным приоритетом и просто xTaskResumeFromISR() Я так и собирался делать спящий тред, а потом, в нужный мОмент его активизировать. Я правильно понимаю, что если у треда максимальный приоритет, то прерывание от таймера FreeRTOS не меняет тред на следующий? Тред сменится только если сам тред вызовет YIELD() ?
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Nov 19 2009, 14:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Nov 19 2009, 16:53)  Я правильно понимаю, что если у треда максимальный приоритет, то прерывание от таймера FreeRTOS не меняет тред на следующий? Тред сменится только если сам тред вызовет YIELD() ? Нет, если он добровольно отправится спать или ждать сообщения. Вызов yield() ничего не изменит - если задача с максимальным приоритетом одна, то она и продолжится. Если задач с одинаковым приоритетом несколько, то переключится на другую с таким-же.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 19 2009, 19:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Nov 19 2009, 21:57)  6000 кажется. Очень странное число. Высокие скорости тактирования, если подумать, реально нужны крайне редко, ибо устраивать что-то типа поллингa, вместо обработки событий, не кошерно. И размазывать время тонкими ломтиками между, например, задачами одного приоритета, тоже весьма не частный случай.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 20 2009, 08:41
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Nov 20 2009, 01:08)  ...ибо устраивать что-то типа поллингa, вместо обработки событий, не кошерно. А как насчёт поллинга состояния внешнего пина, который не в состоянии вызывать прерывание? Тред например смотрит, пин не в нужном состоянии. Тред делает YIELD(). Прерывания не ожидается, другие треды этот пин вообще не анализируют. Пока не пройдёт несколько тиков и управление не вернётся к первыому треду, он так и не узнает, что пин изменился. Реакция затормозится (можно даже пропустить активность пина). Понятно, что такие важные нюансы работы системы нужно изначально притягивать к прерываниям, но если эта фича всплыла уже после изготовления девайса, то что? Другой вариант решения есть, кроме быстрых тиков? Сам "родил". Сделать частое прерывание от таймера, для выполнение короткого кода анализа пина. А треды пусть обычно (медленно) переключаются. Из IRQ в нужный мОмент активизируется нужный тред и всё. Хотя, если взвесить оверхед, то не пойму что лучше. Разве что реакция ускорится.
Сообщение отредактировал GetSmart - Nov 20 2009, 08:49
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Nov 20 2009, 10:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Nov 20 2009, 11:41)  Сам "родил".... Вполне естественно. Цитата Хотя, если взвесить оверхед, то не пойму что лучше. Слова-то какие. Дергать всю систему под опрос "забытого" пина не оверхед, а несколько команд в обработчике таймерного прерывания .... что за "весы" у Вас? У меня довольно часто используется сканирование в обработчике системного прерывания для фиксации факта неких внешних событий, хотя без проблем можно использовать отдельное прерывание (переферия у меня обычно в FPGA и все, включая дополнительный контроллер прерываний, свое). Но дело в том, что если частота таких внешних событий приближается к частоте системного тика, что происходит под нагрузкой, то потери на отдельный обработчик много больше, нежели на проверку бита в чужом регулярном обработчике. А уменьшение оверхеда в ненагруженной системе меня волнует мало  . "Типичный" обработчик системного прерывания со сканированием пина: Код void PreemptiveTick_Ext( void ) { #if( USE_KVV_IO ) if( IO0PIN & P0B_SRQ_KVV ) { xTaskResumeFromISR( handle_KVV_task ); } #endif // Increment the tick counter. vTaskIncrementTick();
// The new tick value might unblock a task. Ensure the highest task that // is ready to execute is the task that will execute when the tick ISR // exits. vTaskSwitchContext(); // Ready for the next interrupt. EXTINT = EXTINT_EINT1; // Clear the EXT interrupt flag VICVectAddr = 0; // Dummy write to signal end of interrupt} }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 20 2009, 15:58
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Nov 20 2009, 17:01)  правильно ли я понял, что этот обработчик работает для FreeRTOSовских тиков, а оригинальный не используется? Да, это обработчик тиков который висит вообще не на таймере, а на внешнем прерывании - в данном случае это связное оборудование для которого имеет место быть понятие "сверцикловая синронизация" и удобно иметь 2ms синхронизированное прерывание сверхцикла. Но принципиального значения это не имеет - просто скопипастил из проекта в котором сидел. Обертки находятся снаружи, бо они на ASM. Код #if configUSE_PREEMPTION_EXT == 1 vPortPreemptiveTickEntry_Ext: portSAVE_CONTEXT ; Save the context of the current task... ldr r0, =PreemptiveTick_Ext; before selecting the next task to execute. mov lr, pc bx r0 portRESTORE_CONTEXT ; Restore the context of the selected task. #endif Кстати, именно xTaskResumeFromISR() в отличии от vTaskResume() совершенно не требует сохранения/восстановления контекста  , ибо yield() из него НЕ вызывается, а возвращается только признак перепланировки по которому можно вызвать переключение контекста( и тогда обертки нужны ), а можно и не вызывать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 1 2010, 14:59
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 18-02-10
Пользователь №: 55 549

|
А никто не видел порт для blackfin?
Сообщение отредактировал DSP-Starter - Mar 1 2010, 15:00
|
|
|
|
|
Jun 1 2010, 14:35
|
Частый гость
 
Группа: Свой
Сообщений: 184
Регистрация: 6-12-06
Пользователь №: 23 196

|
объясните непонятливому: как можно корректно отлаживать проект под freertos? среда IAR... скорее всего я что то недопонимаю в настройках проекта или еще где то.... когда берет управление сама ось, начинаются тормоза, переключение задач происходит за какие миллисекунды  без отладчика переключение происходит значительно быстрее (не оценивал).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|