TTTTTTS 0 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба Здраствуйте! есть плата от WaveShare с МК STM32F746IGT6, в процессе изучения написал такой код ;Включаем системный бит TRCENA MOV32 R0, SCB_DEMCR LDR R1, [R0] ORR R1, #(1 << 24) STR R1, [R0] ;снимаем блокировку MOV32 R0, DWT_LAR MOV32 R1, #0xC5ACCE55 STR R1, [R0] ;очищаем счетчик CYCCNT MOV32 R5, DWT_CYCCNT STR R10, [R5] ;Разрешаем DWT MOV32 R0, DWT_CTRL LDR R1, [R0] ORR R1, R11 ;в нулевой бит CYCCNTENA регистра DWT_CTRL записываем 1. тем самым STR R1, [R0] ;включаем счетчик CYCCNT, запускаем его NOP ;1 5 NOP ;2 5 NOP ;3 6 NOP ;4 5 NOP ;5 10 NOP ;6 10 NOP ;7 11 NOP ;8 11 NOP ;9 12 NOP ;10 12 NOP ;11 13 NOP ;12 13 NOP ;13 14 NOP ;14 14 NOP ;15 15 NOP ;16 15 NOP ;17 25 NOP ;18 25 NOP ;19 26 LDR R3, [R5] расшифрую колонку с нопами, писался один ноп, МК прошивался, на дисплее который подключен к МК я видел значение счетчика CYCCNT, в комментариях напротив нопа записывал номер нопа и число которое выводилось на дисплей- значение CYCCNT. И так по кругу. Например при 19 нопах значение CYCCNT = 26. Явно видна нелинейность значений. С чем это может быть связано и как это побороть? Может быть кто-то у кого есть подобный МК прогонит мой код на своем МК хотя бы в нескольких точках, например что покажет у Вас CYCCNT при 19 нопах спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 32 минуты назад, TTTTTTS сказал: Явно видна нелинейность значений. Я не работал с F7xx, но даже у более младших чтение кода из флеша занимает какое-то время. И для его уменьшения ширина шины флеша сделана гораздо больше ширины шины команд (т.е за один раз читается сильно больше одной команды), на кристалле есть ускоритель флеша, буфер упреждаюего чтения (prefetch) и тому подобые навороты. И все они по-умолчанию выключены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TTTTTTS 0 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба непонятно мне, ну хорошо, нет линейного соответсвия между количеством исполняемых команд и значением счетчика, как работать то теперь с этим счетчиком, стоит ли ему доверять или нет? 16 нопов - CYCCNT = 15, а 17 нопов CYCCNT равен уже 25 а кто то там еще строит задержки на нопах.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 31 минуту назад, TTTTTTS сказал: непонятно мне Флеш настойте, включите ускороитель, упреждающую выборку и вообще раздел про флеш почитайте в руководстве пользователя. И про кэш. Многое станет понятным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 23 minutes ago, TTTTTTS said: непонятно мне, ну хорошо, нет линейного соответсвия между количеством исполняемых команд и значением счетчика, как работать то теперь с этим счетчиком, стоит ли ему доверять или нет? Счётчик нормальный, нет причин его подозревать. Откуда вы взяли, что инструкции должны исполняться ритмично - непонятно, вам все уже написали, что этого нет и не будет. Инструкции исполняются предсказуемо только на стареньких тихоходных МК, причём, как правило, восьмиразрядных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TTTTTTS 0 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба раз так, то получается что сдвинув измеряемый участок кода вверх или вниз относительно всего кода, или переместив его в другое место, мы получим в каждом случае разные значения счетчика CYCCNT . несмотря на то что код по прежнему один и тот же. выходит что показания счетчика корректны для некоторого участка кода только здесь и сейчас, переместил код и значение иное Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба Да, так и есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 4 hours ago, TTTTTTS said: С чем это может быть связано и как это побороть? Вопрос, а нужно ли бороть. DWT показывает абсолютное время, ибо щелкает четко с тактом процессора. Разве не это нужно? - измерить время от и до. Делать задержки, исходя из предположения, что NOPы однозначно отражают такт процессора, - путь явно ошибочный ввиду строения процессоров (кэши, prefetch, предсказательное ветвление, хотя это уже не NOP). А еще есть прерывания. Они могут прервать линейку NOP, и все будет насмарку. Хотите точное время - используйте таймеры. Не получается и так? Используйте внешнюю времязадающую периферию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TTTTTTS 0 3 мая, 2019 Опубликовано 3 мая, 2019 (изменено) · Жалоба 1 час назад, KnightIgor сказал: Хотите точное время - используйте таймеры. Да нет, собственно я хотел узнать сколько же реально времени у меня занимает доступ к SDRAM, ибо подключить то я ее подключил, но хотелось бы чтобы все работало быстро, а я не уверен что все сделал оптимально. хотел вносить изменения в настройки FMC и с помощью счетчика CYCCNT следить за результатом вот сейчас у меня чтение из SDRAM занимает в среднем 100нС, это при том что ядро тактируется на 200МГц, а на SDRAM- 100МГц Изменено 3 мая, 2019 пользователем TTTTTTS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 2 часа назад, TTTTTTS сказал: вот сейчас у меня чтение из SDRAM занимает в среднем 100нС, это при том что ядро тактируется на 200МГц, а на SDRAM- 100МГц Для измерения скорости чтения SDRAM читают большой блок, измеряют время его чтения и делят на число слов в блоке. Что-то оценивать по одному чтению - путь ошибочный в самой своей основе. Это уже не говоря о том, что доступ к SDRAM осуществляется обычно пакетно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TTTTTTS 0 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба Собственно, похожим образом я и сделал. Читал правда не очень большой блок, но блок Пробовал разные режимы, единственное что помогло это изменил CAS с 3 на 2. В среднем сейчас выходит 95 нС. Все пляски с RBURST и RPIPE ни к чему не привели, как было 95нС так и осталось. Какие мысли у меня, память 16 битная, по всей видимости AHB как и написано в референсе разбивает 32битные обращения на 2 последовательных. Тогда 1 обращение в районе 45 нС по длительности выходит 1такт на сдрам 10нС отсюда: CAS 2 такта + tRSD 2 такта уже 40нС Другой вопрос почему-то не работает пакетное чтение и FIFO в микроконтроллере и еще, незнаю должно быть так или нет, но обращаться к памяти у меня выходит только по адресам выровненным на 32бита, в других случаях выкидывает в хардфаулт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 5 минут назад, TTTTTTS сказал: и еще, незнаю должно быть так или нет, но обращаться к памяти у меня выходит только по адресам выровненным на 32бита, в других случаях выкидывает в хардфаулт А к внутренней ОЗУ невыравненные обращения работают? Если да - значит что-то не так проинициализировали в контроллере внешней шины/SDRAM. Если нет - значит у вас в ядре Cortex-M выключен невыровненный доступ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 12 minutes ago, TTTTTTS said: обращаться к памяти у меня выходит только по адресам выровненным на 32бита Адресация в sdram не кратна внешним данным, младший адрес равен всей ширине данных на интерфейсе чипа. А там может быть 2-4-8-16-32 бита. Чтение всегда выполняется в полном физическом варианте, и уже на мк обрезается лишнее. Для записи есть внешние сигналы nbl1-nbl4, которые "выключают" неиспользуемые данные - чтобы не изменить чего лишнего. С большой вероятностью они у вас не используются. Пакетное чтение включено по умолчанию, для выключения нужна магия из доков на чип памяти. Некоторые производители чипов инопланетяне, у них не так как у всех. Вся настройка производится через линию адреса, которая должна быть распаяна полностью, не смотря на якобы "лишние" линии. Потом их можно освободить если очень хочется. И да, первое обращение к произвольному адресу - самое длительное. Но потом оно ограничено только тактовой частотой чипа (в пределах одной страницы). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TTTTTTS 0 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба В общем поэксперементировал я еще, как упоминал память SDRAM 16 битная. В ходе экспериментов выяснил, если писать/читать в память по байту (LDRB, STRB) , то обращаться можно к любому адресу SDRAM. если по пол слова (LDRH, STRH), то только к адресам выравненным на пол слова, если адрес не выравнен- то хардфаулт, аналогично ведет себя МК если писать/читать в SDRAM словами обращение к внутренней SRAM по невыравненным адресам не вызыват хардфаулта честно говоря, я незнаю как должна вести себя правильно SDRAM да еще в связке с контроллером МК Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 4 мая, 2019 Опубликовано 4 мая, 2019 · Жалоба 11 часов назад, TTTTTTS сказал: честно говоря, я незнаю как должна вести себя правильно SDRAM да еще в связке с контроллером МК Полагаю, в руководстве пользователя это должно быть описано. Или читать документацию - это для слабых? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться