VladislavS 39 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба ? 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 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> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба GCC. Оптимизация O3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 222 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 1 час назад, AlexKai сказал: я с AVR-ов перебираюсь) там такой код вопросов не вызывает Любой код с обсуждением тактов выполнения без ассемблерного листинга должен вызывать вопросы. На любом ядре. Ибо не си-строки выполняются на процессоре, а ассемблерные инструкции. Без листинга разговор о тактах - пустой разговор. Ищите где включается генерация листинга в вашем компиляторе. Без листинга - только гадание на кофейной гуще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба GCC не умеет генерировать листинги, как вы в IAR привыкли. Более менее что-то видно только под отладкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 2 minutes ago, VladislavS said: Более менее что-то видно только под отладкой. objdump'ом легко генерируются нормальные листинги. 11 minutes ago, VladislavS said: GCC. Оптимизация O3. Воспроизвел. Пришлось вынести delay в другой модуль и выключить lto. Так что это, скорее, недоработка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 21 минуту назад, aaarrr сказал: objdump'ом легко генерируются нормальные листинги. Без обид, но это трудно назвать нормальными листингами. Вот, например, как IAR выдаёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 20 minutes ago, VladislavS said: Без обид, но это трудно назвать нормальными листингами. Вот, например, как IAR выдаёт. И чем это лучше? Вот случился, положим, HF по адресу 8000ac0 - где его искать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 18 минут назад, aaarrr сказал: Вот случился, положим, HF по адресу 8000ac0 - где его искать? Я уже уехал от компа, но поверьте, посмотреть что по адресу 8000ac0 никаких проблем не вызывает. Точно так же код с адресами получить не вопрос. А вот как objdump вставляет исходный код в листинг, да ещё из релизной сборки без отладочной информации, можете показать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 3 minutes ago, VladislavS said: поверьте, посмотреть что по адресу 8000ac0 никаких проблем не вызывает По картинке этого не скажешь. 4 minutes ago, VladislavS said: из релизной сборки без отладочной информации, можете показать А смысл убирать отладочную информацию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 2 минуты назад, aaarrr сказал: По картинке этого не скажешь. Я же говорю, с адресами не вопрос. ЗЫ: Надеюсь, ТС увидел, пока мы тут пиписьками листингами меряемся, куда его 10 тактов делись? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 222 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба 2 часа назад, aaarrr сказал: И чем это лучше? Вот случился, положим, HF по адресу 8000ac0 - где его искать? Проще конечно подключиться отладчиком и посмотреть этот адрес. Но если такой возможности нет, то ничего страшного: Берём .map-файл; находим внутрь какой функции попадает этот адрес; вычисляем смещение этого адреса относительно начала функции; находим нужную инструкцию функции (в .lst-файле левее мнемоник идёт столбец смещений, просто VladislavS его обрезал). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 30 ноября, 2020 Опубликовано 30 ноября, 2020 · Жалоба Ничего я не обрезал! IAR генерит .s и .lst - у них разное содержимое. Смотря что вам надо. Для изучения что там наделал компилятор удобнее первое. Для поиска ошибок, нет, не второе, а действительно отладчик, раз уже до HF дошло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 1 декабря, 2020 Опубликовано 1 декабря, 2020 (изменено) · Жалоба 11 часов назад, AlexKai сказал: я с AVR-ов перебираюсь) там такой код вопросов не вызывает Добрый день! На AVR вы использовали, скорее всего, что-нибудь типа delay_ms из какой-нибудь бибилиотеки, которая действительно давала более-менее адекватную задержку. Но внутри этой функции находился выверенный ассемблерный код. Здесь вам нужно сделать то же самое. Хотя я не сторонник делать программные задержки программным способом на армах. На мой взгляд использовать для этого аппаратный таймер куда более удобно. Но если хотите именно программно, то добро пожаловать в мир ассемблерных инструкций. Смотрите сколько тактов выполняется необходимая, и конструируете свою задержку. При этом следут обращать внимание с какой частотой тактируется память в которой находится переменная (скорее всего это будет регистр) и в которой выполняется код, также не стоит вниманием обходить выполняемые прерывания, если они есть в системе. Изменено 1 декабря, 2020 пользователем MrBearManul Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 декабря, 2020 Опубликовано 1 декабря, 2020 · Жалоба 6 hours ago, jcxz said: Но если такой возможности нет, то ничего страшного: Берём .map-файл; находим внутрь какой функции попадает этот адрес; вычисляем смещение этого адреса относительно начала функции; находим нужную инструкцию функции (в .lst-файле левее мнемоник идёт столбец смещений, просто VladislavS его обрезал). Удобно прям как! (На деле, конечно, не особо страшно, если нужно один адрес посмотреть). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться