|
Почему с PowerPac код работает быстрее, чем просто на Cи? |
|
|
|
Nov 29 2010, 14:19
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Nov 30 2010, 10:01
|

Местный
  
Группа: Участник
Сообщений: 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МГц.
|
|
|
|
|
Nov 30 2010, 10:07
|

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

|
Цитата(kolobochishe @ Nov 30 2010, 13:01)  Добавил цикл задержки. Инкремент до 70 в цикле for. Результат оказался гораздо больше. Хотя должно быть 1-2мкс. Все же не проходит ощущение, что работает контроллер совсем не на 72МГц. На самом деле есть ещё задержки чтения флеши (если программа работает не из RAM) Плюс, каждый переход сбрасывает конвейер, что тоже сильно влияет (команды выполняются не за 1 такт). Ну а что происходит в действительности - очень просто посмотреть в листинге, и к гадалке ходить не надо.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Nov 30 2010, 14:21
|

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

|
Я, конечно, [пока] не спец по АРМовой периферии, но вот это Цитата FIO4PIN3_bit.P4_0= ~FIO4PIN3_bit.P4_0; //Дергаем ножкой как-то странно смотрится... Там же вроде напрямую можно ставить/сбрасывать биты, без предварительного чтения. А так понятно - прочитали - модифицировали - записали, и всё это через тормознутый GPIO интерфейс Так что можно при желании ещё х2 частоту поднять Ну а дальше - анролл циклов для оптимизации конвейера
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Dec 1 2010, 04:38
|

Местный
  
Группа: Участник
Сообщений: 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 занимает много времени, поэтому предпочел инвертировать прочитанное значение, а не создавать отдельную переменную.
|
|
|
|
|
Dec 1 2010, 09:53
|
.
     
Группа: Участник
Сообщений: 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; //Дергаем ножкой }
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Dec 1 2010, 14:01
|

Местный
  
Группа: Участник
Сообщений: 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. В общем-то все.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|