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

STM32F103 время выхода в прерывание

Искал но не нашел темы достаточно объемной и так сказать подходящей, кроме как на радиокоте (хотя объемной ее назвать сложно). Если верить https://www.radiokot.ru/forum/viewtopic.php?p=2444545 то время выхода в прерывание (так сказать накладные расходы) составляет12 тактов. Хочу понять что не так у меня, если я взводя таймер всего на один такт меньше 1 мкс получаю больше 3-х мкс задержки выхода в прерывание (сперва взводил на 4мкс, а получал 7)? Как проверял, взводил бит перед включением таймера и сбрасывал в прерывании, смотрел осциллом. Короче вижу, что достаточно много уходит на накладные расходы, пусть даже замер велся очень примерно. Частота 72МГц, то есть такты явно на порядки отличаются. Написано в Cocox, компилятор GNU, оптимизацию не включал, тк она мешает отладке, но опять же не думаю, что это может так влиять, ну блин порядки целые разница, не разы. Ну естественно гадать на кофейной гуще не предлагаю, просто хочу уточнить если кто-то заморачивался по данному вопросу, у кого какие получались задержки и может кто-то проводил действия по уменьшению этого времени.

Изменено пользователем auric

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


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

Есть миллиард способов превратить эти 12 тактов в 12 + N, где N варьируется в зависимости от контекста, работающей периферии, погоды на Марсе и вообще, способностей изучающего к грамотному измерению этих самых тактов задержки. Неужели это действительно так необходимо?🙂

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


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

Вы поняли что хочет ТС? Я ничегошеньки, потому и хотелось бы код посмотреть, может там намёки есть. Хотя, если код такой же как русский в сообщении, то шансы малы.

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


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

Да он уже сам забыл зачем это ему. После слова Кокос можно не читать дальше

 

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


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

3 часа назад, auric сказал:

такт меньше 1 мкс получаю больше 3-х задержки выхода в прерывание

Скорее, не задержка входа в прерывание, а банальный пропуск нескольких прерываний из-за того, что слишком много кода в самом прерывании. Там, кроме аппаратных тактов, есть еще и программные, добавляемые компилятором. А ведь время исполнения инструкций, да еще на частоте 72 МГц из-за тормознутости флеша, оно будет больше, чем кажется на первый взгляд. Одна инструкция может исполняться несколько машинных тактов.

 

3 часа назад, auric сказал:

оптимизацию не включал

Вот именно! Да еще если и HAL в прерывании, тогда ну чего ж удивляться.

1 час назад, x893 сказал:

После слова Кокос

...я удивлен, что кто-то его откопал из могилы 🙂 Он же помер лет 10 назад или около того. 

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


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

Как я понял, тут у автора такое дело. Он дёргает ногу МК в лог. 1 перед запуском аппаратного таймера, запускает его на короткое время  счета и по срабатывания его прерывания убирает ногу в лог. 0. Осцилом смотрит длительность получившегося импульса и соотносится с тем, что он хотел бы увидеть по расчётам. И тут все бы ничего, но помимо аппаратных тактов входа-выхода прерывания, существуют ещё и программные инструкции, встааляемые компилятором, такие как перемещение указателя стека, а так же непосредственно инструкции дергания ногой МК, коих при выключенной оптимизации немало, особенно если используется какой-нить SPL или HAL. Да ещё накладываются и задержки конвейера флеша при работе на высокой частоте ядра. Ну и расходы инструкций на запуск таймера. Как итог, длительность сформированной импульса получается заметно больше выставленного интервала счета таймера. 

Тут наверно ещё ошибки добавляет и неправильно выставленный интервал в самом таймере. Классика - значение ARR должно быть на 1 меньше расчётного интервала счета.

Вообще, снизьте тактовую частоту МК  до базовых 8 МГц, так и смотрите

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


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

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

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


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

10 minutes ago, Xenia said:

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

SysTick он выключил наверняка. Не совсем же он гуру программирования.

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


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

В 09.01.2024 в 00:16, EdgeAligned сказал:

...я удивлен, что кто-то его откопал из могилы 🙂 Он же помер лет 10 назад или около того. 

.. а в проектах до сих пор живет. Хорошо хоть предыдущий разработчик дистрибутивы на память оставил.

С другой стороны, в кейл перевести нетрудно, синтаксис и там, и там GCC-шный.

Да и что такое 10 лет )

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


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

28 минут назад, x893 сказал:

SysTick он выключил наверняка. Не совсем же он гуру программирования.

SysTick есть на миллисекунду, не думаю что он.

 

2 часа назад, Xenia сказал:

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

может, но смущает порядок разницы, ведь другие процессы медленные по сравнению с этим (уставку специально сделал меньше микросекунды для проверки) и их не настолько много. Попробую когда время будет повторить тест вообще с одним таймером. Здесь же хотел понять, был ли кто-то из участников так сказать так же заинтересован и замерял выход в прерывание? Есть ли какая-то практическая статистика? Или только теория...

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


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

1 minute ago, auric said:

не думаю что он

Думать не надо. Просто выключить.

1 minute ago, auric said:

Есть ли какая-то практическая статистика?

Когда она кому-нибудь понадобится, то при помощи DWT это делается минут за 10

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


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

47 минут назад, MrYuran сказал:

.. а в проектах до сих пор живет. Хорошо хоть предыдущий разработчик дистрибутивы на память оставил.

С другой стороны, в кейл перевести нетрудно, синтаксис и там, и там GCC-шный.

Да и что такое 10 лет )

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

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


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

5 минут назад, auric сказал:

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

Практическая статистика у нас полностью совпадает с данными, приведёнными в мануалах. Чудес не встречал.

А что там у вас за бардак в коде творится - только Ванга сможет угадать.

PS: Это уже не говоря, что измерять такие времена с помощью осциллографа - это зашквар. О чём уже многократно писали. Но вы ведь не читатель, верно? Вы писатель. Мануалов не читаете, советов в форумах - тоже, в дизассемблер не смотрите. Да и сами как видно думать не хотите. :unknw:

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


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

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

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

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

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

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

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

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

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

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