|
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 23 2016, 11:15
|
Частый гость
 
Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511

|
Цитата(jcxz @ Jun 23 2016, 13:17)  Например if (!(db & (0x01 << 12))) { - совершенно лишнее. Нужно убрать, а следующую строку заменить на switch (db & (3 << 9 | 1 << 12)) {. if (!(db & (0x01 << 12))) необходима, чтобы в случае невыполнения условия, как можно быстрее выйти из прерывания. Цитата(jcxz @ Jun 23 2016, 13:17)  Операция & 0x1FFF в первой строке тоже совершенно не нужная, генерит две лишних ассемблерных команды. Да, Вы правы. Осталась после предыдущих версий кода. Сейчас не нужна. Но на сколько я могу судить, компилятор ее проигнорировал (в дизассемблере ее не нашел, обычное считывание регистра). Сейчас и из Си убрал. Остальное переделал: CODE 68: { 0x08000240 B410 PUSH {r4} 69: uint_fast16_t db = GPIOC->IDR; 70: 0x08000242 4819 LDR r0,[pc,#100] ; @0x080002A8 0x08000244 8A00 LDRH r0,[r0,#0x10] 71: GPIOB->BSRR = GPIO_BSRR_BS_12; 72: 0x08000246 2101 MOVS r1,#0x01 0x08000248 4A18 LDR r2,[pc,#96] ; @0x080002AC 0x0800024A 0309 LSLS r1,r1,#12 0x0800024C 6191 STR r1,[r2,#0x18] 73: if (!(db & (0x01 << 12))) { 0x0800024E 04C1 LSLS r1,r0,#19 68: { 69: uint_fast16_t db = GPIOC->IDR; 70: 71: GPIOB->BSRR = GPIO_BSRR_BS_12; 72: 73: if (!(db & (0x01 << 12))) { 0x08000250 D424 BMI 0x0800029C 74: switch (db & (0x03 << 9)) { 75: case 0x0000: 0x08000252 2103 MOVS r1,#0x03 0x08000254 0249 LSLS r1,r1,#9 76: GPIOA->BSRR = (0xFF << 16) | (db & 0xFF); 0x08000256 4B16 LDR r3,[pc,#88] ; @0x080002B0 0x08000258 4001 ANDS r1,r1,r0 0x0800025A D008 BEQ 0x0800026E 0x0800025C 39FF SUBS r1,r1,#0xFF 0x0800025E 39FF SUBS r1,r1,#0xFF 0x08000260 1E89 SUBS r1,r1,#2 0x08000262 D00A BEQ 0x0800027A 0x08000264 39FF SUBS r1,r1,#0xFF 0x08000266 39FF SUBS r1,r1,#0xFF 0x08000268 2902 CMP r1,#0x02 0x0800026A D117 BNE 0x0800029C 0x0800026C E00B B 0x08000286 0x0800026E 21FF MOVS r1,#0xFF 0x08000270 B2C0 UXTB r0,r0 0x08000272 0409 LSLS r1,r1,#16 0x08000274 1840 ADDS r0,r0,r1 0x08000276 6198 STR r0,[r3,#0x18] 77: break; 78: case 0x0200: 0x08000278 E010 B 0x0800029C 79: GPIOB->BSRR = (0x03 << 21) | (db & (0x03 << 5)); 0x0800027A 2160 MOVS r1,#0x60 0x0800027C 4008 ANDS r0,r0,r1 0x0800027E 0409 LSLS r1,r1,#16 0x08000280 1840 ADDS r0,r0,r1 0x08000282 6190 STR r0,[r2,#0x18] 80: break; 81: case 0x0400: 0x08000284 E00A B 0x0800029C 82: GPIOA->BSRR = (0x0F << 24) | ((db & 0xF0) << 4); 0x08000286 21F0 MOVS r1,#0xF0 0x08000288 4001 ANDS r1,r1,r0 0x0800028A 010C LSLS r4,r1,#4 0x0800028C 210F MOVS r1,#0x0F 0x0800028E 0609 LSLS r1,r1,#24 0x08000290 1864 ADDS r4,r4,r1 0x08000292 619C STR r4,[r3,#0x18] 83: GPIOB->BSRR = (0x0F << 24) | ((db & 0x0F) << 8); 84: break; 85: } 86: } 0x08000294 0700 LSLS r0,r0,#28 0x08000296 0D00 LSRS r0,r0,#20 0x08000298 1840 ADDS r0,r0,r1 0x0800029A 6190 STR r0,[r2,#0x18] 87: EXTI->PR = EXTI_PR_PR8; 0x0800029C 20FF MOVS r0,#0xFF 0x0800029E 4905 LDR r1,[pc,#20] ; @0x080002B4 0x080002A0 3001 ADDS r0,r0,#0x01 0x080002A2 6148 STR r0,[r1,#0x14] 88: } 0x080002A4 BC10 POP {r4} 0x080002A6 4770 BX lr 0x080002A8 0800 DCW 0x0800 0x080002AA 4800 DCW 0x4800 0x080002AC 0400 DCW 0x0400 0x080002AE 4800 DCW 0x4800 0x080002B0 0000 DCW 0x0000 0x080002B2 4800 DCW 0x4800 0x080002B4 0400 DCW 0x0400 0x080002B6 4001 DCW 0x4001 Цитата(jcxz @ Jun 23 2016, 13:17)  Берёте полученный листинг (лучше сделанный с полной оптимизацией), описание команд Cortex-M0 и разбираетесь. Сейчас как раз этим и занимаюсь. Не подскажите где посмотреть длительность каждой команды в машинных циклах?
|
|
|
|
Сообщений в этой теме
Влад Р. 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, 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, 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|