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

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

9 минут назад, jcxz сказал:

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

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

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

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

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


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

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

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

Каким именно боком тут сторожевой таймер?? :shok:

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

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

Там нечто невразумительное. Поток сознания.

 

PS: Измерение входа в прерывание в нормальном отладчике делается за несколько секунд:

1. Ставим бряк на первую инструкцию ISR.

2. Становимся отладчиком на команду записи значения в регистр программной активации прерывания NVIC.

3. Смотрим на значение счётчика тактов DWT (которое в нормальных отладчиках отображается прямо в окне отладчика). Запоминаем его.

4. Жмём run.

5. Опять смотрим на значение DWT. Вычитаем из него запомненное значение.

6. Теперь ещё раз становимся на то же, что в шаге 2. Делаем один шаг (при запрещённых прерываниях). Вычитаем потраченное время (по DWT) из разницы в шаге 5.

Всё - у вас величина длительности входа в ISR с точностью до такта и без возни с проводами осцилла и гадания на кофейной гуще - почему получается какая-то лажа.

Шаги 1-5 делать нужно при разрешённом только единственном прерывании (все остальные должны быть запрещены).

Все описанные выше операции с командами нужно выполнять в окне дизассемблера!

Для контроля можно поставить ещё один бряк на команду, следующую после команды шага 2. На этот бряк не должно быть входа при выполнении шагов 1-5.

 

PPS: Учитесь работать с отладчиком! Раз уж взялись программировать микроконтроллеры....

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


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

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

и замерял выход в прерывание?

Да, делал это когда-то давно, когда только начинал разбираться с STM32. И вывод таков: время исполнения инструкций - есть величина непостоянная, особенно когда тактовая частота превышает скорость флеша и он работает через предвыборку. 

В остальном же, когда ничего не мешает прерыванию и никакое иное прерывание его не перебивает по приоритету, всё укладывается в заявленные цифры плюс кол-во маш.тактов на исполнение программных инструкций, которые тем заметнее, чем измеряемая длительность ближе к периоду тактовой частоты.

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

WDT,

Всё верно, только порядок буковок другой. 🙂 DWT (Data Watchpoint Trace) - это счетчик машинных циклов, а WDT - вачдог. 

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


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

26 минут назад, EdgeAligned сказал:

Всё верно, только порядок буковок другой. 🙂 DWT (Data Watchpoint Trace) - это счетчик машинных циклов, а WDT - вачдог. 

🙂 да DWT, использовал такой код для подсчета времени цикла:

#define    DWT_CYCCNT    *(volatile uint32_t*)0xE0001004
#define    DWT_CONTROL   *(volatile uint32_t*)0xE0001000
#define    SCB_DEMCR     *(volatile uint32_t*)0xE000EDFC

	//разрешаем использовать DWT и обнуляем значение
	SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;// разрешаем использовать DWT
	DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; // включаем счётчик
	DWT_CYCCNT = 0;// обнуляем счётчик

		if (DWT_CYCCNT > count_tic_old)
			cycle_time = (DWT_CYCCNT - count_tic_old)/7200; // кол-во тактов

count_tic_old = DWT_CYCCNT; // обновляем кол-во тактов

 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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