Если вы хотите исключить время, потраченное в других потоках, тогда вы можете отключить переключатели контекста задачи при вводе функции, которую вы хотите измерить. Это зависит от ОСРВ, но одна из них - повысить приоритет текущего потока до максимума. Если этот поток является максимальным приоритетом, другие потоки не смогут работать. Не забудьте снова сбросить приоритет потока в конце функции. Однако это измерение может по-прежнему включать время, затрачиваемое на прерывания.
Другая идея - полностью отключить прерывания. Это может удалить из вашего измерения другие потоки и прерывания. Но с отключенными прерываниями прерывание таймера может работать неправильно. Поэтому вам необходимо настроить аппаратный таймер соответствующим образом и опираться на регистр значений счетчика таймера (а не на любое значение времени, полученное от прерывания таймера), чтобы измерить время. Также убедитесь, что ваша функция не вызывает никаких процедур RTOS, которые позволяют использовать контекстный переключатель. И не забудьте восстановить прерывания в конце вашей функции.
Другая идея - запустить функцию многократно и записать самую короткую продолжительность, измеренную в течение многих раз. Более длительные периоды, вероятно, включают время, затрачиваемое на другие потоки, но самая короткая продолжительность может быть только функцией без других потоков.
Другая идея - установить вывод GPIO при входе и очистить его при выходе из функции. Затем следите за выводом GPIO с помощью осциллографа (или логического анализатора). Используйте осциллограф, чтобы измерить период, когда высокий контакт GPIO. Чтобы удалить время, потраченное в других потоках, вам нужно будет изменить процедуру планировщика RTOS, которая будет выбирать поток для запуска. Очистите вывод GPIO в планировщике, когда выполняется другой поток, и установите его, когда планировщик вернется в поток вашей функции. Вы также можете рассмотреть возможность очистки выводов GPIO в обработчиках прерываний.
Почему это будет время выполнения других потоков? – herohuyongtao
Почему этот помеченный RTOS, но OSX-код предпочтительнее? OSX не является RTOS. – Clifford
Вы правы. OSX не является ОСРВ. Это только мягкая RTOS. Моя вина. Я обновил вопрос. – Speakus