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

Скорость вызова функции обработки прерывания на Cortex M7

46 минут назад, ДЕЙЛ сказал:

Работать всё будет, но операционка будет тупить, если, например, таймер TIM1 будет генерировать прерывание 10000 раз в секунду или по I2C будем получать 50 кБ в секунду.

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

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


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

1 hour ago, ДЕЙЛ said:

Я не создавал. Здесь поднялся вопрос о нагромождении кода в обработчике прерывания. Считаю, что в любых прерываниях нужно находиться минимально возможное время. Забежал, флаг сбросил, пин выставил, байт прочитал и назад. 

Да там больше половины это метки времени для теста. Остальное макросы где регистры читаются и устанавливаются. Условно на четных циклах я устанавливаю один период, на нечетных - другой. Сброс флагов. И чтение буфера SPI.

Переменные компилятор сократит если упрусь в быстродействие.  С учетом того что код в кэше там накладные расходы несколько циклов от 500 МГц.

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

6 hours ago, ДЕЙЛ said:

Возможно, частота тактирования CPU относительно низкая

У cpu - 500 МГц. У таймера 75.

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

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


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

6 часов назад, ДЕЙЛ сказал:

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

Что??? :shok:  А ничего, что те переменные - локальные автоматические? Вы понимаете разницу между автоматической переменной и статической? Похоже что нет.

Да уж... а я тут о высоких материях.... Да из вас как погляжу - программист как из меня балерина. :biggrin:

Начните с чтения учебника по языку си. До того, как начинать что-то советовать...

Делать те переменные статическими - глупость несусветная.

В 24.07.2024 в 19:32, kochevkv сказал:

Поясните что я делаю не так и почему первый вызов занимает гораздо больше чем последующие?

У вас в распоряжении = Cortex-M7. Весьма богатый по своим возможностям CPU. В том числе имеющий в своём составе и DWT-таймер. Который позволяет производить замеры скорости выполнения как фрагментов кода, так и отдельных инструкций. Промерить длительность выполнения всех участков кода - плёвое дело. Даже в отладчиках эта функция выведена. Например - в IAR:

image.png.ff713a02029532c70d06522bf6809397.png

Шагаем и смотрим - что показывают эти поля. (Естественно: предварительно запретив все прерывания). И так находим где именно тормоза. Далее - изучаем их и понимаем - почему?

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


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

Так я не вникал в назначение тех переменных. Сказал о том, как никогда не делал в прерываниях и всё прекрасно работает по несколько лет без перезапуска. Автоматическое выделение в памяти и освобождение тоже кто-то должен делать, а это лишние команды и такты. 

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


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

В 24.07.2024 в 19:32, kochevkv сказал:

Получается что меньше 1,5...2 микросекунд реакции на прерывание не добиться?

А зачем вы пытаетесь этого добиваться? Не понимаю. Если нужна обработка данных АЦП с минимальной загрузкой CPU, то для этого используют DMA и обработку сразу всего массива сэмплов, накопленных DMA за некоторый период. И контроллер DMA на чтение данных из АЦП потратит времени многократно меньше, чем CPU. Скорее всего - десятки нс. Что недостижимо для CPU.

PS: А задержки входа в ISR могут быть вызваны работой других ISR, с приоритетом больше или равным рассматриваемому. Или из-за интервалов запрета прерываний (например - внутри критических секций) в остальном коде.

10 минут назад, ДЕЙЛ сказал:

Так я не вникал в назначение тех переменных. Сказал о том, как никогда не делал в прерываниях и всё прекрасно работает по несколько лет без перезапуска. Автоматическое выделение в памяти и освобождение тоже кто-то должен делать, а это лишние команды и такты. 

Автоматические переменные любой вменяемый современный компилятор располагает в регистрах CPU. Не тратя на это ни одного лишнего такта CPU.

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

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


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

23 minutes ago, jcxz said:

У вас в распоряжении = Cortex-M7. Весьма богатый по своим возможностям CPU. В том числе имеющий в своём составе и DWT-таймер. Который позволяет производить замеры скорости выполнения как фрагментов кода

Ну я системный таймер использовал. Можно и dwt. А по шагам код из внутренней памяти что-то не шагает правильно. Скачет по всему тексту даже не по обработчику прерывания. Как осиавляешь код в sdram - все нормально. При этом ram код по итогу все выполняет, просто отладка глючит. Где-то что-то в среде не так настроено может.

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


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

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

Ну я системный таймер использовал. Можно и dwt. А по шагам код из внутренней памяти что-то не шагает правильно. Скачет по всему тексту даже не по обработчику прерывания. Как осиавляешь код в sdram - все нормально. При этом ram код по итогу все выполняет, просто отладка глючит.

Это не "отладка глючит". А у вас включена оптимизация высокого уровня. Естественно в этом случае - отлаживать по исходнику практически невозможно. Что вроде бы очевидно. Так как в высокооптимизированном коде теряются связи между исходным кодом и полученными из него командами.

Отлаживать код нужно: или понижая уровень оптимизации; или - по окну дизассемблера.

PS: И располагать ваш код в ОЗУ - нет никакого смысла. Сначала хотя-бы напишите его нормально (а не как сейчас). Оптимально написанный код даст выигрыш в скорости многократно выше, чем перенос его в ОЗУ. Тем более на МК с кешем и для кода выполняющегося циклически, и вызываемого часто - разница вообще скорее всего не будет заметна между выполнением из кешированного флеш vs из ОЗУ.

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


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

6 minutes ago, jcxz said:

А зачем вы пытаетесь этого добиваться? Не понимаю. Если нужна обработка данных АЦП с минимальной загрузкой CPU, то для этого используют DMA и обработку сразу всего массива сэмплов, накопленных DMA за некоторый период.

Я ж уже писал. Не неправильно выбрал таймер. Понравились 32 бита, которые, в общем-то, не нужны. У него нет отдельных полей длительности 0 и длительности 1. Есть режим переключения 0-1 toggle и период. Т.к. АЦП запускает обмен данными только в 0 решил укоротить 1 и делать "полупрограммный" ШИМ. Период аппаратный, а переключение длительности программно в прерывании.

DMA можно, но на прошлом контроллере было сделано так. Вот переделываю на другой. Было сделано в прерывании. Подсчет максимумов, коррекция нуля и прочие вычисления сразу в прерывании. Контроллер тянет, еще и отрисовку делать успевает и точно знаешь что никакое другое даже очень длительное прерывание процесс выборки не перебьет.

5 minutes ago, jcxz said:

Это не "отладка глючит". А у вас включена оптимизация высокого уровня. Естественно в этом случае - отлаживать по исходнику практически невозможно. Что вроде бы очевидно. Так как в высокооптимизированном коде теряются связи между исходным кодом и полученными из него командами.

Оптимизация отключена. Код из sdram того же прерывания отлаживается как надо. Тут что-то другое.

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


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

4 минуты назад, kochevkv сказал:

Оптимизация отключена. Код из sdram того же прерывания отлаживается как надо. Тут что-то другое.

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

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


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

6 minutes ago, jcxz said:

PS: И располагать ваш код в ОЗУ - нет никакого смысла. Сначала хотя-бы напишите его нормально (а не как сейчас). Оптимально написанный код даст выигрыш в скорости многократно выше, чем перенос его в ОЗУ. Тем более на МК с кешем и для кода выполняющегося циклически, и вызываемого часто - разница вообще скорее всего не будет заметна между выполнением из кешированного флеш vs из ОЗУ.

Кэш активно используется дисплеем. Я б на него особо не надеялся. Дисплей без буфера, в режиме h v sync. Ускорение очень ощутимо при расположении кода и переменных в ram. Отрисовка ускорялась раза в 2 когда установки графики располагал в ram.

Код оптимизировать в какую сторону? Там нет ничего лишнего. Он выглядит не очень для любителя ассемблера и регистров, но там везде макросы которые разворачиваются в простые регистровые. операции

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


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

1 минуту назад, kochevkv сказал:

Кэш активно используется дисплеем.

Каким образом кеш флеша (кеш кода) может использоваться дисплеем? Вы что-то путаете.

1 минуту назад, kochevkv сказал:

Код оптимизировать в какую сторону? Там нет ничего лишнего.

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

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


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

1 minute ago, jcxz said:

Все эти чтения статусов и их очистка - это одиночные команды чтения и записи регистров периферии. И тот огород, что вы там нагородили - не нужен.

Так это и есть чтение-запись регистров) там нет функций. Я ж говорю - макросы через дефайн типа вот как-то так:

#define SetPeriod( x ) ( pTMR1->PER = ( x ) )

7 minutes ago, jcxz said:

Каким образом кеш флеша (кеш кода) может использоваться дисплеем? Вы что-то путаете.

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

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


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

А как вы конкретно считали время в прерывании?
Какой уровень оптимизации включён?
Если у вас весь алгоритм в прерываниях, ядро между ними переводится в сон или нет?
Как настроен MPU..?

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


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

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

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

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

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

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

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

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

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

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