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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Почему с PowerPac код работает быстрее, чем просто на Cи?
kolobochishe
сообщение Nov 29 2010, 14:19
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



int main(void)
{

unsigned int temp, MyAdr, MyPins, ii;
unsigned int MyArray[5];

ii = 0;
FIO4DIR3_bit.P4_0 = 1; // Вывод на выход

while(1)
{
MyArray[ii] = FIO1PIN;
FIO4PIN3_bit.P4_0= ~FIO4PIN3_bit.P4_0; //Дергаем ножкой
}

}

Почему с PowerPac скорость выше в 2 раза? Вроде просто Си программа все же ближе к ассемблеру, чем ОС плюс задача?

И сразу еще один вопрос. Частота "подергивания ножкой" с PowerPac 1,2Мгц, а просто Си - 0,5Мгц. Неужели быстрее нельзя? Что за операции такие производит контроллер, когда читает порт и записывает в ОЗУ? Это же 50 тактов минимум. И как в ИАРе вообще можно посмотреть время выполнения?

Забыл уточнить. OLIMEX-LPC2478
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 29 2010, 14:34
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Рискну предположить, что PowerPack в процессе старта настраивает PLL, а ваша программа работает напрямую от кварца или внутреннего RC.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Nov 29 2010, 14:35
Сообщение #3


Знающий
****

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



PowerPack правильно настроил проц на максимальную производительность, а вы что то забыли у себя в Си.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Nov 29 2010, 16:23
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



ок. даже если так. Хотя взял просто пример LCD Demo и заменил main. Почему такие большие задержки? Почему такой длинный цикл? Если кому не лень, проверьте у себя в PowerPac. Тот же код. Просто опрос регистра состояния порта и запись значения в массив, и с последущим "подергиванием ножки". У кого сколько времени займет. Пример простой, может кому любопытно.
Занимаюсь программированием совсем недавно. Не ожидал, что с процессором 72МГц будет проблема с опросом порта с частотой 2МГц с последующим сохранением в SDRAM (там на плате 2 микросхемы по 32МБ). Не на асме же писать в наш то век smile.gif тем более хочется многозадачности
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 30 2010, 09:27
Сообщение #5


Гуру
******

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



Цитата(kolobochishe @ Nov 29 2010, 19:23) *
Не ожидал, что с процессором 72МГц будет проблема с опросом порта с частотой 2МГц с последующим сохранением в SDRAM (там на плате 2 микросхемы по 32МБ). Не на асме же писать в наш то век smile.gif

В большинстве МК обращение к GPIO занимает несколько тактов процессора. Причём сколько именно - как правило нигде не написано. И ассемблером это не исправить.
Для более быстрого ввода-вывода используют иные периферийные устройства, а не GPIO.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Nov 30 2010, 10:01
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(scifi @ Nov 30 2010, 14:27) *
Для более быстрого ввода-вывода используют иные периферийные устройства, а не GPIO.


это какие, например?

Цитата(Сергей Борщ @ Nov 29 2010, 19:34) *
Рискну предположить, что PowerPack в процессе старта настраивает PLL, а ваша программа работает напрямую от кварца или внутреннего RC.



Использую функцию InitClock() определенную в sys.h. Устанавливает в 72МГц тактовую частоту ядра.
При отладке SYS_GetFsclk(); возвращает 72 000 000. Т.е. работает на 72МГц

PCLKSEL1_bit.PCLK_GPIO = 1; - частота работы порта вывода также 72МГц (делитель 1). До этого было 00 - что означало 72МГц/4

И все равно результат не дотягивает совсем до ожидаемого. Что еще можно сделать?

Добавил цикл задержки. Инкремент до 70 в цикле for. Результат оказался гораздо больше. Хотя должно быть 1-2мкс. Все же не проходит ощущение, что работает контроллер совсем не на 72МГц.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 30 2010, 10:07
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(kolobochishe @ Nov 30 2010, 13:01) *
Добавил цикл задержки. Инкремент до 70 в цикле for. Результат оказался гораздо больше. Хотя должно быть 1-2мкс. Все же не проходит ощущение, что работает контроллер совсем не на 72МГц.

На самом деле есть ещё задержки чтения флеши (если программа работает не из RAM)
Плюс, каждый переход сбрасывает конвейер, что тоже сильно влияет (команды выполняются не за 1 такт).
Ну а что происходит в действительности - очень просто посмотреть в листинге, и к гадалке ходить не надо.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Nov 30 2010, 11:17
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(MrYuran @ Nov 30 2010, 15:07) *
На самом деле есть ещё задержки чтения флеши (если программа работает не из RAM)


smile.gif Вы оказались ближе всех к истине. У ARM7 наиболее узкое место в скорости работы программы - чтение из флеш. В контроллере есть возможность включить модуль ускорения работы памяти. Это модуль управляется регистрами MAMCR и MAMTIM.

