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

STM32F407 на частоте 168МГц код работает как на 16МГц (в 10 раз медленнее)

?

 

GCC. Оптимизация 0s

     5: void Delay(__IO uint32_t nCount)
     6: {
0x200003e8 82 B0                sub sp, #8 
0x200003ea 01 90                str r0, [sp, #4] 
     7: 	while(nCount--);
0x200003ec 01 9B                ldr r3, [sp, #4] 
0x200003ee 5A 1E                subs r2, r3, #1 
0x200003f0 01 92                str r2, [sp, #4] 
0x200003f2 00 2B                cmp r3, #0 
0x200003f4 FA D1                bne.n 0x200003ec <Delay(unsigned long)+4> 
0x200003f6 02 B0                add sp, #8 
0x200003f8 70 47                bx lr

 

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


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

6 minutes ago, VladislavS said:

?

Адрес. У регистра IO он есть, у nCount в данном примере его нет.

 

8 minutes ago, VladislavS said:

А ещё лучше посмотрите листинг.

С удовольствием:

volatile int cycles2 = 123;

void delay(volatile int cycles)
{
	while(cycles--);
	while(cycles2--);
}

	while(cycles--);
 8000820:	461a      	mov	r2, r3
 8000822:	3b01      	subs	r3, #1
 8000824:	2a00      	cmp	r2, #0
 8000826:	d1fb      	bne.n	8000820 <main+0x4>
 8000828:	4b5a      	ldr	r3, [pc, #360]	; (8000994 <main+0x178>)
	while(cycles2--);
 800082a:	681a      	ldr	r2, [r3, #0]
 800082c:	1e51      	subs	r1, r2, #1
 800082e:	6019      	str	r1, [r3, #0]
 8000830:	2a00      	cmp	r2, #0
 8000832:	d1fa      	bne.n	800082a <main+0xe>

 

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


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

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

я с AVR-ов перебираюсь) там такой код вопросов не вызывает

Любой код с обсуждением тактов выполнения без ассемблерного листинга должен вызывать вопросы. На любом ядре. Ибо не си-строки выполняются на процессоре, а ассемблерные инструкции. Без листинга разговор о тактах - пустой разговор. Ищите где включается генерация листинга в вашем компиляторе. Без листинга - только гадание на кофейной гуще.

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


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

GCC не умеет генерировать листинги, как вы в IAR привыкли. Более менее что-то видно только под отладкой.

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


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

2 minutes ago, VladislavS said:

Более менее что-то видно только под отладкой.

objdump'ом легко генерируются нормальные листинги.

 

11 minutes ago, VladislavS said:

GCC. Оптимизация O3.

Воспроизвел. Пришлось вынести delay в другой модуль и выключить lto. Так что это, скорее, недоработка.

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


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

21 минуту назад, aaarrr сказал:

objdump'ом легко генерируются нормальные листинги.

Без обид, но это трудно назвать нормальными листингами. Вот, например, как IAR выдаёт.

IAR_listing.thumb.png.75d696f1c603d43ea04f85b22731c6df.png

 

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


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

20 minutes ago, VladislavS said:

Без обид, но это трудно назвать нормальными листингами. Вот, например, как IAR выдаёт.

И чем это лучше? Вот случился, положим, HF по адресу 8000ac0 - где его искать?

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


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

18 минут назад, aaarrr сказал:

Вот случился, положим, HF по адресу 8000ac0 - где его искать?

Я уже уехал от компа, но поверьте, посмотреть что по адресу 8000ac0 никаких проблем не вызывает. Точно так же код с адресами получить не вопрос. А вот как objdump вставляет исходный код в листинг, да ещё из релизной сборки без отладочной информации, можете показать.

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


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

3 minutes ago, VladislavS said:

поверьте, посмотреть что по адресу 8000ac0 никаких проблем не вызывает

По картинке этого не скажешь.

 

4 minutes ago, VladislavS said:

из релизной сборки без отладочной информации, можете показать

А смысл убирать отладочную информацию?

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


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

2 минуты назад, aaarrr сказал:

По картинке этого не скажешь.

Я же говорю, с адресами не вопрос.

ЗЫ: Надеюсь, ТС увидел, пока мы тут пиписьками листингами меряемся, куда его 10 тактов делись?

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


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

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

И чем это лучше? Вот случился, положим, HF по адресу 8000ac0 - где его искать?

Проще конечно подключиться отладчиком и посмотреть этот адрес.

Но если такой возможности нет, то ничего страшного: Берём .map-файл; находим внутрь какой функции попадает этот адрес; вычисляем смещение этого адреса относительно начала функции; находим нужную инструкцию функции (в .lst-файле левее мнемоник идёт столбец смещений, просто VladislavS его обрезал).

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


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

Ничего я не обрезал!  IAR генерит .s и .lst - у них разное содержимое. Смотря что вам надо. Для изучения что там наделал компилятор удобнее первое. Для поиска ошибок, нет, не второе, а действительно отладчик, раз уже до  HF дошло.

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


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

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

я с AVR-ов перебираюсь) там такой код вопросов не вызывает

Добрый день! На AVR вы использовали, скорее всего, что-нибудь типа delay_ms из какой-нибудь бибилиотеки, которая действительно давала более-менее адекватную задержку. Но внутри этой функции находился выверенный ассемблерный код. Здесь вам нужно сделать то же самое. Хотя я не сторонник делать программные задержки программным способом на армах. На мой взгляд использовать для этого аппаратный таймер куда более удобно. Но если хотите именно программно, то добро пожаловать в мир ассемблерных инструкций. Смотрите сколько тактов выполняется необходимая, и конструируете свою задержку. При этом следут обращать внимание с какой частотой тактируется память в которой находится переменная (скорее всего это будет регистр) и в которой выполняется код, также не стоит вниманием обходить выполняемые прерывания, если они есть в системе.

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

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


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

6 hours ago, jcxz said:

Но если такой возможности нет, то ничего страшного: Берём .map-файл; находим внутрь какой функции попадает этот адрес; вычисляем смещение этого адреса относительно начала функции; находим нужную инструкцию функции (в .lst-файле левее мнемоник идёт столбец смещений, просто VladislavS его обрезал).

Удобно прям как! :biggrin: (На деле, конечно, не особо страшно, если нужно один адрес посмотреть).

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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