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

 
 
> По скорости ядра STR912, восемь операторов на ассемблере за 1.6мкс?!!
HardJoker
сообщение Jun 13 2007, 15:47
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 995
Регистрация: 3-06-05
Пользователь №: 5 713



Есть main(), фактически из одного бесконечного цикла для проверки производительности ядра STR912FW44. Среда - IAR4.40:

u8 TMP0 = 0;

while(1)
{
if (Tick == 0)
{
GPIO_WriteBit(GPIO0, GPIO_Pin_0, Bit_RESET);
Tick = 1;
}
else
{
GPIO_WriteBit(GPIO0, GPIO_Pin_0, Bit_SET);
Tick = 0;
}
}

Время выполнения 1,6мкс. Ядро тактируется 96MHz через PLL. Память flash конфигурируется с двумя тактами ожиданмия и тактируется 48MHz

//FMI Waite States
FMI_Config(FMI_READ_WAIT_STATE_2, FMI_WRITE_WAIT_STATE_0, FMI_PWD_ENABLE,\
FMI_LVD_ENABLE, FMI_FREQ_HIGH);


В симуляторе при выключенной оптимизации по скорости все действия занимают 8-мь ассемблерных команд. С учетом медленного доступа к внутренней flash (не более 24MHz) на выполнение должно уйти не более 320ns. Измеренное значение почти в пять раз больше. Где может теряеться вычислительный ресурс?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
etoja
сообщение Jun 14 2007, 02:59
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Биты ввода-вывода не могут переключаться с большой частотой. На них и теряется быстродействие.
Go to the top of the page
 
+Quote Post
HardJoker
сообщение Jun 14 2007, 08:05
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 995
Регистрация: 3-06-05
Пользователь №: 5 713



Цитата(etoja @ Jun 14 2007, 06:59) *
Биты ввода-вывода не могут переключаться с большой частотой. На них и теряется быстродействие.


Все задействованные блоки GPIO тактируются частотой 1/2 master-clock (RCLKDIV = 1):

SCU_PCLKDivisorConfig(SCU_PCLK_Div2);

SCU_APBPeriphClockConfig(__GPIOx, ENABLE);
GPIO_DeInit(GPIOx);
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jun 14 2007, 09:53
Сообщение #4


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата(HardJoker @ Jun 14 2007, 12:05) *
Все задействованные блоки GPIO тактируются частотой 1/2 master-clock (RCLKDIV = 1):

SCU_PCLKDivisorConfig(SCU_PCLK_Div2);

SCU_APBPeriphClockConfig(__GPIOx, ENABLE);
GPIO_DeInit(GPIOx);


Это ничего не значит !, тактироваться может чем угодно, а дергает всеравно медленно !
Если хотите измерять производительность с помощью ног, делается это так, пишется функция которая выполняет скажем 100 милионов нопов, перед входом устанавливете ногу после выхода опускаете, после чего врямя делите на 100 милионов и получите более мене точный результат, чем больше цикл, тем меньше сказывается тормознутость ног на измерение и следовательно более точный результат имеете.
Go to the top of the page
 
+Quote Post
bzx
сообщение Jun 14 2007, 10:27
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



2 MALLOY2
Всё правильно, но, возможно, что HardJoker не стремился оценить реальное быстродействие ядра, а хотел определить, судя по исходному коду, максимальну скорость работы IO. smile.gif


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jun 14 2007, 10:36
Сообщение #6


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Так зачем тогда такой умный код ?
Почему бы не так ?
Код
while(1)
{
GPIO_WriteBit(GPIO0, GPIO_Pin_0, Bit_RESET);
GPIO_WriteBit(GPIO0, GPIO_Pin_0, Bit_SET);
}


Так более точно можно определить скорость "дрыганья" ногами smile.gif
Go to the top of the page
 
+Quote Post
HardJoker
сообщение Jun 14 2007, 10:55
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 995
Регистрация: 3-06-05
Пользователь №: 5 713



