Как рассчитать время выполнения задачи RTOS - PullRequest
4 голосов
/ 03 июня 2010

Я написал код на c для Arm7, используя RTOS. Есть несколько задач, приоритет которых установлен на один и тот же уровень. Таким образом, задачи выполняются на круговой основе.

Исключением является то, что одна задача (по умолчанию) имеет более низкий приоритет, чем другая задача в rtos. Так что, если не выполняется ни одна задача, запускается задача по умолчанию или с более низким приоритетом.

Теперь я хочу вычислить точное общее время (длительность) для выполнения заданий по умолчанию.

Может ли кто-нибудь дать представление о том, что делать .... и как делать в коде ..

С уважением Dani

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

Очень простой способ увидеть, когда выполняется задание по умолчанию или режим ожидания, состоит в том, чтобы заставить эту задачу переключать неиспользуемый (но доступный) вывод GPIO или индикатор, если на вашем оборудовании есть такая вещь. Затем, если вы подключите осциллограф к линии ввода / вывода, вы сможете увидеть, как долго процессор остается в режиме ожидания по продолжительности периода колебаний, видимого в области видимости. Линия будет оставаться в устойчивом состоянии всякий раз, когда выполняются другие задачи.

Альтернативный метод, если вы можете добраться до кода ОС, - это сделать строку высокой, когда выбрана задача по умолчанию, и низкой для любой другой задачи.

3 голосов
/ 03 июня 2010

Было бы полезно, если бы вы дали нам больше информации о вашей платформе (CPU, RTOS), но общая идея такова:

Большинство ОСРВ имеют некоторый тип выноски или перехвата «переключателя задач». Большинство встроенных платформ имеют легко доступные периферийные устройства (аппаратные таймеры).

Итак: каждый раз, когда вы переходите в задачу с низким приоритетом и выходите из нее, сделайте снимок таймера и рассчитайте временной интервал.

Применяются всевозможные предостережения, такие как учет опрокидывания таймера (включая множественные опрокидывания, если период таймера очень короткий), режимы с низким энергопотреблением / режим сна (если вы их используете), время, проведенное в ISR и т. Д.

1 голос
/ 29 августа 2010

Я согласен с ответом Дэна - вот некоторые дополнения / улучшения:

(1) Вычисления на основе окон. , поскольку, по умолчанию, по-видимому, не имеет периодичности, вам нужно будет рассчитать его время выполнения с точки зрения процента, потраченного на эту задачу за какое-то окно (скажем, 1000 мс). Вам нужно будет определить статическую переменную, используемую для накопления щелчков по таймеру. По истечении срока действия вашего окна (т. Е. Пройдено 1000 мс) вы можете рассчитать время, проведенное по умолчанию, по сравнению с 1000 мс, что будет процентом, потраченным по умолчанию. Когда я читаю ваше описание, кажется, что состояние «По умолчанию» в основном является состоянием бездействия, что означает, что этот процент примерно равен вашему доступному микроиспользованию.

(2) один ролловер в час. . Если вы можете использовать 32-битный счетчик и захватывать метки времени usec, вы можете сделать это чуть более чем за 1 час до того, как произойдет любое опрокидывание. Если вы используете это для домашнего проекта, у вас есть возможность игнорировать ролловеры. Это будет способствовать единственному искаженному окну в 1000 мсек, и все. Если, с другой стороны, вы собираетесь контролировать максимальную загрузку и установить неисправность или диагностику из-за этого ... тогда вы хотите рассмотреть это.

(3) Перекос ISR. Определение того, нужно ли вам обрабатывать время, потраченное на ISR, иначе, чем время, потраченное на другую задачу, зависит от того, как ваша ОСРВ обрабатывает переключение контекста. Как упоминает Дэн, большинство ОСРВ имеют своего рода обратный вызов или ловушку, которые срабатывают при переключении задач. Некоторые RTOS имеют отдельный хук только для ISR. Я не совсем уверен, что мотивация для этого, кроме общей теории, что пользователи с меньшей вероятностью будут заботиться о времени, проведенном (надеюсь) с короткими ISR, чем о самих пользовательских задачах. В любом случае, посмотрите, как ваша ОСРВ справляется с этим переключением, и переходите оттуда.

Если вы не справитесь с этим правильно, время, проведенное в ISR, будет относиться к любой задаче, выполнявшейся в момент запуска ISR. Если вы оказались в режиме «По умолчанию», то ваша задача по умолчанию была «поглощать» время ISR. Если у вас не работает много ISR, я бы полностью проигнорировал это.

Удачи! Я сделал это с семейством PowerPC 551X, и это было для серийного автомобильного ПО, поэтому оно должно было быть идеальным! Вам должно быть намного проще :)

...