Перейти к содержанию
    

Task Switch Time

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, Realking said:

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, aaarrr said:

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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, aaarrr said:

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

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

27 minutes ago, Realking said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, haker_fox said:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 итд

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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. наверное да, пардон, был не трезв временно потерял ориентацию в пространстве и времени. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 мс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...