Пока не нашел какие значения использует для этих регистров PowerPac RTOS от IAR, но задав в программе нужные значения MAMCR=2; MAMTIM=3; получил ускорение работы цикла опроса и записи в массив аж до 2МГц (все равно плоховато, но лучше еще не получалось smile.gif). С операционкой было 1,2МГц. Естественно, в компиляторе тоже включил оптимизацию по скорости. Для отладки это плохо (переменные куда-то теряются и при отладке их значения нельзя посмотреть), но зато шустро.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Nov 30 2010, 13:40
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



PowerPac настроил регистры MAMCR=1 и MAMTIM=5. Поэтому и медленнее. После этих манипуляций с регистрами поместил функцию в RAM с помощью директивы компилятору (или уж не знаю как назвать) __ramfunc. Результат не изменился.

Т.е. фактически частота опроса GPIO ограничена примерно 3-4МГц. Если у кого были лучшие результаты для данного типа контроллеров, расскажите как сделали.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 30 2010, 14:21
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Я, конечно, [пока] не спец по АРМовой периферии, но вот это
Цитата
FIO4PIN3_bit.P4_0= ~FIO4PIN3_bit.P4_0; //Дергаем ножкой

как-то странно смотрится...
Там же вроде напрямую можно ставить/сбрасывать биты, без предварительного чтения.
А так понятно - прочитали - модифицировали - записали, и всё это через тормознутый GPIO интерфейс
Так что можно при желании ещё х2 частоту поднять

Ну а дальше - анролл циклов для оптимизации конвейера


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 1 2010, 04:38
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(MrYuran @ Nov 30 2010, 19:21) *
Ну а дальше - анролл циклов для оптимизации конвейера


анролл? это какая то оптимизация работы циклов?

Цитата(kolobochishe @ Nov 29 2010, 19:19) *
FIO4PIN3_bit.P4_0= ~FIO4PIN3_bit.P4_0; //Дергаем ножкой


Просто инвертирую то что есть. Я не знал, что чтение с GPIO занимает много времени, поэтому предпочел инвертировать прочитанное значение, а не создавать отдельную переменную.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Dec 1 2010, 09:53
Сообщение #12


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Если создать переменную и её инвертировать, а потом записывать в порт, то в таком простеньком примере переменная окажется в регистре и чтения GPIO и даже рамы не будет. Скорость работы будет выше. Но не факт что всегда. Для установки и сброса битов есть отдельные регистры GPIO, для инверсии такого нет.

анролл... как-то так
Код
while(1)
{
MyArray[ii++] = FIO1PIN;
FIO4SET = 1<<4; //Дергаем ножкой
MyArray[ii++] = FIO1PIN;
FIO4CLR = 1<<4; //Дергаем ножкой
MyArray[ii++] = FIO1PIN;
FIO4SET = 1<<4; //Дергаем ножкой
MyArray[ii++] = FIO1PIN;
FIO4CLR = 1<<4; //Дергаем ножкой
}


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 1 2010, 10:09
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Понял. Пример упрощенный, мягко говоря. Элементов должно быть 20*10^6. Т.е. примерно 20 МБ. Тупая забивка массива за 5 секунд на максимальной скорости (2MSPS). Как я понял пример выше - анролл получится великоват smile.gif

а выход инверсионный я для оценки скорости записи и опроса GPIO использовал. Не знаю как еще в реальном времени это проверить. В конце цикла подавал сигнал об окончании в виде перехода из 1 в 0 и наоборот
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 1 2010, 10:28
Сообщение #14


Гуру
******

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



Цитата(kolobochishe @ Dec 1 2010, 13:09) *
Понял. Пример упрощенный, мягко говоря. Элементов должно быть 20*10^6. Т.е. примерно 20 МБ. Тупая забивка массива за 5 секунд на максимальной скорости (2MSPS). Как я понял пример выше - анролл получится великоват smile.gif

Это как бы очевидно. А примеры намеренно делаются упрощёнными - на то они и примеры. И разворачивать цикл целиком никому в здравом уме не захочется. Так что не следует засорять тему.
Кстати, если озвучите марку чипа и суть задачи, то кто-нибудь, возможно, посоветует, какими средствами кроме GPIO эту задачу можно решить.
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Dec 1 2010, 14:01
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(scifi @ Dec 1 2010, 15:28) *
Кстати, если озвучите марку чипа и суть задачи, то кто-нибудь, возможно, посоветует, какими средствами кроме GPIO эту задачу можно решить.


Отладочная плата OLIMEX LPC-2478STK.

Задача - оцифровка сигнала с помощью АЦП AD7622 в течение 5-10 секунд с последующей записью массива на SD-флеш. Скорость работы АЦП - 2MSPS. Разрядность 16 бит. Способы связи с АЦП - SPI, параллельная передача 16 бит, параллельная передача 8 бит за 2 такта (с помощью вывода BYTESWAP).

SPI работает медленно. SCLK до 9МГц. А надо 32 минимум. Есть SSP совместимый с SPI, но там тоже максимум 30МГц. И работать с прерываниями попробовал. Под RTOS работают очень медленно. Поэтому решил последовательными интерфейсами не пользоваться, а использовать опрос GPIO.

В общем-то все.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:40
Рейтинг@Mail.ru


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