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

 
 
6 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> STM32F0 Время реакции и выполнения прерывания
Влад Р.
сообщение Jun 22 2016, 06:13
Сообщение #16


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

Группа: Свой
Сообщений: 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;
  ...
}
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 22 2016, 06:28
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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. Это приводит к лишним командам в коде.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 22 2016, 06:39
Сообщение #18


Универсальный солдатик
******

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



Цитата(jcxz @ Jun 22 2016, 09:28) *
Хотя у ТС в данном случае команды в основном 2-байтные.

Ага. Все! biggrin.gif И неспроста.
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 22 2016, 06:42
Сообщение #19


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

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



Цитата(jcxz @ Jun 22 2016, 09:28) *
А теперь посмотрите листинг - сколько там команд, просуммируйте со временем стекинга и прочими временами. Как раз и получите, что имеете.
Как уже Вам советовали - не стоит использовать 8-и и 16-битные переменные где ни попадя на 32-битном CPU. Это приводит к лишним командам в коде.


Можно ли как-то отключить стекинг РОН или это делается аппаратно? К примеру, не использовать РОН в обработчике прерывания.
Не понятно, включено ли время стекинга (PUSH) во время Interrupt Latency (16 циклов)?
Переменные заменил на intы, обработчик положил в ОЗУ.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 22 2016, 06:45
Сообщение #20


Гуру
******

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



Цитата(Влад Р. @ Jun 22 2016, 12:42) *
Можно ли как-то отключить стекинг РОН или это делается аппаратно?

нельзя.

Цитата(Влад Р. @ Jun 22 2016, 12:42) *
К примеру, не использовать РОН в обработчике прерывания.

Можно избавиться от PUSH, написав ISR на асме.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 22 2016, 06:55
Сообщение #21


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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.

Если ограничить количество переменных, можно уложиться в те регистры, что сохраняются аппаратно.
Компилятор сам лишних регистров не сохраняет. Я так думаю.
Go to the top of the page
 
+Quote Post
Влад Р.
сообщение Jun 22 2016, 07:16
Сообщение #22


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

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



Цитата(ViKo @ Jun 22 2016, 09:55) *
Включено. Иначе, что бы там делалось целых 16 тактов?

Если ограничить количество переменных, можно уложиться в те регистры, что сохраняются аппаратно.
Компилятор сам лишних регистров не сохраняет. Я так думаю.


Это бы много объяснило. Часть регистров помещается в стек аппаратно и отключить это невозможно. Время за которое это происходит составляет минимальное время реакции на прерывание (Interrupt Latency - 16 cycles).
PUSH в начале обработчика помещает дополнительно еще парочку РОН и от этого можно уйти, написав обработчик на асме.

Цитата(ViKo @ Jun 22 2016, 09:39) *
Ага. Все! biggrin.gif И неспроста.

Поясните, пожалуйста.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jun 22 2016, 07:55
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(Влад Р. @ Jun 22 2016, 10:16) *
Это бы

А в чём сыр-бор??? Чего добиться то хотите???
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 22 2016, 07:57
Сообщение #24


Знающий
****

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



Цитата(Влад Р. @ Jun 22 2016, 11:16) *
PUSH в начале обработчика помещает дополнительно еще парочку РОН и от этого можно уйти, написав обработчик на асме.


Можно, если использовать только R0 - R3, R12, а в случае дополнительной нужды в регистрах (не забываем - RISC - все действия только с регистрами, кроме загрузки-выгрузки)
без PUSH/POP не обойтись.
И кстати, bitbanding по регистрам периферии может помочь уменьшить число команд.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 22 2016, 08:04
Сообщение #25


Гуру
******

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



Цитата(Obam @ Jun 22 2016, 13:57) *
И кстати, bitbanding по регистрам периферии может помочь уменьшить число команд.

Или наоборот - увеличить wink.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 22 2016, 08:07
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Obam @ Jun 22 2016, 10:57) *
И кстати, bitbanding по регистрам периферии может помочь уменьшить число команд.

Мысль, конечно, интересная, но у STM32F0 этой фичи нет.
Go to the top of the page
 
+Quote Post
Obam
сообщение Jun 22 2016, 08:24
Сообщение #27


Знающий
****

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



Цитата(scifi @ Jun 22 2016, 12:07) *
Мысль, конечно, интересная, но у STM32F0 этой фичи нет.


Cortex-M0, тогда да, пардону просим. Всё время упускаю, что есть ARMv6

Цитата(jcxz @ Jun 22 2016, 12:04) *
Или наоборот - увеличить wink.gif


Личный опыт показывает, что число команд R-M-W уменьшается wink.gif


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 22 2016, 08:51
Сообщение #28


Универсальный солдатик
******

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



Цитата(Влад Р. @ Jun 22 2016, 10:16) *
Поясните, пожалуйста.

Я так понимаю, ARM стремилась в Cortex-M0 использовать преимущественно 16-битовые команды, ради экономии памяти.

Цитата(Влад Р. @ Jun 22 2016, 10:16) *
PUSH в начале обработчика помещает дополнительно еще парочку РОН и от этого можно уйти, написав обработчик на асме.

Попробуйте сделать что-то совсем простое, инвертировать бит, например. И без asm ненужные регистры в стек запихиваться не будут.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 22 2016, 08:51
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Obam @ Jun 22 2016, 11:13) *
Cortex-M0, тогда да, пардону просим. Всё время упускаю, что есть ARMv6

Вы будете смеяться, но Cortex-M0 и ARMv6 тут совершенно ни чём.
Bit-banding - это опция на процессорах M0, M3 и M4. Так уж получилось, что она чаще встречается у M3 и M4, чем у M0. См. тут.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 22 2016, 09:03
Сообщение #30


Гуру
******

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



Цитата(Obam @ Jun 22 2016, 14:24) *
Личный опыт показывает, что число команд R-M-W уменьшается wink.gif

Если код типа:
u32 i = GPIOC->IDR & 0x1FFF;
*BITBAND_IO(&GPIOC->ODR, bitX) = 1;
то может увеличиться, так как народ часто использует команды RMW там где они реально не нужны (а периферия GPIO во многих МК как правило имеет регистры позволяющие установку/сброс отдельных битов просто командами записи, а не чтения-модификации-записи). А обращение к региону bitband требует дополнительной загрузки указателя на него.
К тому же например IAR почему-то плохо компилит код с обращением к битбанд-области - получается куча лишних команд даже при полной оптимизации. sad.gif((

Цитата(ViKo @ Jun 22 2016, 14:51) *
Я так понимаю, ARM стремилась в Cortex-M0 использовать преимущественно 16-битовые команды, ради экономии памяти.

Не правильно пояснили sm.gif
Потому, что в коде из листинга используются регистры R0-R7 и только простые режимы адресации (без автоинкрементов, длинных смещений и т.п.) и формы команд влияющие на флаги (MOVS, LSLS, ...) и т.п.
Поэтому все команды короткие.
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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