Цитата(MALLOY2 @ Jun 14 2007, 13:53) *
Это ничего не значит !, тактироваться может чем угодно, а дергает всеравно медленно !
Если хотите измерять производительность с помощью ног, делается это так, пишется функция которая выполняет скажем 100 милионов нопов, перед входом устанавливете ногу после выхода опускаете, после чего врямя делите на 100 милионов и получите более мене точный результат, чем больше цикл, тем меньше сказывается тормознутость ног на измерение и следовательно более точный результат имеете.


Увы, интересует именно выполнение короткой процедуры. Штатная программа состоит из набора простых действий, которые должны выополняться за минимальный временной интервал. Иногда по прерыванию требуется обработать разовую команду также за минимальное время. Интегральные оценки производительности не подходят. Возможно, выход в выполнении всех критичных процедур из внутренней SRAM.

Цитата(MALLOY2 @ Jun 14 2007, 14:36) *
Так зачем тогда такой умный код ?
Почему бы не так ?
Код
while(1)
{
GPIO_WriteBit(GPIO0, GPIO_Pin_0, Bit_RESET);
GPIO_WriteBit(GPIO0, GPIO_Pin_0, Bit_SET);
}


Так более точно можно определить скорость "дрыганья" ногами smile.gif


Умный код позволяет анализировать установленное состояние пина в любом месте алгоритма. Процедура используется в штатной программе, поэтому интересует именно ее скорость выполнения.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jun 14 2007, 11:02
Сообщение #8


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Увы, интересует именно выполнение короткой процедуры. Штатная программа состоит из набора простых действий, которые должны выополняться за минимальный временной интервал. Иногда по прерыванию требуется обработать разовую команду также за минимальное время. Интегральные оценки производительности не подходят. Возможно, выход в выполнении всех критичных процедур из внутренней SRAM.


Это тут причем ? какая разница короткая или длиная, мленькаыя или большая. Я посоветовал как измерить скорость выполния 1 команды NOP, тоесть после этого теста можзно сказать что 1 команда ноп выполняется за некоторое время. Другое доло когда вы в своих коротких функциях испрользуете ножки, в этом случае ядро будет останавливаться и ждать выполения команды, да и на конвеерных ядрах много переходов не есть хорошо, особенно в этом ядре у которого кеш переходов очень мальнький, а в FW версии в отличии от FAW еще и глючный!. Такчто оптимизируйте свою программу и делайте выводы. Еще в ковеерных ядрах выполнениефункции может колебаться на длинну конвеера.

P.S. у STR время выполнения из ОЗУ и из FLASH практически одинаковое.
Go to the top of the page
 
+Quote Post
HardJoker
сообщение Jun 14 2007, 11:39
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 995
Регистрация: 3-06-05
Пользователь №: 5 713



Цитата(MALLOY2 @ Jun 14 2007, 15:02) *
Это тут причем ? какая разница короткая или длиная, мленькаыя или большая. Я посоветовал как измерить скорость выполния 1 команды NOP, тоесть после этого теста можзно сказать что 1 команда ноп выполняется за некоторое время. Другое доло когда вы в своих коротких функциях испрользуете ножки, в этом случае ядро будет останавливаться и ждать выполения команды, да и на конвеерных ядрах много переходов не есть хорошо, особенно в этом ядре у которого кеш переходов очень мальнький, а в FW версии в отличии от FAW еще и глючный!. Такчто оптимизируйте свою программу и делайте выводы. Еще в ковеерных ядрах выполнениефункции может колебаться на длинну конвеера.

P.S. у STR время выполнения из ОЗУ и из FLASH практически одинаковое.


Большое спасибо за ценный совет. Подозрения на конвейер были и раньше. Как я понимаю, отключить конвейер нельзя, хотя очень бы хотелось. Как раз из-за необходимости загружать его каждый раз в том числе при переходах.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jun 14 2007, 11:48
Сообщение #10


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Конвеер это начало начал, благадаря ему повышается производительность, если вам не нравится конвеер поставте AVR, у него все линейно и одинаково работает smile.gif
Go to the top of the page
 
+Quote Post
HardJoker
сообщение Jun 14 2007, 12:01
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 995
Регистрация: 3-06-05
Пользователь №: 5 713



Цитата(MALLOY2 @ Jun 14 2007, 15:48) *
Конвеер это начало начал, благадаря ему повышается производительность, если вам не нравится конвеер поставте AVR, у него все линейно и одинаково работает smile.gif


