Смяната на издърпващите резистори нагоре/надолу за GPIO пинове на Raspberry Pi изисква изчакване за 150 цикъла след активиране и дезактивиране на часовниковия сигнал според спецификациите. Да го правите малко по-дълго не боли, но използването на таймер за изчакване е по-дълго с величини, така че не искам да го правя. Така че имам този прост зает цикъл:
for (int i = 0; i < 150; ++i) { asm volatile (""); }
0: e3a03096 mov r3, #150 ; 0x96
4: e2533001 subs r3, r3, #1
8: 1afffffd bne 4 <foo+0x4>
Това зацикля 150 пъти, изпълнявайки 300 инструкции. Без кеширане на инструкции и без предвиждане на разклонения това със сигурност е повече от 150 цикъла. Но след като те бъдат включени, този цикъл работи много по-бързо, по-бързо от 150 цикъла, мисля.
И така, как да изчакам близо 150 цикъла със или без кеширане на инструкции и активирано предвиждане на разклонения? Забележка: в най-лошия случай това може да са 2 функции, delay_no_cache() и delay_cache()
Това не е дубликат на Как да забавите ARM Cortex M0+ за n цикъла, без таймер? тъй като кешът на инструкциите и предвиждането на разклонения напълно хвърлят времето. Времето също се различава между Raspberry Pi (ARMv6) и Raspberry Pi2 (ARMv7).
Някой знае ли времето за изпълнение (със и без кеш), ако някой би вмъкнал DMB, DSB (предполагам, че това биха били NOP, тъй като няма достъп до ram) или ISB инструкция в цикъла? Това ще предотврати ли ефекта на бягство, когато кешовете са активирани?