|
STM32F0 Время реакции и выполнения прерывания |
|
|
|
Jun 21 2016, 12:40
|
Частый гость
 
Группа: Свой
Сообщений: 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 мкс, но не повлияло на время реакции на прерывание.
|
|
|
|
|
 |
Ответов
|
Jun 27 2016, 12:05
|
Частый гость
 
Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511

|
Цитата(jcxz @ Jun 27 2016, 07:57)  Обычно чтобы символьные имена из асм-файла были видимы в других исходных файлах (си и асм), нужно это символьное имя объявить в директиве PUBLIC. Ну и, естественно, прописать прототип в си-хидере. И наоборот: чтобы в асм-файле были видимы имена из других объектных файлов, нужно их указать в директиве EXTERN. EXPORT я не использую нигде. Тут случай особый. Это функция-обработчик прерывания. И её прототип указывается в ASM-файле начальной инициализации, который трогать нежелательно. Поэтому в определении функции необходимо директива EXPORT или её синоним GLOBAL. Цитата(jcxz @ Jun 27 2016, 07:57)  Можно это квитирование прерывания просто поставить в начале ISR, сразу после входа. Я так и делаю обычно. В моей ситуации необходимо как можно быстрее после входа в обработчик считать регистр порта в/в. Но в любом случае, это лишнее. Сброс флага внешнего прерывания нормально отрабатывает и непосредственно перед выходом из обработчика. Написал обработчик на ASMе. Время входа в прерывание удалось сократить до 500 нс. Этого пока достаточно. Как сделать табличные переходы не соображу. Вот, что получилось: 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 GPIO_BRR_OFFSET EQU 0x28
MACRO asmexti_exit LDR r0, =EXTI_BASE ; загрузить в регистр r0 адрес модуля EXTI MOVS r1, #0x01 ; загрузить в регистр r1 значение 0x01 LSLS r1, #8 ; логический сдвиг влево на 8 бит значения в регистре r1 STR r1, [r0, #EXTI_PR_OFFSET] ; сохранить слово из регистра r1 в регистр EXTI->PR BX lr ; возврат из функции ALIGN MEND
AREA ASMEXTI, CODE, READONLY EXTI4_15_IRQHandler PROC EXPORT EXTI4_15_IRQHandler LDR r0, =GPIOC_BASE ; загрузить в регистр r0 адрес порта GPIOC LDRH r0, [r0, #GPIO_IDR_OFFSET] ; загрузить в регистр r0 полуслово из регистра GPIOC->IDR LSRS r1, r0, #9 ; логический сдвиг вправо на 9 бит значения в регистре r0 и сохранение результата в регистр r1 MOVS r2, #0x0B ; загрузить в регистр r2 значение 0x0B ANDS r1, r2 ; побитовое И регистра r1 с регистром r2 CMP r1, #0x02 ; сравнить вычитанием из регистра r1 значения 0x02 BEQ C ; условный переход на метку C, если результат операции нулевой CMP r1, #0x00 ; сравнить вычитанием из регистра r1 значения 0x00 BEQ A ; условный переход на метку A, если результат операции нулевой CMP r1, #0x01 ; сравнить вычитанием из регистра r1 значения 0x01 BEQ B ; условный переход на метку B, если результат операции нулевой asmexti_exit A MOVS r1, #0xFF ; загрузить в регистр r1 значение 0xFF ANDS r0, r1 ; побитовое И регистра r0 с регистром r1 LSLS r1, #16 ; логический сдвиг влево на 16 бит значения в регистре r1 ORRS r0, r1 ; побитовое ИЛИ регистра r0 с регистром r1 LDR r2, =GPIOA_BASE ; загрузить в регистр r2 адрес порта GPIOA STR r0, [r2, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r0 в регистр GPIOA->BSRR asmexti_exit B MOVS r1, #0x60 ; загрузить в регистр r1 значение 0x60 ANDS r0, r1 ; побитовое И регистра r0 с регистром r1 LSLS r1, #16 ; логический сдвиг влево на 16 бит значения в регистре r1 ORRS r0, r1 ; побитовое ИЛИ регистра r0 с регистром r1 LDR r2, =GPIOB_BASE ; загрузить в регистр r2 адрес порта GPIOB STR r0, [r2, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r0 в регистр GPIOB->BSRR asmexti_exit C MOVS r1, #0x0F ; загрузить в регистр r1 значение 0x0F LSLS r2, r1, #4 ; логический сдвиг влево на 4 бита значения в регистре r1 и сохранение результата в регистр r2 ANDS r2, r0 ; побитовое И регистра r2 с регистром r0 LSLS r2, #4 ; логический сдвиг влево на 4 бита значения в регистре r2 LSLS r3, r1, #24 ; логический сдвиг влево на 24 бита значения в регистре r0 и сохранение результата в регистр r3 ORRS r2, r3 ; побитовое ИЛИ регистра r2 с регистром r3 LDR r3, =GPIOA_BASE ; загрузить в регистр r2 адрес порта GPIOA STR r2, [r3, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r2 в регистр GPIOA->BSRR ANDS r0, r1 ; побитовое И регистра r0 с регистром r1 LSLS r0, #8 ; логический сдвиг влево на 8 бит значения в регистре r0 LSLS r2, r1, #24 ; логический сдвиг влево на 24 бита значения в регистре r0 и сохранение результата в регистр r3 ORRS r0, r2 ; побитовое ИЛИ регистра r0 с регистром r2 LDR r1, =GPIOB_BASE ; загрузить в регистр r1 адрес порта GPIOB STR r0, [r1, #GPIO_BSRR_OFFSET] ; сохранить слово из регистра r0 в регистр GPIOB->BSRR asmexti_exit ENDP END
|
|
|
|
|
Jun 27 2016, 12:51
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Влад Р. @ Jun 27 2016, 15:05)  Сброс флага внешнего прерывания нормально отрабатывает и непосредственно перед выходом из обработчика. Инженеры ARM с вами не согласны, поэтому придумали инструкции барьеров (DSB, DMB, IMB). Но вы можете лично наступить на грабли.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Влад Р. 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 Влад Р. Цитата(scifi @ Jun 23 2016, 17:26) Могу: ... Jun 24 2016, 13:46 jcxz Цитата(Влад Р. @ Jun 24 2016, 19:46) При ... Jun 24 2016, 20:25  GetSmart Цитата(jcxz @ Jun 25 2016, 00:25) Хотя вс... Jun 25 2016, 02:07 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, 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|