mantech 53 19 сентября, 2014 Опубликовано 19 сентября, 2014 · Жалоба День добрый. Программирую проц под иаром, вроде все ок, но решил проверить, насколько быстр данный проц, и вот тут меня постигло недоумение... Задал я простой тестик, счетчик, который прибавляется на 1 пока идет 1 сек, без оптимизации и т.п. Итого, на А5, на который идет тактировка 500!!! МГц, счетчик насчитал около 2000000. В отладке посмотрел, на прибавление 1 и выполнения while с условием, выполняется 10 асмовских команд. Итого получаем черепашью скорость, если так мягко выразиться Для примера запустил тоже самое на стм32f407 на 160МГц результат был в 6 раз больше... Может у кого есть светлые мысли, или там еще каких-нить делителей понапичкали... Вот код инициализации void SystemInit(void) { CCM->CLPCR &= ~CCM_CLPCR_FXOSC_PWRDWN_MASK; while(!(CCM_CSR_FXOSC_RDY_MASK & CCM->CSR)); CCM->CCSR |= CCM_CCSR_FAST_CLK_SEL_MASK; // using PLL1 PFD3 //Enable CCM, SRC, and more CCM->CCGR4 |= CCM_CCGR4_CG10(1); // WKPU ungate CCM->CCGR4 |= CCM_CCGR4_CG11(1); // CCM ungate CCM->CCGR4 |= CCM_CCGR4_CG12(1); // GPC ungate CCM->CCGR4 |= CCM_CCGR4_CG14(1); // SRC ungate CCM->CCGR3 |= CCM_CCGR3_CG0(1); // ANADIG ungate //Enable IOMUX CCM->CCGR2 |= CCM_CCGR2_CG8(1); // IOMUX Controller ungate CCM->CCGR2 |= CCM_CCGR2_CG9(1); // Port A Controller ungate CCM->CCGR2 |= CCM_CCGR2_CG10(1); // Port B Controller ungate CCM->CCGR2 |= CCM_CCGR2_CG11(1); // Port C Controller ungate CCM->CCGR2 |= CCM_CCGR2_CG12(1); // Port D Controller ungate CCM->CCGR2 |= CCM_CCGR2_CG13(1); // Port E Controller ungate /* enable PLLs in Anadig */ ANADIG->PLL1_CTRL=0x00002001; while(!(ANADIG_PLL1_CTRL_LOCK_MASK & ANADIG->PLL1_CTRL));//wait until lock ANADIG->PLL2_CTRL=0x00002001; while(!(ANADIG_PLL2_CTRL_LOCK_MASK & ANADIG->PLL2_CTRL));//wait until lock ANADIG->PLL4_CTRL=0x00002031; //PLL4 while(!(ANADIG_PLL4_CTRL_LOCK_MASK & ANADIG->PLL4_CTRL));//wait until lock ANADIG->PLL5_CTRL=0x00002001; //PLL5 while(!(ANADIG_PLL5_CTRL_LOCK_MASK & ANADIG->PLL5_CTRL));//wait until lock ANADIG->PLL6_CTRL=0x00002028; //PLL6 while(!(ANADIG_PLL6_CTRL_LOCK_MASK & ANADIG->PLL6_CTRL));//wait until lock //Use 500MHz CA5, 400 MHz DDR(async), 166MHz CM4, and 83MHz bus (PFD1=500MHz) //CCM->CCSR=0x0001FF24; //PLL1 uses PLL1_PFD3, enable all PLL1 and PLL2, select Fast Clock, and sys_clock_sel use PLL1 CCM->CCSR=0x0001FF24; //PLL1 uses PLL1_PFD3, enable all PLL1 and PLL2, select Fast Clock, and sys_clock_sel use PLL1 CCM->CACRR=0x00000810; //ARM_DIV=0 (div by 1), BUS_DIV=2 (div by 3), ipg_div value is 1 (div by 2) } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 21 сентября, 2014 Опубликовано 21 сентября, 2014 · Жалоба Откуда программа выполняется, DDR? Кэш включен? какой тип данных используете для счетчика, uint32_t? если одна итерация выполняется быстрее чем 0,23нс (с кешем вполне реально) возможно переполнение переменной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 21 сентября, 2014 Опубликовано 21 сентября, 2014 · Жалоба Откуда программа выполняется, DDR? Кэш включен? какой тип данных используете для счетчика, uint32_t? если одна итерация выполняется быстрее чем 0,23нс (с кешем вполне реально) возможно переполнение переменной. Кэш, который L1 включен, в L2 смысла не вижу - прога выполняется в статической памяти. Переполнение 32х битной переменной?? Этож больше 2 миллиардов итераций должно быть!!! У этого проца если 400лимонов будет - уже праздник Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 23 сентября, 2014 Опубликовано 23 сентября, 2014 · Жалоба День добрый. Программирую проц под иаром, вроде все ок, но решил проверить, насколько быстр данный проц, и вот тут меня постигло недоумение... Задал я простой тестик, счетчик, который прибавляется на 1 пока идет 1 сек, без оптимизации и т.п. Итого, на А5, на который идет тактировка 500!!! МГц, счетчик насчитал около 2000000. В отладке посмотрел, на прибавление 1 и выполнения while с условием, выполняется 10 асмовских команд. Итого получаем черепашью скорость, если так мягко выразиться Для примера запустил тоже самое на стм32f407 на 160МГц результат был в 6 раз больше... Может у кого есть светлые мысли, или там еще каких-нить делителей понапичкали... Надо бы ещё записать MFD = 0x12 в ANADIG_PLL1_DENOM и PFD3 = 0x13 в ANADIG_PLL1_PFD. Ещё обратите внимание, что Freescale рекомендует использовать для 500 MHz PFD1, а не PFD3 (см. раздел 9.6.1.1 в Rev.5 мануала на Vybrid). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 23 сентября, 2014 Опубликовано 23 сентября, 2014 · Жалоба рекомендует использовать для 500 MHz PFD1, а не PFD3 Я в курсе, там и задан первый делитель, а не 3й, просто коммент не поправил. 3й для частоты 400мег. В М4 были действительно выключены кэши, когда подключил, стало значительно быстрее, соизмеримо с стм407, НО только для частоты 132мег. Затем я сменил делитель, на 1й, должно стать 500 на А5 и 166 на М4, однако скорость М4 осталась прежней, что с кэшем, что без,т.е или его частота не поменялась, что странно, т.к. частота шины с 66 возросла до 83мег. проверял по уарту принастройке скорости... С А5 пока все так-же тоскливо, включение кэша дало прирост, но небольшой. Единственное, в проце есть бутлоадер, который стартует первым, затем загружает в память и пускает прогу, т.е линукс, который во флешке. У меня же прогу загружает jlink, может тет дело, или скорость статики выбирать нужно, только где?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 24 сентября, 2014 Опубликовано 24 сентября, 2014 · Жалоба Я в курсе, там и задан первый делитель, а не 3й, просто коммент не поправил. 3й для частоты 400мег. А чему у Вас равен PFD1_FRAC в ANADIG_PLL1_PFD? Какой partnumber у Вашего проца? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 24 сентября, 2014 Опубликовано 24 сентября, 2014 · Жалоба А чему у Вас равен PFD1_FRAC в ANADIG_PLL1_PFD? Какой partnumber у Вашего проца? Проц - MVF61NN151CMK50 Значение из регистра- 0x9CBB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 24 сентября, 2014 Опубликовано 24 сентября, 2014 · Жалоба Значение из регистра- 0x9CBB Здесь где-то ошибка. Если ANADIG_PLL1_PFD = 0x9CBB, то это значит PFD1_CLKGATE = 1, т.е. PFD1 отключен. Кроме того, чтобы получить PFD1 = 500 MHz, надо чтобы PFD1_FRAC = 0x13. А чему у Вас равны ANADIG_PLL1_NUM и ANADIG_PLL1_DENOM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 24 сентября, 2014 Опубликовано 24 сентября, 2014 (изменено) · Жалоба Здесь где-то ошибка. Если ANADIG_PLL1_PFD = 0x9CBB, то это значит PFD1_CLKGATE = 1, т.е. PFD1 отключен. Кроме того, чтобы получить PFD1 = 500 MHz, надо чтобы PFD1_FRAC = 0x13. А чему у Вас равны ANADIG_PLL1_NUM и ANADIG_PLL1_DENOM? прочиталось - PLL1_NUM = 0 PLL1_DENOM = 0x16 Здесь где-то ошибка. Если ANADIG_PLL1_PFD = 0x9CBB, Да фиг знает, перед инициализацией pll выполняется команда - ANADIG_PLL1_PFD =0x13; Почему такой результат незнаю... И еще, пользуясь случаем, может подскажете, как залить бинарники во флешку на плате, я так понимаю, надо использовать mfgtools, но надо делать конфиг... Может есть что по данному поводу? ЗЫ. Не знаю поможет это в моем вопросе или нет, решил посмотреть, сколь насчитает мне global timer за 1 сек, вообщем результат 1 177 600 000. Последние цифры "прыгают", но как-то так. Вопрос - какой частотой он тактируется, по прикидкам - частота pll1 *2 Изменено 24 сентября, 2014 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 25 сентября, 2014 Опубликовано 25 сентября, 2014 · Жалоба прочиталось - PLL1_NUM = 0 PLL1_DENOM = 0x16 Это правильно. Да фиг знает, перед инициализацией pll выполняется команда - ANADIG_PLL1_PFD =0x13; Почему такой результат незнаю... Видимо, кто-то портит содержимое этого регистра. Это Вам надо чинить. И еще, пользуясь случаем, может подскажете, как залить бинарники во флешку на плате, я так понимаю, надо использовать mfgtools, но надо делать конфиг... Может есть что по данному поводу? Мы заливаем через Jlink. MFGtool пока не используем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 25 сентября, 2014 Опубликовано 25 сентября, 2014 · Жалоба Мы заливаем через Jlink. В смысле, во флешку? Каким образом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 26 сентября, 2014 Опубликовано 26 сентября, 2014 · Жалоба В смысле, во флешку? Каким образом? Есть два варианта: через Jlink записываем uboot во внутреннюю SRAM проца. Запускаем uboot. Затем из uboota копируем через Ethernet имидж для внешней NAND Flash, который лежит на РС, собственно в NAND Flash. Второй вариант - записать через Jlink имидж для NAND Flash во внутреннюю SRAM проца (имидж включает uboot). Запускаем uboot. Затем из uboota записываем имидж для внешней NAND Flash из внутренней SRAM собственно в NAND Flash. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 26 сентября, 2014 Опубликовано 26 сентября, 2014 · Жалоба Есть два варианта: Ммм да, я думал это как-то проще, и без убутов. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 28 сентября, 2014 Опубликовано 28 сентября, 2014 · Жалоба mantech, удалось нормально оценить производительность? Хотя бы относительно стм32f407? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 29 сентября, 2014 Опубликовано 29 сентября, 2014 · Жалоба mantech, удалось нормально оценить производительность? Хотя бы относительно стм32f407? Пока только у М4 стала равна стм, с А5 пока все так же уныло... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться