реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Время выполнения кода
Connor
сообщение Feb 28 2018, 08:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-05-17
Пользователь №: 97 309



У меня есть АЦП, которые начинает работать одновременно по таймеру и я хочу замерить время конвертации всех выбранных каналов с помощью таймера dwt (поднимается флаг, к примеру, TC и я меряю полученный DWT->CYCCNT) но вот какое дело, если я засовываю проверку флага в бесконечный цикл (__HAL_ADC_GET_FLAG) то получается одно значение CYCCNT, а если засовываю DWT->CYCCNT в прерывание по TC то получается совсем другое значение счётчика, гораздо большее, у меня вопрос, можно ли в принципе в отладчике засовывать счётчик dwt в обработчик прерывания? Если да, то почему получаются на столько разные значения, на порядки. Спасибо
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 28 2018, 08:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Connor @ Feb 28 2018, 11:16) *
Если да, то почему получаются на столько разные значения, на порядки.

Какие порядки? Этот счётчик считает такты. Их можно пересчитать в наносекунды. Приведите уже конкретные цифры. Кто знает, может быть, разница объясняется задержкой на входе в обработчик прерывания? Как знать, может быть оно у вас сделано очень-очень медленно?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 28 2018, 08:42
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Connor @ Feb 28 2018, 10:16) *
можно ли в принципе в отладчике засовывать счётчик dwt в обработчик прерывания? Если да, то почему получаются на столько разные значения, на порядки. Спасибо

Лучше вообще ничего не куда не засовывать не зная куда суёшь. biggrin.gif
И что значит "в отладчике засовывать"? Вы DWT->CYCCNT где читаете - в своём коде или в окне "Watch" отладчика?
И да - как уже сказали - конкретные цифры в студию. А то 1 и 10 - тоже имеют разный порядок....
Go to the top of the page
 
+Quote Post
Connor
сообщение Feb 28 2018, 09:11
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-05-17
Пользователь №: 97 309



Цитата(scifi @ Feb 28 2018, 03:34) *
Какие порядки? Этот счётчик считает такты. Их можно пересчитать в наносекунды. Приведите уже конкретные цифры. Кто знает, может быть, разница объясняется задержкой на входе в обработчик прерывания? Как знать, может быть оно у вас сделано очень-очень медленно?


конкретные цифры в цикле while CCYNCT = 530, в десятичной, в обработчике CCYNCT = 27157, вот на такие порядки и отличается))в десятки раз

Цитата(jcxz @ Feb 28 2018, 03:42) *
Лучше вообще ничего не куда не засовывать не зная куда суёшь. biggrin.gif
И что значит "в отладчике засовывать"? Вы DWT->CYCCNT где читаете - в своём коде или в окне "Watch" отладчика?
И да - как уже сказали - конкретные цифры в студию. А то 1 и 10 - тоже имеют разный порядок....


считаю в коде и засовывал в watch отладчика)

ацп у меня обрабатывает максимально 8 каналов, включаются они одновременно в режиме multimode, ацп тактируется 72МГц, такая же частота и у SYSCLK, поэтому вариант в CCYNCT=530 тактов лично мне видится более логичным, при 12 разрядном разрешении + 19 тактов ацп клока, выбранных в качестве времени сэмлирования, получаем кол-во тактов необходимое для конвертации всех каналов в ацп (12+19)*8 = 248, конечно чисто теоретически, но это ближе к 530 чем к 27157

Сообщение отредактировал Connor - Feb 28 2018, 09:12
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 28 2018, 10:06
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Connor @ Feb 28 2018, 11:11) *
считаю в коде и засовывал в watch отладчика)

В отладчике у Вас в это время входит ещё и время остановки на брекпоинте. Оно очень даже не маленькое.
Считывать нужно в коде. И убедиться что вход в ISR ничего не тормозит (запреты прерываний, другие ISR и т.п.). Да и поубирать чтение регистров периферии из окон Watch отладчика.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 28 2018, 10:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Connor @ Feb 28 2018, 12:11) *
ацп у меня обрабатывает максимально 8 каналов, включаются они одновременно в режиме multimode, ацп тактируется 72МГц, такая же частота и у SYSCLK, поэтому вариант в CCYNCT=530 тактов лично мне видится более логичным

