|
|
  |
STM32F0 Время реакции и выполнения прерывания |
|
|
|
Jun 22 2016, 06:13
|
Частый гость
 
Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511

|
Цитата(jcxz @ Jun 22 2016, 08:16)  Ну а чего-ж Вы хотите??? У Вас от входа в ISR до установки пина такая куча команд выполняется: Прошу прощения. Установка пина выполнялась исключительно для того, чтобы понять сколько времени занимает вход в прерывание и первое считывание порта. В выложенном листинге ее нет. Было примерно так: Код void EXTI4_15_IRQHandler(void) { uint16_t db = GPIOC->IDR & 0x1FFF; uint8_t data; GPIOB->BSRR = GPIO_BSRR_BS_12; data = db; ... }
|
|
|
|
|
Jun 22 2016, 06:28
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(SasaVitebsk @ Jun 22 2016, 11:49)  Да посмотрел, там 0 ws до 24МГц и 1ws выше. Ширина шины флэш 32 бита всего, правда есть prefetch bufer небольшой... В целом достаточно убого, по ускорению выборки. Ну вот, а это означает, что хоть и установлена 48МГц, но код, состоящий из последовательности 4-байтовых команд, будет выполняться со скоростью 24MIPS. Так что перенос в ОЗУ должен помочь. Если будет поток из одних 4-байтовых команд, то prefetch buffer никак не поможет. Хотя у ТС в данном случае команды в основном 2-байтные. Цитата(Влад Р. @ Jun 22 2016, 12:13)  Прошу прощения. Установка пина выполнялась исключительно для того, чтобы понять сколько времени занимает вход в прерывание и первое считывание порта. В выложенном листинге ее нет. Было примерно uint16_t db = GPIOC->IDR & 0x1FFF; uint8_t data; GPIOB->BSRR = GPIO_BSRR_BS_12; data = db; А теперь посмотрите листинг - сколько там команд, просуммируйте со временем стекинга и прочими временами. Как раз и получите, что имеете. Как уже Вам советовали - не стоит использовать 8-и и 16-битные переменные где ни попадя на 32-битном CPU. Это приводит к лишним командам в коде.
|
|
|
|
|
Jun 22 2016, 06:42
|
Частый гость
 
Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511

|
Цитата(jcxz @ Jun 22 2016, 09:28)  А теперь посмотрите листинг - сколько там команд, просуммируйте со временем стекинга и прочими временами. Как раз и получите, что имеете. Как уже Вам советовали - не стоит использовать 8-и и 16-битные переменные где ни попадя на 32-битном CPU. Это приводит к лишним командам в коде. Можно ли как-то отключить стекинг РОН или это делается аппаратно? К примеру, не использовать РОН в обработчике прерывания. Не понятно, включено ли время стекинга (PUSH) во время Interrupt Latency (16 циклов)? Переменные заменил на intы, обработчик положил в ОЗУ.
|
|
|
|
|
Jun 22 2016, 06:45
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Влад Р. @ Jun 22 2016, 12:42)  Можно ли как-то отключить стекинг РОН или это делается аппаратно? нельзя. Цитата(Влад Р. @ Jun 22 2016, 12:42)  К примеру, не использовать РОН в обработчике прерывания. Можно избавиться от PUSH, написав ISR на асме.
|
|
|
|
|
Jun 22 2016, 06:55
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Влад Р. @ Jun 22 2016, 09:42)  Не понятно, включено ли время стекинга (PUSH) во время Interrupt Latency (16 циклов)? Включено. Иначе, что бы там делалось целых 16 тактов? Читайте Джозефа Ю. Цитата When an exception is accepted on the Cortex-M0 processor, some of the registers in the register banks (R0 to R3, R12, R14), the return address (PC), and the Program Status Register (xPSR) are pushed to the current active stack memory automatically. Если ограничить количество переменных, можно уложиться в те регистры, что сохраняются аппаратно. Компилятор сам лишних регистров не сохраняет. Я так думаю.
|
|
|
|
|
Jun 22 2016, 07:16
|
Частый гость
 
Группа: Свой
Сообщений: 87
Регистрация: 9-12-10
Пользователь №: 61 511

|
Цитата(ViKo @ Jun 22 2016, 09:55)  Включено. Иначе, что бы там делалось целых 16 тактов?
Если ограничить количество переменных, можно уложиться в те регистры, что сохраняются аппаратно. Компилятор сам лишних регистров не сохраняет. Я так думаю. Это бы много объяснило. Часть регистров помещается в стек аппаратно и отключить это невозможно. Время за которое это происходит составляет минимальное время реакции на прерывание (Interrupt Latency - 16 cycles). PUSH в начале обработчика помещает дополнительно еще парочку РОН и от этого можно уйти, написав обработчик на асме. Цитата(ViKo @ Jun 22 2016, 09:39)  Ага. Все!  И неспроста. Поясните, пожалуйста.
|
|
|
|
|
Jun 22 2016, 07:55
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(Влад Р. @ Jun 22 2016, 10:16)  Это бы А в чём сыр-бор??? Чего добиться то хотите???
|
|
|
|
|
Jun 22 2016, 07:57
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Влад Р. @ Jun 22 2016, 11:16)  PUSH в начале обработчика помещает дополнительно еще парочку РОН и от этого можно уйти, написав обработчик на асме. Можно, если использовать только R0 - R3, R12, а в случае дополнительной нужды в регистрах (не забываем - RISC - все действия только с регистрами, кроме загрузки-выгрузки) без PUSH/POP не обойтись. И кстати, bitbanding по регистрам периферии может помочь уменьшить число команд.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 22 2016, 08:24
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(scifi @ Jun 22 2016, 12:07)  Мысль, конечно, интересная, но у STM32F0 этой фичи нет. Cortex-M0, тогда да, пардону просим. Всё время упускаю, что есть ARMv6 Цитата(jcxz @ Jun 22 2016, 12:04)  Или наоборот - увеличить  Личный опыт показывает, что число команд R-M-W уменьшается
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jun 22 2016, 09:03
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Obam @ Jun 22 2016, 14:24)  Личный опыт показывает, что число команд R-M-W уменьшается  Если код типа: u32 i = GPIOC->IDR & 0x1FFF; *BITBAND_IO(&GPIOC->ODR, bitX) = 1; то может увеличиться, так как народ часто использует команды RMW там где они реально не нужны (а периферия GPIO во многих МК как правило имеет регистры позволяющие установку/сброс отдельных битов просто командами записи, а не чтения-модификации-записи). А обращение к региону bitband требует дополнительной загрузки указателя на него. К тому же например IAR почему-то плохо компилит код с обращением к битбанд-области - получается куча лишних команд даже при полной оптимизации.  (( Цитата(ViKo @ Jun 22 2016, 14:51)  Я так понимаю, ARM стремилась в Cortex-M0 использовать преимущественно 16-битовые команды, ради экономии памяти. Не правильно пояснили  Потому, что в коде из листинга используются регистры R0-R7 и только простые режимы адресации (без автоинкрементов, длинных смещений и т.п.) и формы команд влияющие на флаги (MOVS, LSLS, ...) и т.п. Поэтому все команды короткие.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|