auric 0 9 января Опубликовано 9 января · Жалоба 9 минут назад, jcxz сказал: Практическая статистика у нас полностью совпадает с данными, приведёнными в мануалах. Чудес не встречал. А что там у вас за бардак в коде творится - только Ванга сможет угадать. PS: Это уже не говоря, что измерять такие времена с помощью осциллографа - это зашквар. О чём уже многократно писали. Но вы ведь не читатель, верно? Вы писатель. Мануалов не читаете, советов в форумах - тоже, в дизассемблер не смотрите. Да и сами как видно думать не хотите. честно в моем случае это был вопрос менее одной минуты (осцил и так висел на нужной ножке), не надо искать код для WDT, хотя я его знаю и использовал в других задачах, так что каждому свое...гадать что у меня я и не просил, читайте первый пост...для меня важно понять в первом приближении - проблема встречалась ли и насколько часто...если честно больше кажется то, что никто вообще не заморачивается временем выхода в прерывание, если задача и так решается... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 9 января Опубликовано 9 января · Жалоба 45 минут назад, auric сказал: честно в моем случае это был вопрос менее одной минуты (осцил и так висел на нужной ножке), не надо искать код для WDT, хотя я его знаю и использовал в других задачах, Каким именно боком тут сторожевой таймер?? 45 минут назад, auric сказал: так что каждому свое...гадать что у меня я и не просил, читайте первый пост Там нечто невразумительное. Поток сознания. PS: Измерение входа в прерывание в нормальном отладчике делается за несколько секунд: 1. Ставим бряк на первую инструкцию ISR. 2. Становимся отладчиком на команду записи значения в регистр программной активации прерывания NVIC. 3. Смотрим на значение счётчика тактов DWT (которое в нормальных отладчиках отображается прямо в окне отладчика). Запоминаем его. 4. Жмём run. 5. Опять смотрим на значение DWT. Вычитаем из него запомненное значение. 6. Теперь ещё раз становимся на то же, что в шаге 2. Делаем один шаг (при запрещённых прерываниях). Вычитаем потраченное время (по DWT) из разницы в шаге 5. Всё - у вас величина длительности входа в ISR с точностью до такта и без возни с проводами осцилла и гадания на кофейной гуще - почему получается какая-то лажа. Шаги 1-5 делать нужно при разрешённом только единственном прерывании (все остальные должны быть запрещены). Все описанные выше операции с командами нужно выполнять в окне дизассемблера! Для контроля можно поставить ещё один бряк на команду, следующую после команды шага 2. На этот бряк не должно быть входа при выполнении шагов 1-5. PPS: Учитесь работать с отладчиком! Раз уж взялись программировать микроконтроллеры.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 9 января Опубликовано 9 января · Жалоба 1 час назад, auric сказал: и замерял выход в прерывание? Да, делал это когда-то давно, когда только начинал разбираться с STM32. И вывод таков: время исполнения инструкций - есть величина непостоянная, особенно когда тактовая частота превышает скорость флеша и он работает через предвыборку. В остальном же, когда ничего не мешает прерыванию и никакое иное прерывание его не перебивает по приоритету, всё укладывается в заявленные цифры плюс кол-во маш.тактов на исполнение программных инструкций, которые тем заметнее, чем измеряемая длительность ближе к периоду тактовой частоты. 1 час назад, auric сказал: WDT, Всё верно, только порядок буковок другой. 🙂 DWT (Data Watchpoint Trace) - это счетчик машинных циклов, а WDT - вачдог. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
auric 0 9 января Опубликовано 9 января · Жалоба 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; // обновляем кол-во тактов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться