Изменение подтягивающих / понижающих резисторов для выводов 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, поскольку доступ к оперативной памяти отсутствует) или инструкцию ISB в цикл? Может ли это предотвратить эффект бегства при включении кешей?