Jump to content

    

Task Switch Time

Recommended Posts

Realking

Вопрос к знатокам FreeRTOS.

Запускаю одну задачу. В ней while с vTaskDelay(x).

Измеряю время таймером выполнения функции vTaskDelay и  получаю значение больше х на сотни миллисекунд (от 200 до 300).

Не могу понять в чем дело. Думаю, что во времени переключения между задачами.

Может кто сталкивался с данной проблемой.

Заранее благодарен.

На всякий случай процессор Cortex A9 (Cyclone V Soc). Не спрашивайте, почему не юзаю линуху.

Share this post


Link to post
Share on other sites

aaarrr
10 minutes ago, Realking said:

Думаю, что во времени переключения между задачами.

Нет, задача-то одна по условиям.

 

Нужно уточнить, чему равен x и какова частота системного таймера. Измерения на первых порах лучше доверить осциллографу.

Share this post


Link to post
Share on other sites

Realking
5 minutes ago, aaarrr said:

Нет, задача-то одна по условиям.

 

Нужно уточнить, чему равен x и какова частота системного таймера. Измерения на первых порах лучше доверить осциллографу.

в том то и дело, что x без разницы какой (100 или 1000). Частота таймера 1000 Гц (измерена была так же с помощью отдельного таймера).

 

На STM32 таким же методом мерял, там все гуд, сколько задал столько и получил.

Share this post


Link to post
Share on other sites

haker_fox
12 minutes ago, aaarrr said:

Нет, задача-то одна по условиям.

IDLE ещё есть. В итоге, две задачи)

27 minutes ago, Realking said:

Измеряю время таймером выполнения функции vTaskDelay и  получаю значение больше х на сотни миллисекунд (от 200 до 300).

А SysTick или что-там используется в качестве системного таймера ОС на какой период настроен? Может быть на слишком большой, и это просто погрешность счёта? Помахать ножкой из этого таймера с подключенным оциллографом? Можно будет увидеть чуть больше.

Share this post


Link to post
Share on other sites

Realking
11 minutes ago, haker_fox said:

IDLE ещё есть. В итоге, две задачи)

А SysTick или что-там используется в качестве системного таймера ОС на какой период настроен? Может быть на слишком большой, и это просто погрешность счёта? Помахать ножкой из этого таймера с подключенным оциллографом? Можно будет увидеть чуть больше.

если бы была погрешность то было бы во сколько то раз больше, а тут на сколько-то

Повторюсь, системный таймер настроен правильно на 1000 Гц, и проверен.

Share this post


Link to post
Share on other sites

k155la3

Впишите в код планировщика (старт/стоп) ногодрыг. Тоже можно сделать и с кодом для входа-выхода в-из Idle.

