Realking 0 11 мая, 2022 Опубликовано 11 мая, 2022 · Жалоба Вопрос к знатокам FreeRTOS. Запускаю одну задачу. В ней while с vTaskDelay(x). Измеряю время таймером выполнения функции vTaskDelay и получаю значение больше х на сотни миллисекунд (от 200 до 300). Не могу понять в чем дело. Думаю, что во времени переключения между задачами. Может кто сталкивался с данной проблемой. Заранее благодарен. На всякий случай процессор Cortex A9 (Cyclone V Soc). Не спрашивайте, почему не юзаю линуху. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 11 мая, 2022 Опубликовано 11 мая, 2022 · Жалоба 10 minutes ago, Realking said: Думаю, что во времени переключения между задачами. Нет, задача-то одна по условиям. Нужно уточнить, чему равен x и какова частота системного таймера. Измерения на первых порах лучше доверить осциллографу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 11 мая, 2022 Опубликовано 11 мая, 2022 · Жалоба 5 minutes ago, aaarrr said: Нет, задача-то одна по условиям. Нужно уточнить, чему равен x и какова частота системного таймера. Измерения на первых порах лучше доверить осциллографу. в том то и дело, что x без разницы какой (100 или 1000). Частота таймера 1000 Гц (измерена была так же с помощью отдельного таймера). На STM32 таким же методом мерял, там все гуд, сколько задал столько и получил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 11 мая, 2022 Опубликовано 11 мая, 2022 · Жалоба 12 minutes ago, aaarrr said: Нет, задача-то одна по условиям. IDLE ещё есть. В итоге, две задачи) 27 minutes ago, Realking said: Измеряю время таймером выполнения функции vTaskDelay и получаю значение больше х на сотни миллисекунд (от 200 до 300). А SysTick или что-там используется в качестве системного таймера ОС на какой период настроен? Может быть на слишком большой, и это просто погрешность счёта? Помахать ножкой из этого таймера с подключенным оциллографом? Можно будет увидеть чуть больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 11 мая, 2022 Опубликовано 11 мая, 2022 · Жалоба 11 minutes ago, haker_fox said: IDLE ещё есть. В итоге, две задачи) А SysTick или что-там используется в качестве системного таймера ОС на какой период настроен? Может быть на слишком большой, и это просто погрешность счёта? Помахать ножкой из этого таймера с подключенным оциллографом? Можно будет увидеть чуть больше. если бы была погрешность то было бы во сколько то раз больше, а тут на сколько-то Повторюсь, системный таймер настроен правильно на 1000 Гц, и проверен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 11 мая, 2022 Опубликовано 11 мая, 2022 · Жалоба Впишите в код планировщика (старт/стоп) ногодрыг. Тоже можно сделать и с кодом для входа-выхода в-из Idle. Могу ошибиться, но надо еще удостоверится в режиме работы планировщика, как переключаются задачи. (настройки-#define) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 11 мая, 2022 Опубликовано 11 мая, 2022 · Жалоба Подергал ножками. Осциллограф показал те же результаты, что и таймер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 11 мая, 2022 Опубликовано 11 мая, 2022 · Жалоба 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 итд Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 13 мая, 2022 Опубликовано 13 мая, 2022 · Жалоба Сигналы с таймеров нормальные. Проблема в том, что при переключении задач, почему то примерно на 270 мс (именно мс) запрещаются прерывания, как я понял, но не пойму почему. On 5/11/2022 at 8:11 PM, k155la3 said: подробнее не могу подсказать, было с freertos очень давно. Есть специальная ветка на этом форуме, со "специальными" хорошо знающими товарисчами там. Что за ветка? А это разве не та ветка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 13 мая, 2022 Опубликовано 13 мая, 2022 · Жалоба 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. наверное да, пардон, был не трезв временно потерял ориентацию в пространстве и времени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 14 мая, 2022 Опубликовано 14 мая, 2022 · Жалоба 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 мс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться