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

 
 
> STM32F0 Время реакции и выполнения прерывания
Влад Р.
сообщение Jun 21 2016, 12:40
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Добрый день!

Имеется МК STM32F0. Работает на частоте 48 МГц. Фоновая программа представляет собой пустой бесконечный цикл. По фронту сигнала на выводе МК настроено внешнее прерывание. В обработчике прерывания только операции с портами ввода/вывода и логические операции. Все задействованные выводы сконфигурированы на работу на максимальной скорости.
Согласно статье "A Beginner’s Guide on Interrupt Latency - and Interrupt Latency of the ARM® Cortex®-M processors" время реакции на прерывание для ядра Cortex-M0 составляет 16 машинных циклов. Первой командой после входа в обработчик я считываю один из портов в/в, затем на одном из выводов другого порта устанавливаю высокий уровень. Время между фронтом внешнего сигнала, вызвавшим внешнее прерывание, и установкой высокого уровня на выводе, указанном выше, составляет 800 нс. Почему такое большое время и как можно его сократить?
В той же статье говорится о джиттере времени реакции, но неясно от каких факторов он может зависеть?
Время выполнения обработчика прерывания составило 1,5 мкс, что тоже неожиданно много. Также буду рад советам как уменьшить.

Используется Keil 5.17. Пробовал различные уровни оптимизации компилируемого кода, оптимизацию по времени/объему. Не давало положительных результатов. Размещение обработчика прерывания в ОЗУ позволило сократить время его выполнения на 0,2 мкс, но не повлияло на время реакции на прерывание.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Влад Р.
сообщение Jun 24 2016, 13:46
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511



Цитата(scifi @ Jun 23 2016, 17:26) *
Могу: тут.
Но имейте в виду: задержки флеша и доступа к периферии (GPIO) там не указаны.

При текущей частоте задержка флэш составляет 1 Wait State. Это значит что при выполнении кода из флеша к длительности всех команд можно добавить 1 машинный цикл? Как оценить на сколько в такой ситуации ускоряет выполнение буфер предварительной выборки? Задержка доступа к периферии определяется исключительно частотой шины, на которой она сидит, и собственными предделителями конкретной периферии? Или есть еще влияющие факторы?

Цитата(IJAR @ Jun 24 2016, 15:57) *

Спасибо за ссылку! Фейспалм мне, что ненагуглил эту тему раньше.

Написал в отдельном файле простой обработчик, который для начала будет просто устанавливать пин в единицу и сбрасывать флаг прерывания. Среда компилирует файл. Но не могу понять как задействовать его в основной программе?
CODE
EXTI_BASE EQU 0x40010400
GPIOA_BASE EQU 0x48000000
GPIOB_BASE EQU 0x48000400
GPIOC_BASE EQU 0x48000800

EXTI_PR_OFFSET EQU 0x14
GPIO_IDR_OFFSET EQU 0x10
GPIO_BSRR_OFFSET EQU 0x18

AREA EXTI, CODE, READONLY
EXTI4_15_IRQHandler PROC
LDR r0, =GPIOB_BASE ; загрузить в регистр r0 адрес порта GPIOB
MOVS r1, #0x01 ; копировать в регистр r1 значение 0x01
LSLS r2, r1, #12 ; логический сдвиг влево на 12 бит значения в регистре r1 и сохранение результата в регистр r2
STR r2, [r0, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r2 в регистр GPIOB->BSRR
LDR r0, =EXTI_BASE ; загрузить в регистр r0 адрес модуля EXTI
LSLS r1, #8 ; логический сдвиг влево на 8 бит значения в регистре r1
STR r1, [r0, #EXTI_PR_OFFSET] ; сохранить слово из регистра r1 в регистр EXTI->PR
BX LR
ENDP
END
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 24 2016, 20:25
Сообщение #3


Гуру
******

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



Цитата(Влад Р. @ Jun 24 2016, 19:46) *
При текущей частоте задержка флэш составляет 1 Wait State. Это значит что при выполнении кода из флеша к длительности всех команд можно добавить 1 машинный цикл? Как оценить на сколько в такой ситуации ускоряет выполнение буфер предварительной выборки?

Нет. Задержка добавляется при отсутствии следующей для выполнения команды в буфере предвыборки.
Например: после перехода буфер опустошается. Через 2 такта он будет заполнен 4-мя байтами (если верно, что ширина шины выборки команд == 32 бита как тут ранее писали).
Если в этих 4-х байтах 2 команды и нет перехода, то за время пока они выполняются, буфер предвыборки может успеть прочитать ещё 32 бита (если шина к данной области памяти не занята).
Если же в этих 4-байтах команда 4-байтовая и её длительность в циклах ==1 (не знаю - есть-ли такие в M0?), то тогда да - опять будет опустошение предвыборки и приостановка на такт декодера команд.
Или если буфер предвыборки не успел прочитать след. байты из-за занятости шины (если был доступ CPU к данным в этом-же регионе памяти, или был доступ к данному региону другого bus-mastera по этой-же шине).
В общем - на линейном коде без ветвлений и если в данном регионе находится только исполняемый код, скорей всего никаких дополнительных тактов ожидания не будет.
На переходах будут приостановки. Хотя - может в Вашем МК буфер предыворки содержит несколько строк кеша? Но в Вашем вряд-ли. В некоторых МК буфер предвыборки имеет ёмкость в неск. сток кеша (в Tiva например).
Ещё дополнительные приостановки предвыборки могут быть если целевой адрес перехода не кратен 4. Имхо - буфер предвыборки скорей всего работает с выровненными адресами, а значит при невыровненном на 4 целевом адресе перехода, за первый доступ считает только максимум одну 2-байтовую команду, и если её длительность ==1 икл, то опять будет stall на дополнительный цикл на выборку следующих 32 бит.
Хотя всё это я описал для M3/M4, но думаю в M0 - аналогично.

Совет: там где у Вас switch, используйте табличный переход LDR PC,[Rx] - это сделает все ветвления case одинаковой длительности и избавит от необходимости if (!(db & (0x01 << 12))) {.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 25 2016, 02:07
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(jcxz @ Jun 25 2016, 00:25) *
Хотя всё это я описал для M3/M4, но думаю в M0 - аналогично.

У СМ0 один канал подгрузки данных (шина), У СМ3 (и старше) две или даже три. СМ0 выполняя инструкцию обращения к памяти будет отнимать эту шину от подгрузки кода.

Цитата(Влад Р. @ Jun 25 2016, 01:18) *
Пока разобрался как задействовать код из asm-файла.

После сброса периферии, вызвавшей обработчик нужно несколько тактов ожидания. Можно просто NOP-ов. Если после STR выполнить сразу BX lr, то будет сразу же повторный "залёт" в обработчик. Обычно нужно 3-10 тактов ожидания. Сколько конкретно - ведомо разве что разработчику всего чипа. Можно определить тестируя в железе. Лучше делать с запасом. Можно использовать инструкции DSB, т.к. у СМ0 DSB всегда константной длительности. Но инструкция шириной как два NOPa (32 bit).

Сообщение отредактировал GetSmart - Jun 25 2016, 02:08


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Влад Р.   STM32F0 Время реакции и выполнения прерывания   Jun 21 2016, 12:40
- - scifi   Обращение к портам ввода-вывода тоже время должно ...   Jun 21 2016, 13:05
- - jcxz   Цитата(Влад Р. @ Jun 21 2016, 18:40) Врем...   Jun 21 2016, 13:14
- - SasaVitebsk   В статье указано, что 16 машинных циклов пройдёт о...   Jun 21 2016, 13:17
|- - dimka76   Цитата(SasaVitebsk @ Jun 21 2016, 16:17) ...   Jun 21 2016, 13:25
|- - jcxz   Цитата(SasaVitebsk @ Jun 21 2016, 19:17) ...   Jun 21 2016, 13:44
||- - SasaVitebsk   Цитата(jcxz @ Jun 21 2016, 16:44) Обычно ...   Jun 22 2016, 05:49
||- - jcxz   Цитата(SasaVitebsk @ Jun 22 2016, 11:49) ...   Jun 22 2016, 06:28
||- - ViKo   Цитата(jcxz @ Jun 22 2016, 09:28) Хотя у ...   Jun 22 2016, 06:39
|- - AlexRayne   Цитата(SasaVitebsk @ Jun 21 2016, 16:17) ...   Jun 21 2016, 13:51
|- - jcxz   Цитата(AlexRayne @ Jun 21 2016, 19:51) вр...   Jun 21 2016, 13:57
|- - AlexRayne   Цитата(jcxz @ Jun 21 2016, 16:57) Объясни...   Jun 21 2016, 15:01
||- - jcxz   Цитата(AlexRayne @ Jun 21 2016, 21:01) чт...   Jun 21 2016, 15:58
|- - RadiatoR   Цитата(jcxz @ Jun 21 2016, 16:57) ЗЫ: Кст...   Jun 21 2016, 16:25
- - Влад Р.   RE: STM32F0 Время реакции и выполнения прерывания   Jun 21 2016, 19:39
|- - jcxz   Цитата(Влад Р. @ Jun 22 2016, 01:39) Что ...   Jun 22 2016, 05:16
- - ViKo   Измените переменные на 32-битовые. Везде, где можн...   Jun 22 2016, 05:35
- - Влад Р.   Цитата(jcxz @ Jun 22 2016, 08:16) Ну а че...   Jun 22 2016, 06:13
- - Влад Р.   Цитата(jcxz @ Jun 22 2016, 09:28) А тепер...   Jun 22 2016, 06:42
|- - jcxz   Цитата(Влад Р. @ Jun 22 2016, 12:42) Можн...   Jun 22 2016, 06:45
|- - ViKo   Цитата(Влад Р. @ Jun 22 2016, 09:42) Не п...   Jun 22 2016, 06:55
- - Влад Р.   Цитата(ViKo @ Jun 22 2016, 09:55) Включен...   Jun 22 2016, 07:16
|- - HHIMERA   Цитата(Влад Р. @ Jun 22 2016, 10:16) Это ...   Jun 22 2016, 07:55
|- - Obam   Цитата(Влад Р. @ Jun 22 2016, 11:16) PUSH...   Jun 22 2016, 07:57
||- - jcxz   Цитата(Obam @ Jun 22 2016, 13:57) И кстат...   Jun 22 2016, 08:04
||- - scifi   Цитата(Obam @ Jun 22 2016, 10:57) И кстат...   Jun 22 2016, 08:07
||- - Obam   Цитата(scifi @ Jun 22 2016, 12:07) Мысль,...   Jun 22 2016, 08:24
||- - scifi   Цитата(Obam @ Jun 22 2016, 11:13) Cortex-...   Jun 22 2016, 08:51
|||- - Obam   Цитата(scifi @ Jun 22 2016, 12:51) Вы буд...   Jun 22 2016, 12:12
||||- - scifi   Цитата(Obam @ Jun 22 2016, 15:12) Смеятьс...   Jun 22 2016, 12:54
||||- - Obam   Цитата(scifi @ Jun 22 2016, 16:54) Ну, зн...   Jun 22 2016, 14:37
||||- - scifi   Цитата(Obam @ Jun 22 2016, 17:37) Смайлик...   Jun 22 2016, 17:08
||||- - Obam   Цитата(scifi @ Jun 22 2016, 21:08) Слив з...   Jun 23 2016, 08:12
|||- - GetSmart   Цитата(scifi @ Jun 22 2016, 12:51) Bit-ba...   Jun 22 2016, 18:03
|||- - scifi   Цитата(GetSmart @ Jun 22 2016, 21:03) Мож...   Jun 22 2016, 18:08
||- - jcxz   Цитата(Obam @ Jun 22 2016, 14:24) Личный ...   Jun 22 2016, 09:03
||- - ViKo   Цитата(jcxz @ Jun 22 2016, 12:03) Не прав...   Jun 22 2016, 09:41
||- - scifi   Цитата(ViKo @ Jun 22 2016, 12:41) Открыва...   Jun 22 2016, 09:51
||- - ViKo   Цитата(scifi @ Jun 22 2016, 12:51) На как...   Jun 22 2016, 10:05
|- - ViKo   Цитата(Влад Р. @ Jun 22 2016, 10:16) Пояс...   Jun 22 2016, 08:51
- - Сергей Борщ   Может крамолу скажу, но если основной цикл пустой,...   Jun 22 2016, 09:21
|- - Влад Р.   Цитата(Сергей Борщ @ Jun 22 2016, 12:21) ...   Jun 22 2016, 09:51
- - GetSmart   Те же лицензиаты издавали рекламные обзоры, из кот...   Jun 22 2016, 18:19
|- - scifi   Цитата(GetSmart @ Jun 22 2016, 21:19) Ког...   Jun 22 2016, 19:28
||- - GetSmart   Цитата(scifi @ Jun 22 2016, 23:28) Ой, да...   Jun 22 2016, 21:32
||- - GetSmart   Прошу прощения за отклонение от темы беседы. Но по...   Jun 24 2016, 15:58
|- - Obam   Цитата(GetSmart @ Jun 22 2016, 22:19) … B...   Jun 23 2016, 08:27
|- - GetSmart   Цитата(Obam @ Jun 23 2016, 12:27) Справед...   Jun 23 2016, 10:20
- - Влад Р.   Появилась новая проблема - написание обработчика п...   Jun 23 2016, 05:52
|- - Forger   Цитата(Влад Р. @ Jun 23 2016, 08:52) Появ...   Jun 23 2016, 08:12
- - ViKo   ЦитатаИзмените переменные на 32-битовые. Везде, гд...   Jun 23 2016, 08:19
- - Влад Р.   Цитата(Forger @ Jun 23 2016, 11:12) Абсол...   Jun 23 2016, 08:54
|- - scifi   Цитата(Влад Р. @ Jun 23 2016, 11:54) Заме...   Jun 23 2016, 09:13
||- - Влад Р.   Цитата(scifi @ Jun 23 2016, 12:13) Кстати...   Jun 23 2016, 09:33
|||- - Forger   Цитата(Влад Р. @ Jun 23 2016, 12:33) В да...   Jun 23 2016, 09:54
||- - jcxz   Цитата(scifi @ Jun 23 2016, 15:13) Такой ...   Jun 23 2016, 10:17
||- - Forger   Цитата(jcxz @ Jun 23 2016, 13:17) Даже ОС...   Jun 23 2016, 10:34
||- - jcxz   Цитата(jcxz @ Jun 23 2016, 16:17) Наприме...   Jun 23 2016, 10:34
|- - Forger   Цитата(Влад Р. @ Jun 23 2016, 11:54) По-м...   Jun 23 2016, 09:26
- - ViKo   Что-то не впечатляет результат... Надо бы не прост...   Jun 23 2016, 09:13
- - Влад Р.   Цитата(jcxz @ Jun 23 2016, 13:17) Наприме...   Jun 23 2016, 11:15
|- - jcxz   Цитата(Влад Р. @ Jun 23 2016, 17:15) Сейч...   Jun 23 2016, 13:24
- - Влад Р.   Цитата(jcxz @ Jun 23 2016, 16:24) Я уже В...   Jun 23 2016, 13:54
|- - Obam   Цитата(Влад Р. @ Jun 23 2016, 17:54) Опис...   Jun 23 2016, 14:25
|- - scifi   Цитата(Влад Р. @ Jun 23 2016, 16:54) Може...   Jun 23 2016, 14:26
|- - IJAR   http://electronix.ru/forum/index.php?showt...869...   Jun 24 2016, 12:57
- - Obam   IARом пользуетесь? Тогда "IAR C/C++ Developme...   Jun 24 2016, 13:56
- - Влад Р.   Цитата(Obam @ Jun 24 2016, 16:56) IARом п...   Jun 24 2016, 14:00
- - Влад Р.   Цитата(jcxz @ Jun 24 2016, 23:25) Нет. За...   Jun 24 2016, 21:18
|- - jcxz   Цитата(Влад Р. @ Jun 25 2016, 03:18) В Re...   Jun 27 2016, 04:57
- - Влад Р.   Цитата(GetSmart @ Jun 25 2016, 05:07) Пос...   Jun 25 2016, 04:15
- - GetSmart   Цитата(Влад Р. @ Jun 25 2016, 08:15) Что-...   Jun 25 2016, 15:38
- - Влад Р.   Цитата(jcxz @ Jun 27 2016, 07:57) Обычно ...   Jun 27 2016, 12:05
|- - Сергей Борщ   QUOTE (Влад Р. @ Jun 27 2016, 15:05) Сбро...   Jun 27 2016, 12:51
|- - jcxz   Цитата(Влад Р. @ Jun 27 2016, 18:05) Тут ...   Jun 27 2016, 14:03
- - Влад Р.   Цитата(Сергей Борщ @ Jun 27 2016, 15:51) ...   Jun 27 2016, 13:12
- - ViKo   КодCMP R0, #3; Compare input to maximum valid choi...   Jun 27 2016, 14:12
|- - jcxz   Цитата(ViKo @ Jun 27 2016, 20:12) MULS R0...   Jun 27 2016, 15:22
|- - ViKo   Цитата(jcxz @ Jun 27 2016, 18:22) Однако ...   Jun 27 2016, 15:41
- - Влад Р.   Цитата(jcxz @ Jun 27 2016, 17:03) Не поня...   Jun 27 2016, 15:27
- - jcxz   Цитата(Влад Р. @ Jun 27 2016, 21:27) На с...   Jun 27 2016, 15:59


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

 


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


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