Перейти к содержанию
    

Здраствуйте!

есть плата от 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 нопах

спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 минуты назад, TTTTTTS сказал:

Явно видна нелинейность значений.

Я не работал с F7xx, но даже у более младших чтение кода из флеша занимает какое-то время. И для его уменьшения ширина шины флеша сделана гораздо больше ширины шины команд (т.е за один раз читается сильно больше одной команды), на кристалле есть ускоритель флеша, буфер упреждаюего чтения (prefetch) и тому подобые навороты. И все они по-умолчанию выключены.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

непонятно мне, ну хорошо, нет линейного соответсвия  между количеством исполняемых команд и значением счетчика, как работать то теперь с этим счетчиком, стоит ли ему доверять или нет?

16 нопов - CYCCNT = 15, а 17 нопов  CYCCNT равен уже 25

 

а кто то там еще строит задержки на нопах..

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 минуту назад, TTTTTTS сказал:

непонятно мне

Флеш настойте, включите ускороитель, упреждающую выборку и вообще раздел про флеш почитайте в руководстве пользователя. И про кэш. Многое станет понятным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, TTTTTTS said:

непонятно мне, ну хорошо, нет линейного соответсвия  между количеством исполняемых команд и значением счетчика, как работать то теперь с этим счетчиком, стоит ли ему доверять или нет?

Счётчик нормальный, нет причин его подозревать. Откуда вы взяли, что инструкции должны исполняться ритмично - непонятно, вам все уже написали, что этого нет и не будет. Инструкции исполняются предсказуемо только на стареньких тихоходных МК, причём, как правило, восьмиразрядных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

раз так, то получается что сдвинув измеряемый участок кода вверх или вниз относительно всего кода, или переместив его в другое место, мы получим в каждом случае разные значения счетчика CYCCNT . несмотря на то что код по прежнему один и тот же. выходит что показания счетчика корректны для некоторого участка кода только здесь и сейчас, переместил код и значение иное

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, TTTTTTS said:

С чем это может быть связано и как это побороть?

Вопрос, а нужно ли бороть.

DWT показывает абсолютное время, ибо щелкает четко с тактом процессора. Разве не это нужно? - измерить время от и до. Делать задержки, исходя из предположения, что NOPы однозначно отражают такт процессора, - путь явно ошибочный ввиду строения процессоров (кэши, prefetch, предсказательное ветвление, хотя это уже не NOP). А еще есть прерывания. Они могут прервать линейку NOP, и все будет насмарку. Хотите точное время - используйте таймеры. Не получается и так? Используйте внешнюю времязадающую периферию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, KnightIgor сказал:

Хотите точное время - используйте таймеры.

Да нет, собственно я хотел узнать сколько же реально времени у меня занимает доступ к SDRAM, ибо подключить то я ее подключил, но хотелось бы чтобы все работало быстро, а я не уверен что все сделал оптимально. хотел вносить изменения в настройки FMC и с помощью счетчика  CYCCNT следить за результатом

вот сейчас у меня чтение из SDRAM занимает в среднем 100нС, это при том что ядро тактируется на 200МГц, а на SDRAM- 100МГц

Изменено пользователем TTTTTTS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, TTTTTTS сказал:

вот сейчас у меня чтение из SDRAM занимает в среднем 100нС, это при том что ядро тактируется на 200МГц, а на SDRAM- 100МГц

Для измерения скорости чтения SDRAM читают большой блок, измеряют время его чтения и делят на число слов в блоке. Что-то оценивать по одному чтению - путь ошибочный в самой своей основе.

Это уже не говоря о том, что доступ к SDRAM осуществляется обычно пакетно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно, похожим образом я и сделал. Читал правда не очень большой блок, но блок

Пробовал разные режимы, единственное что помогло это изменил CAS с 3 на 2. В среднем сейчас выходит 95 нС.

Все пляски с RBURST и RPIPE  ни к чему не привели, как было 95нС так и осталось.

Какие мысли у меня, память 16 битная, по всей видимости AHB как и написано в референсе разбивает 32битные обращения на 2 последовательных. Тогда 1 обращение в районе 45 нС по длительности выходит

1такт на сдрам 10нС отсюда:  CAS  2 такта + tRSD 2 такта уже 40нС

 

Другой вопрос почему-то не работает пакетное чтение и FIFO в микроконтроллере

и еще, незнаю должно быть так или нет, но обращаться к памяти у меня выходит только по адресам выровненным на 32бита, в других случаях выкидывает в хардфаулт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, TTTTTTS сказал:

и еще, незнаю должно быть так или нет, но обращаться к памяти у меня выходит только по адресам выровненным на 32бита, в других случаях выкидывает в хардфаулт

А к внутренней ОЗУ невыравненные обращения работают?

Если да - значит что-то не так проинициализировали в контроллере внешней шины/SDRAM. Если нет - значит у вас в ядре Cortex-M выключен невыровненный доступ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, TTTTTTS said:

обращаться к памяти у меня выходит только по адресам выровненным на 32бита

Адресация в sdram не кратна внешним данным, младший адрес равен всей ширине данных на интерфейсе чипа. А там может быть 2-4-8-16-32 бита. Чтение всегда выполняется в полном физическом варианте, и уже на мк обрезается лишнее. Для записи есть внешние сигналы nbl1-nbl4, которые "выключают" неиспользуемые данные - чтобы не изменить чего лишнего. С большой вероятностью они у вас не используются.

Пакетное чтение включено по умолчанию, для выключения нужна магия из доков на чип памяти. Некоторые производители чипов инопланетяне, у них не так как у всех. Вся настройка производится через линию адреса, которая должна быть распаяна полностью, не смотря на якобы "лишние" линии. Потом их можно освободить если очень хочется.

И да, первое обращение к произвольному адресу - самое длительное. Но потом оно ограничено только тактовой частотой чипа (в пределах одной страницы).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем поэксперементировал я еще, как упоминал память SDRAM 16 битная. В ходе экспериментов выяснил, если писать/читать в память по байту (LDRB, STRB) , то обращаться можно к любому адресу SDRAM.

если по пол слова (LDRH, STRH), то только к адресам выравненным на пол слова, если адрес не выравнен- то хардфаулт, аналогично ведет себя МК если писать/читать в SDRAM словами

обращение к внутренней SRAM по невыравненным адресам не вызыват хардфаулта

честно говоря, я незнаю как должна вести себя правильно SDRAM да еще в связке с контроллером МК

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, TTTTTTS сказал:

честно говоря, я незнаю как должна вести себя правильно SDRAM да еще в связке с контроллером МК

Полагаю, в руководстве пользователя это должно быть описано. Или читать документацию - это для слабых?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...