Модель МК не указана. Вы уверены, что АЦП можно тактировать с частотой 72 МГц? Есть подозрение, что он у вас будет туфту показывать или даже просто жёстко глючить.
Ну и опять же, кто сказал, что ожидание в цикле и прерывание срабатывают по одному и тому же условию? Я верю, что замысел именно таков, но как там вышло на деле - надо ещё разобраться.
Go to the top of the page
 
+Quote Post
Connor
сообщение Feb 28 2018, 10:22
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-05-17
Пользователь №: 97 309



Цитата(jcxz @ Feb 28 2018, 05:06) *
В отладчике у Вас в это время входит ещё и время остановки на брекпоинте. Оно очень даже не маленькое.
Считывать нужно в коде. И убедиться что вход в ISR ничего не тормозит (запреты прерываний, другие ISR и т.п.). Да и поубирать чтение регистров периферии из окон Watch отладчика.


Спасибо! учту

Цитата(scifi @ Feb 28 2018, 05:12) *
Модель МК не указана. Вы уверены, что АЦП можно тактировать с частотой 72 МГц? Есть подозрение, что он у вас будет туфту показывать или даже просто жёстко глючить.
Ну и опять же, кто сказал, что ожидание в цикле и прерывание срабатывают по одному и тому же условию? Я верю, что замысел именно таков, но как там вышло на деле - надо ещё разобраться.


это stm32f303ve,в нём ацп можно тактировать с частотой в 72 мгц, туфут не показывает))проверял с помощью источника питания, показывает те значения, которые подаю ему на входы

Сообщение отредактировал Connor - Feb 28 2018, 10:23
Go to the top of the page
 
+Quote Post
iosifk
сообщение Feb 28 2018, 10:25
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Connor @ Feb 28 2018, 12:11) *
конкретные цифры в цикле while CCYNCT = 530, в десятичной, в обработчике CCYNCT = 27157, вот на такие порядки и отличается))в десятки раз
считаю в коде и засовывал в watch отладчика)

На каждый вызов подпрограммы, возврат, переход и прерывание, процессор вынужден аппаратно очистить конвейер команд. Это может быть 5 циклов про 5-ти ступенчатом конвейере. Плюс к этому в стек пишется адрес возврата. А еще там должна быть смена состояяний регистров, которые должны записываться в стек... Контроллеру прерываний тоже может потребоваться несколько клоков на выработку запроса прерывания...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Connor
сообщение Feb 28 2018, 10:41
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-05-17
Пользователь №: 97 309



понимаете к чему я веду, мне надо укладываться в 20 мкс, это 1440 тактов для 72мгц клока, и тут получается что в одном случае я укладываюсь, а в другом нет, так чему мне верить и на что опираться?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 28 2018, 10:43
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(iosifk @ Feb 28 2018, 12:25) *
На каждый вызов подпрограммы, возврат, переход и прерывание, процессор вынужден аппаратно очистить конвейер команд. Это может быть 5 циклов про 5-ти ступенчатом конвейере. Плюс к этому в стек пишется адрес возврата. А еще там должна быть смена состояяний регистров, которые должны записываться в стек... Контроллеру прерываний тоже может потребоваться несколько клоков на выработку запроса прерывания...

Даже если-б у автора был CM4 и писались/читались в стек все регистры FPU, то всё равно указанное им время слишком велико, чтобы это были затраты по указанным причинам.

Цитата(Connor @ Feb 28 2018, 12:41) *
понимаете к чему я веду, мне надо укладываться в 20 мкс, это 1440 тактов для 72мгц клока, и тут получается что в одном случае я укладываюсь, а в другом нет, так чему мне верить и на что опираться?

Найти в своём коде все места, где есть длинные запреты прерывания. Или длинные ISR с приоритетом выше чем у ISR АЦП.
Go to the top of the page
 
