Вот кусок с дизассемблерра получил из eclipsa запустил приложение в qemu-system-arm
с выключенным icache:
i++;
003001d4: ldr r1, [sp, #4]
003001d8: add r1, r1, #1
003001dc: str r1, [sp, #4]
517 pio->PIO_CODR = mask;
003001e0: str r3, [r2, #-3531] ; 0xdcb
512 pio->PIO_SODR = mask;
003001e4: str r3, [r2, #-3535] ; 0xdcf
с включенным icache:
i++;
00300224: ldr r1, [sp, #4]
00300228: add r1, r1, #1
0030022c: str r1, [sp, #4]
517 pio->PIO_CODR = mask;
00300230: str r3, [r2, #-3531] ; 0xdcb
512 pio->PIO_SODR = mask;
00300234: str r3, [r2, #-3535] ; 0xdcf
этот же кусов в С:
i++;
003001d4: ldr r1, [sp, #4]
003001d8: add r1, r1, #1
003001dc: str r1, [sp, #4]
003001e0: str r3, [r2, #-3531] ; 0xdcb
512 pio->PIO_SODR = mask;
003001e4: str r3, [r2, #-3535] ; 0xdcf
Так что код в дизасемблере не меняется а вот в реале частота на ноге меняется
Поскажите как тут понять сколько тактов у меня занимает i++ который занимает три строки в асме?
003001d4: ldr r1, [sp, #4]
003001d8: add r1, r1, #1
003001dc: str r1, [sp, #4]
Цитата(Golikov A. @ Apr 24 2013, 18:27)

ну я на иарах и кейлах обычно сижу, кеил сам показывает дизасемблер не скрывая ничего, в ИАРе он виден если загрузил по жетагу или в режиме симулятора. В вашей среде нет симулятора? обычно там всегда к обычному коду еще он же в ассемблере добавлен, потому что иначе упаришся в бинарнике искать какой код за какие строки отвечает...
В общей теории кешей кусок кода отвечающий за дерганья ногами меняться не должен, изменениям подвергнется лишь скорость выбора инструкций из памяти. Хотя в код могут быть добавлены некоторые инструкции которые управляют кешированием нужных участков кода. Современные компиляторы иногда делают такие хитрые вещи при оптимизации кода, что никогда не знаешь что ты там увидишь в итоге

... Но учитывая малость участка кода, думаю он будет неизменен...
Тогда что там смотреть дизассемблером?
Сообщение отредактировал Sergey1212 - Apr 24 2013, 14:36