Могу ошибиться, но надо еще удостоверится в режиме работы планировщика, как переключаются задачи. (настройки-#define)

 

Share this post


Link to post
Share on other sites

k155la3
2 hours ago, Realking said:

Подергал ножками. Осциллограф показал те же результаты, что и таймер. 

Подергать мало. Надо выдать 2 канала, а именно "тестовый" сигнал Вашего таймера (ставите XOR на ногодрыг в коде, который дает интервал).

На второй канал выдаете "отработку" планировщика. 

Кроме того, нужна настройка режима работы ОС в файле freertos.h

возможно следует определить или сами макро-переменные, или их значения.

/* The timers module relies on xTaskGetSchedulerState(). */
#if configUSE_TIMERS == 1

	#ifndef configTIMER_TASK_PRIORITY
		#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined.
	#endif /* configTIMER_TASK_PRIORITY */

	#ifndef configTIMER_QUEUE_LENGTH
		#error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined.
	#endif /* configTIMER_QUEUE_LENGTH */

	#ifndef configTIMER_TASK_STACK_DEPTH
		#error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined.
	#endif /* configTIMER_TASK_STACK_DEPTH */

#endif /* configUSE_TIMERS */

и т.д., подробнее не могу подсказать, было с freertos очень давно. Есть специальная ветка на этом форуме, со  "специальными" хорошо знающими товарисчами там.

 

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

+ привязки частот, настроек системных таймеров (то что делается при портировании на другую платформму)

 portTICK_PERIOD_MS итд

 

Share this post


Link to post
Share on other sites

Realking

Сигналы с таймеров нормальные.

Проблема в том, что при переключении задач, почему то примерно на 270 мс (именно мс) запрещаются прерывания, как я понял, но не пойму почему.

On 5/11/2022 at 8:11 PM, k155la3 said:

подробнее не могу подсказать, было с freertos очень давно. Есть специальная ветка на этом форуме, со  "специальными" хорошо знающими товарисчами там.

Что за ветка? А это разве не та ветка?

Share this post


Link to post
Share on other sites

k155la3
2 hours ago, Realking said:

1. Сигналы с таймеров нормальные. Проблема в том, что при переключении задач, почему то примерно на 270 мс (именно мс) запрещаются прерывания, как я понял, но не пойму почему.

2. Что за ветка? А это разве не та ветка?

1. Что показал анализ осциллограм, по методикам которые предлагались выше мною и не-мною ?

Вот цитата из Re отсюда FreeRTOS  (время переключения) v №2 http://we.easyelectronics.ru

Quote

Несколько подправлю по поводу 15мкс в 2-х задачах с делеем.
Вызов vTaskDelay(1) приводит к «усыплению задачи на 1мс». По специфике функций задержек/сна — вам гарантируется, что время ваш поток будет приостановлен в выполнении как минимум на заданное время, максимум же зависит от многих других параметров (загрузка системы, более приоритетные задачи и т.д.). В итоге получается некоторый промежуток времени, когда обе задачи спят — нет ни одной активной. Вероятно в это время прочессор отправляется в сон, либо же происходит переключение на «пустую» задачу (idle task). Вот вам и 2 переключения: добровольная отдача управления 5мкс + idleloop/wfi N мкс + вытеснение высокоприоритетной задачей 8 мкс = 15мкс.
Таким образом при использовании vTaskDelay(1) в идеале у вас должно быть время между фронтами одной задачи 1мс. И для меня более удивительно, что это не так (-1.5мкс мелочь конечно, может немного сократили время сна в расчете на накладные расходы, которые оказались меньше, или кто их знает). Между фронтами 2-х задач время переключения не обязано быть временем одного переключения. Возможно имеет смысл в одной из задач добавить перед циклом задержку в ~100мкс для большей наглядности (а кстати, не в начальной ли инициализации то смещение 15мкс и возникло?).

с которой я полностью согласен (выделено). Там-же приведены скрины осциллограм с мониторингом.

Если Вам нужно задание точных интервалов, то использовать эту ф-ю не самый феншуй. Используйте таймеры TimerCreate - оно для этого и сделано.

1.1. FreeRTOS дается в исходнике. Любое использование требует подстройки под Вашу задачу, и уж тем более - если это "портирование" на другой процессор требует серьезного "курения" исходников и файлов настройки, в частности freertos.h 

В смысле что "оно само должно" не срабатывает даже близко. Одних методов работы с дин.памятью можно выбрать heap_1.c  
. . . heap_4.c, может шас еще чего добавили. Таким образом, ОС должна быть "настроена" под Вашу задачу или Вами или "кем-то".

1.2. В исходниках перед функциями есть большие "шапки" с инфо,  где расписано что-длячего.

1.3. Если хотите поискать куда делись прерывания - мониторьте вышеуказанным методом (осциллограф) ф-ю void vPortEnterCritical() и vPortExitCritical(), может оно, не уверен.

2. наверное да, пардон, был не трезв временно потерял ориентацию в пространстве и времени. 

Share this post


Link to post
Share on other sites

Realking
On 5/13/2022 at 7:03 PM, k155la3 said:

1. Что показал анализ осциллограм, по методикам которые предлагались выше мною и не-мною ?

Вот цитата из Re отсюда FreeRTOS  (время переключения) v №2 http://we.easyelectronics.ru

с которой я полностью согласен (выделено). Там-же приведены скрины осциллограм с мониторингом.

Если Вам нужно задание точных интервалов, то использовать эту ф-ю не самый феншуй. Используйте таймеры TimerCreate - оно для этого и сделано.

1.1. FreeRTOS дается в исходнике. Любое использование требует подстройки под Вашу задачу, и уж тем более - если это "портирование" на другой процессор требует серьезного "курения" исходников и файлов настройки, в частности freertos.h 

В смысле что "оно само должно" не срабатывает даже близко. Одних методов работы с дин.памятью можно выбрать heap_1.c  
. . . heap_4.c, может шас еще чего добавили. Таким образом, ОС должна быть "настроена" под Вашу задачу или Вами или "кем-то".

1.2. В исходниках перед функциями есть большие "шапки" с инфо,  где расписано что-длячего.

1.3. Если хотите поискать куда делись прерывания - мониторьте вышеуказанным методом (осциллограф) ф-ю void vPortEnterCritical() и vPortExitCritical(), может оно, не уверен.

2. наверное да, пардон, был не трезв временно потерял ориентацию в пространстве и времени. 

 

Проблема не только в том, что vTaskDelay задерживает больше на 270 мс, а еще и в том, что реакция на семафор тоже задерживается на те же 270 мс.

 

И почему я думаю, что где-то запрещаются прерывания:

тем же осциллом проверил частоту вызова FreeRTOS_Tick_Handler.

без запущенных задач все норм - 1 кГц, с запущенной задачей с vTaskDelay - импульсы прерываются на 270 мс.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.