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

|
Цитата(Forger @ Jun 23 2016, 11:12)  Абсолютно тупиковый путь, особенное, если планируется расширять проект (код)! Я бы просто заново спроектировал проект. Скорее всего нужно переходить на ртос, тогда число всяких обработчиков прерываний резко сократиться - ведь не на все события нужно реагировать с точность до мкс, опрашивать кнопки тоже нет смысла чаще, чем раз в 50мс. Т.е. для таких вещей хватает одного системного таймера оси (у меня такт в основном 1мс). Короче, самописный асм на ARMе в своем коде - это крайне опасная и нежелательная вещь, ее нужно всячески избегать и исключать еще на этапе проектирования кода. По-моему RTOS сейчас только замедлит код, а основное требование сейчас - это максимальное быстродействие и минимальное число "лишних" команд. Сейчас задействовано всего одно внешнее прерывание. Почему под ARMы нужно избегать самописного ассемблерного кода, вроде как ASM-код - это эталон быстродействия для любой платформы? Цитата(ViKo @ Jun 23 2016, 11:19)  Это уже сделали? Где листинг?
Только в качестве обучающего занятия. Примеры можно найти в книжках Дж. Ю, на одну из которых я ссылался. А для более широких задач почему не подойдет? Заменил на fastы. stdint вместо них подставляет int. Вот листинг: CODE 68: { 0x08000240 B430 PUSH {r4-r5} 69: uint_fast16_t db = GPIOC->IDR & 0x1FFF; 70: uint_fast8_t data/* = db & 0xFF*/; 71: 0x08000242 481D LDR r0,[pc,#116] ; @0x080002B8 0x08000244 8A00 LDRH r0,[r0,#0x10] 72: GPIOB->BSRR = GPIO_BSRR_BS_12; 73: 0x08000246 2201 MOVS r2,#0x01 0x08000248 04C1 LSLS r1,r0,#19 0x0800024A 0CC9 LSRS r1,r1,#19 0x0800024C 481B LDR r0,[pc,#108] ; @0x080002BC 0x0800024E 0312 LSLS r2,r2,#12 0x08000250 6182 STR r2,[r0,#0x18] 74: data = db & 0xFF; 75: 0x08000252 B2CB UXTB r3,r1 76: if (!(db & (0x01 << 12))) { 0x08000254 04CA LSLS r2,r1,#19 68: { 69: uint_fast16_t db = GPIOC->IDR & 0x1FFF; 70: uint_fast8_t data/* = db & 0xFF*/; 71: 72: GPIOB->BSRR = GPIO_BSRR_BS_12; 73: 74: data = db & 0xFF; 75: 76: if (!(db & (0x01 << 12))) { 0x08000256 D429 BMI 0x080002AC 77: switch (db & (0x03 << 9)) { 78: case 0x0000: 0x08000258 2203 MOVS r2,#0x03 0x0800025A 0252 LSLS r2,r2,#9 0x0800025C 4011 ANDS r1,r1,r2 79: GPIOA->ODR = (GPIOA->ODR & ~0xFF) | data; 0x0800025E 4A18 LDR r2,[pc,#96] ; @0x080002C0 0x08000260 D008 BEQ 0x08000274 0x08000262 39FF SUBS r1,r1,#0xFF 0x08000264 39FF SUBS r1,r1,#0xFF 0x08000266 1E89 SUBS r1,r1,#2 0x08000268 D00A BEQ 0x08000280 0x0800026A 39FF SUBS r1,r1,#0xFF 0x0800026C 39FF SUBS r1,r1,#0xFF 0x0800026E 2902 CMP r1,#0x02 0x08000270 D11C BNE 0x080002AC 0x08000272 E00C B 0x0800028E 0x08000274 8A90 LDRH r0,[r2,#0x14] 0x08000276 0A00 LSRS r0,r0,#8 0x08000278 0200 LSLS r0,r0,#8 0x0800027A 4318 ORRS r0,r0,r3 0x0800027C 8290 STRH r0,[r2,#0x14] 80: break; 81: case 0x0200: 0x0800027E E015 B 0x080002AC 82: GPIOB->ODR = (GPIOB->ODR & ~(0x03 << 5)) | (data & (0x03 << 5)); 0x08000280 8A82 LDRH r2,[r0,#0x14] 0x08000282 2160 MOVS r1,#0x60 0x08000284 438A BICS r2,r2,r1 0x08000286 400B ANDS r3,r3,r1 0x08000288 431A ORRS r2,r2,r3 0x0800028A 8282 STRH r2,[r0,#0x14] 83: break; 84: case 0x0400: 0x0800028C E00E B 0x080002AC 85: GPIOA->ODR = (GPIOA->ODR & ~(0x0F << 8)) | ((uint16_t)HINIBBLE(data) << 8); 0x0800028E 8A91 LDRH r1,[r2,#0x14] 0x08000290 240F MOVS r4,#0x0F 0x08000292 0224 LSLS r4,r4,#8 0x08000294 031D LSLS r5,r3,#12 0x08000296 0C2D LSRS r5,r5,#16 0x08000298 43A1 BICS r1,r1,r4 0x0800029A 022D LSLS r5,r5,#8 0x0800029C 4329 ORRS r1,r1,r5 0x0800029E 8291 STRH r1,[r2,#0x14] 86: GPIOB->ODR = (GPIOB->ODR & ~(0x0F << 8)) | ((uint16_t)LONIBBLE(data) << 8); 87: break; 88: case 0x0600: 89: break; 90: } 91: } 0x080002A0 8A81 LDRH r1,[r0,#0x14] 0x080002A2 071A LSLS r2,r3,#28 0x080002A4 43A1 BICS r1,r1,r4 0x080002A6 0D12 LSRS r2,r2,#20 0x080002A8 4311 ORRS r1,r1,r2 0x080002AA 8281 STRH r1,[r0,#0x14] 92: EXTI->PR = EXTI_PR_PR8; 0x080002AC 20FF MOVS r0,#0xFF 0x080002AE 4905 LDR r1,[pc,#20] ; @0x080002C4 0x080002B0 3001 ADDS r0,r0,#0x01 0x080002B2 6148 STR r0,[r1,#0x14] 93: } 0x080002B4 BC30 POP {r4-r5} 0x080002B6 4770 BX lr 0x080002B8 0800 DCW 0x0800 0x080002BA 4800 DCW 0x4800 0x080002BC 0400 DCW 0x0400 0x080002BE 4800 DCW 0x4800 0x080002C0 0000 DCW 0x0000 0x080002C2 4800 DCW 0x4800 0x080002C4 0400 DCW 0x0400 0x080002C6 4001 DCW 0x4001 Цитата(Obam @ Jun 23 2016, 11:27)  Vincent_Mahout_AssemblyLanguageProgramming_ARM_CortexM3.pdf Похоже, то что нужно. Спасибо!
|
|
|
|
|
Jun 23 2016, 09:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Влад Р. @ Jun 23 2016, 11:54)  По-моему RTOS сейчас только замедлит код, а основное требование сейчас - это максимальное быстродействие и минимальное число "лишних" команд. Лишних команд не бывает, а бывают деньги, заплаченные закачиком на разработку впустую Заказчику как правило совершенно до лампочки как внутри реализована задача, главное цена - и время (время = деньги), разумеется, изделие должно соотв. ТЗ. Я лично никогда не буду экономить на цене МК в изделии, которое стоит как минимум в сотню раз дороже, чем этот МК, и поэтмоу заложу такой МК, которого хватит с запасом! В крайнем случае его можно заменить и перенести код на него со старого МК. Кстати, если код был написан через одно место (ASM-вставки, отсутствует система именования, не испоьзуются SVN и т.п.), то это создаст огромную проблему. Более того, крайне затруднительно использование такого кривого разового кода в других проектах, а это тоже адская потеря времени и денег. Цитата Сейчас задействовано всего одно внешнее прерывание. Сколько всего прерываний в коде? Цитата Почему под ARMы нужно избегать самописного ассемблерного кода, См. выше. Не только под ARM, а везде подобный колхоз = зло. Пройдет полгода и попробуйте в нем разобраться или не дай бог кто-то другой будет за вами это делать... Проклянут до 10го колена  Цитата вроде как ASM-код - это эталон быстродействия для любой платформы? Это - величайший миф всех времен и народов!  Мы щас отклоняемся от темы в сторону классических и бессмысленных холиваров типа ASM vs C и т.п. Это бессмыслено. Еще раз: для каждой коммерческой задачи существут бюджет! Вполне возможно, что для примитивных, но очень крупносерийных изделиях есть смысл использовать ASM (в крайне редких случаях), но я не участвовал в таких проектах.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
Сообщений в этой теме
Влад Р. 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 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 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, 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
|
|
|