Иметь возможность гибко перенастраивать длину конвейера в зависимости от задач - скорее плюс тому же конвейеру.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jun 14 2007, 12:11
Сообщение #12


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Разве такое возможно ? невстречал ниодного ядра с переменным конвеером smile.gif, скорее всего это не возможно, да я и смыла невижу.
Go to the top of the page
 
+Quote Post
HardJoker
сообщение Jun 14 2007, 12:15
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 995
Регистрация: 3-06-05
Пользователь №: 5 713



Цитата(MALLOY2 @ Jun 14 2007, 16:11) *
Разве такое возможно ? невстречал ниодного ядра с переменным конвеером smile.gif, скорее всего это не возможно, да я и смыла невижу.


Я тоже не встречал, хотя переменная размерность данных есть в TigerShark'ах
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 14 2007, 16:28
Сообщение #14


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Ну сперва убедитесь, что у вас выставлены все настройки как указано ниже:
Core clock (MCLK) 96 MHz
RCLK 96 MHz
Flash Memory Interface Clock 96 MHz
AHB clock (HCLK) 96 MHz
APB clock (PCLK) 96 MHz
External memory clock (BCLK) 96 MHz
Branch cache enabled
DTCM has 0 wait state
AHB has 0 wait state
AHB Lock transfer disabled
FLASH read with 2 wait states
FLASH Bus clock speed >66 MHz
ARM966ES buffered writes disabled
ARM966ES instruction prefetch buffer enabled

Потом учтите, что из FLASH чуть ли не в два раза медленее выполняется чем из RAM. Правда это не к NOP-у относится, а интегральный показатель. У STR91xFAW он улучшен.
Как быстро генеряться импульсы на пинах можно почитать тут: http://aly.projektas.lt/Projects/STR91_Start/STR91.htm#2

Конвеер в STR91x - это не аттрибут ядра, а прокладка между ядром и FLASH, при работе из RAM он никакого влияния не имеет. И конвеер, кстати, можно отключить, хотя не советую.
Также STR91x можно разогнать до 130 МГц. Во время тестирования на этой частоте сбоев обнаружить не удалось, даже АЦП работал с прежней точностью.
Go to the top of the page
 
+Quote Post
HardJoker
сообщение Jun 14 2007, 18:20
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 995
Регистрация: 3-06-05
Пользователь №: 5 713



Цитата(AlexandrY @ Jun 14 2007, 20:28) *
Ну сперва убедитесь, что у вас выставлены все настройки как указано ниже:
Core clock (MCLK) 96 MHz
RCLK 96 MHz
Flash Memory Interface Clock 96 MHz
AHB clock (HCLK) 96 MHz
APB clock (PCLK) 96 MHz
External memory clock (BCLK) 96 MHz
Branch cache enabled
DTCM has 0 wait state
AHB has 0 wait state
AHB Lock transfer disabled
FLASH read with 2 wait states
FLASH Bus clock speed >66 MHz
ARM966ES buffered writes disabled
ARM966ES instruction prefetch buffer enabled

Потом учтите, что из FLASH чуть ли не в два раза медленее выполняется чем из RAM. Правда это не к NOP-у относится, а интегральный показатель. У STR91xFAW он улучшен.
Как быстро генеряться импульсы на пинах можно почитать тут: http://aly.projektas.lt/Projects/STR91_Start/STR91.htm#2

Конвеер в STR91x - это не аттрибут ядра, а прокладка между ядром и FLASH, при работе из RAM он никакого влияния не имеет. И конвеер, кстати, можно отключить, хотя не советую.
Также STR91x можно разогнать до 130 МГц. Во время тестирования на этой частоте сбоев обнаружить не удалось, даже АЦП работал с прежней точностью.


Практически такие настройки в SCU у меня и стоят. Исключение в делителе на двойку PCLK. Ресурс http://aly.projektas.lt уже смотрел. На него есть ссылка в нескольких темах форума. Выложенный там пример проекта с STR912 у меня тоже есть. Если не трудно, пожалуйста, приведите собственный вариант настроек и инициализации STR91x.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:22
Рейтинг@Mail.ru


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