Jump to content

    

счетчик DWT - аритмия

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

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

спасибо

Share this post


Link to post
Share on other sites
32 минуты назад, TTTTTTS сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

 

Share this post


Link to post
Share on other sites
31 минуту назад, TTTTTTS сказал:

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

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

Share this post


Link to post
Share on other sites
23 minutes ago, TTTTTTS said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Да, так и есть.

Share this post


Link to post
Share on other sites
4 hours ago, TTTTTTS said:

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, KnightIgor сказал:

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

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

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

Edited by TTTTTTS

Share this post


Link to post
Share on other sites
2 часа назад, TTTTTTS сказал:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites
5 минут назад, TTTTTTS сказал:

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

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

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

Share this post


Link to post
Share on other sites
12 minutes ago, TTTTTTS said:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

Share this post


Link to post
Share on other sites
11 часов назад, TTTTTTS сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this