2013-12-11 4 views
0

Я попытался реализовать задержку на малине Pi, работающей в ASM. (Bare metal)ARM/Raspberry Pi asm delay

Но с моим кодом я набираю частоту 13,6 МГц или 13,6 млн. Под + бн в секунду, но почему это так, ядро ​​руки установлено в config.txt до 700 МГц.

__asm__ volatile ("1: subs %0, %0, #1 \n\t" 
        "bne 1b" 
        : : "r"(cycles)); 

Я тестировал его на google-выходе GPIO с почти 100 мс и разделял его потом.

+0

Я имею в виду, что это означает, что subs + bne нуждается в 50 nop циклах перед следующим subs + bne, кажется, это слишком много? – user1735225

+0

У вас включен кеш? Инструкции могут занимать более одного цикла, особенно если они являются ветвями. Кроме того, вам, возможно, придется настроить системные часы для работы на частоте 700 МГц; это просто означает, что он способен быстро работать. Он может не загружаться с такой скоростью. –

+0

Какова была стоимость, с которой вы начали, в основном, сколько раз в этом цикле вы ожидаете. это сложный цикл, который вы обманываете, он не будет даже удаленно близок к 700 МГц даже с очень быстрой памятью или кешем l1. и он будет только замедляться оттуда. Это очень плохой способ сделать задержку, отлично работает на некоторых/более старых микроконтроллерах, где время выполнения немного детерминировано, но здесь это не будет работать. –

ответ

0

Я думаю, что это может быть не лучший способ реализации задержки, поскольку вы полностью полагаетесь на знание времени, которое требуется для выполнения пары инструкций (sub, b), и это может изменяться в разных режимах работа и т.д. и т.п.

Я думаю, вы можете попробовать два различных варианта, которые будут действительны для любых условий эксплуатации, и как мне кажется, являются более надежными, чем ваш подход:

  1. Насыщенная ожидания: Получите значение текущего системного таймера на входе (t0). Loop. На каждой итерации сравните счетчик, и если он больше ожидаемого значения системного таймера (t0 + time_you_want_to_wait_in_secs · ticks/sec), верните его.
  2. Процедура прерывания: установите прерывание таймера, чтобы вы могли делать другие вещи, ожидая вашего правильного времени.

У вас есть вся информация о направлениях памяти, в которой вы получите значения системного таймера в BCM2835 datasheet.

В любом случае, я намерен просто попытаться указать другой набор решений, чтобы вы могли исследовать их, если хотите. Вышеуказанные ответы являются хорошими для вашего конкретного кода, я думаю, ^^.

+0

Одним из критических моментов для подхода оживленного ожидания является то, что (из того, что я могу найти), читаемые пользователем часы Малины Pi работают на частоте 1 МГц, что составляет 700 циклов обучения за галочку, - возможно, это не будет достаточно хорошим решением для всех , – Ponkadoodle