Я думаю, что это может быть не лучший способ реализации задержки, поскольку вы полностью полагаетесь на знание времени, которое требуется для выполнения пары инструкций (sub, b), и это может изменяться в разных режимах работа и т.д. и т.п.
Я думаю, вы можете попробовать два различных варианта, которые будут действительны для любых условий эксплуатации, и как мне кажется, являются более надежными, чем ваш подход:
- Насыщенная ожидания: Получите значение текущего системного таймера на входе (t0). Loop. На каждой итерации сравните счетчик, и если он больше ожидаемого значения системного таймера (t0 + time_you_want_to_wait_in_secs · ticks/sec), верните его.
- Процедура прерывания: установите прерывание таймера, чтобы вы могли делать другие вещи, ожидая вашего правильного времени.
У вас есть вся информация о направлениях памяти, в которой вы получите значения системного таймера в BCM2835 datasheet.
В любом случае, я намерен просто попытаться указать другой набор решений, чтобы вы могли исследовать их, если хотите. Вышеуказанные ответы являются хорошими для вашего конкретного кода, я думаю, ^^.
Я имею в виду, что это означает, что subs + bne нуждается в 50 nop циклах перед следующим subs + bne, кажется, это слишком много? – user1735225
У вас включен кеш? Инструкции могут занимать более одного цикла, особенно если они являются ветвями. Кроме того, вам, возможно, придется настроить системные часы для работы на частоте 700 МГц; это просто означает, что он способен быстро работать. Он может не загружаться с такой скоростью. –
Какова была стоимость, с которой вы начали, в основном, сколько раз в этом цикле вы ожидаете. это сложный цикл, который вы обманываете, он не будет даже удаленно близок к 700 МГц даже с очень быстрой памятью или кешем l1. и он будет только замедляться оттуда. Это очень плохой способ сделать задержку, отлично работает на некоторых/более старых микроконтроллерах, где время выполнения немного детерминировано, но здесь это не будет работать. –