+Quote Post
Connor
сообщение Feb 28 2018, 10:51
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-05-17
Пользователь №: 97 309



Цитата(jcxz @ Feb 28 2018, 05:43) *
Даже если-б у автора был CM4 и писались/читались в стек все регистры FPU, то всё равно указанное им время слишком велико, чтобы это были затраты по указанным причинам.


stm32f303 использует сortex m4 sm.gif

Цитата(jcxz @ Feb 28 2018, 05:43) *
Найти в своём коде все места, где есть длинные запреты прерывания. Или длинные ISR с приоритетом выше чем у ISR АЦП.

Спасибо, посмотрю, я тоже считаю что слишком много тактов в сумме получается для таких затрат

Сообщение отредактировал Connor - Feb 28 2018, 10:52
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 28 2018, 10:53
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Connor @ Feb 28 2018, 13:41) *
понимаете к чему я веду, мне надо укладываться в 20 мкс, это 1440 тактов для 72мгц клока, и тут получается что в одном случае я укладываюсь, а в другом нет, так чему мне верить и на что опираться?

Померить маленькое время очень непросто. Гораздо проще прокрутить интересующий процесс миллион раз или около того и померить время секундомером (в ведроиде такое есть). Ну и разделить на миллион, естественно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 28 2018, 13:48
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Чтобы потешить внутреннего перфекциониста и заведомо избавиться от влияния всяких задержек входа в ISR, то можно попробовать использовать таймер+DMA:
запускаете приём первого блока преобразованных данных с АЦП через DMA; DMA работает связным списком:
первый блок транзакции - пересылка таймер->память, 2-й блок - пересылка АЦП->память, 3-й блок - пересылка память->регистры конфигурации DMA, чтобы запрограммировать его для следующей транзакции. Следующая транзакция: 1)пересылка таймер->память; 2)пересылка АЦП->память.
Обе транзакции должны запускаться от одного события АЦП, и выполнять всю цепочку пересылок без дополнительных сигналов-триггеров до конца транзакции.

PS: А вообще - не знаю как в STM32, но в моём Infineon XMC4700 таймера можно запрограммировать на capture счётчика таймера по сигналу готовности от АЦП. Вот такой способ будет самым точным. Может так можно сделать и в Вашем STM (если он внутри позволяет пробросить сигнал готовности АЦП до таймера). Или если этот сигнал готовности можно вывести на внешнюю ногу МК, то завести его обратно на вход захвата таймера.
Go to the top of the page
 
+Quote Post
Connor
сообщение Mar 1 2018, 07:09
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 26-05-17
Пользователь №: 97 309



Цитата(jcxz @ Feb 28 2018, 08:48) *
Чтобы потешить внутреннего перфекциониста и заведомо избавиться от влияния всяких задержек входа в ISR, то можно попробовать использовать таймер+DMA:
запускаете приём первого блока преобразованных данных с АЦП через DMA; DMA работает связным списком:
первый блок транзакции - пересылка таймер->память, 2-й блок - пересылка АЦП->память, 3-й блок - пересылка память->регистры конфигурации DMA, чтобы запрограммировать его для следующей транзакции. Следующая транзакция: 1)пересылка таймер->память; 2)пересылка АЦП->память.
Обе транзакции должны запускаться от одного события АЦП, и выполнять всю цепочку пересылок без дополнительных сигналов-триггеров до конца транзакции.

PS: А вообще - не знаю как в STM32, но в моём Infineon XMC4700 таймера можно запрограммировать на capture счётчика таймера по сигналу готовности от АЦП. Вот такой способ будет самым точным. Может так можно сделать и в Вашем STM (если он внутри позволяет пробросить сигнал готовности АЦП до таймера). Или если этот сигнал готовности можно вывести на внешнюю ногу МК, то завести его обратно на вход захвата таймера.

Спасибо, попробую)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 1 2018, 07:21
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Чего уж муд(р)ить, на тестовую ножку выдать импульс, начинающийся по старту события и заканчивающийся по стопу. И измерить осциллографом.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 01:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01525 секунд с 7
ELECTRONIX ©2004-2016