Используем среду IAR for ARM вот необходимо организовать програмные задержки т.е. сделать функцию которая выдолнялась заданое количество слоков ядра! задержки от 50 до 5000 скажим тактов процессорного ядра как кто это делал на арм в компиляторе под AVR есть встроиная функция __delay_cycles(количество тактов) требуется создать аналог но под ARM ! Есть предложения или примеры реализатции ?
Ivan_Kov
Apr 18 2007, 10:42
имхо таймер есть для этого.
таймеры заняты для другово ! задержки десятки микросекунд !
Ivan_Kov
Apr 18 2007, 10:53
на асме пустой цикл написать. дешево и сердито.
В начале программы калибруешь программную задержку по таймеру.
если абсолютное количество тактов мало волнует, а нужна задержка на несколько микросекунд, но чтоб не зависело от установленой на данный момент оптимизации, на эту функцию надо вписать оптимизацию ручками. Для Кейл-РеалВиев это
#pragma O....Код
#pragma O3 Ospace
void delay_us( unsigned int us )
{
for (; us--; )
;
}
// или так, у меня на SAM7S при тактовой 48МГц приблизительно совпадает с микросекундами.
#pragma O3 Ospace
void delay_us( unsigned int us )
{
for ( us *= 8; us--; )
;
}
Использование такой функции для ARM возможно только при отключенном MAM (MEMORY ACCELERATOR MODULE), иначе точное время выполнения функции предсказать невозможно. А выключать MAM не резонно. Поэтому таким способом задержек никто и не пользуется.
Можно конечно калибровать задержку при инициализации программы, но это уже посложней, да и абсолютной точности не гарантирует. Так например реализованы короткие задержки в ядре линукс.
Мне кажется, что для небольшого проекта все-таки лучший вариант изыскать способ и использовать таймер тикающий с нужной частотой. Собственно я так в своих проектах и делаю.
Alechek
Apr 20 2007, 07:29
Ну МАМ можно не выключать. Его можно обойти, разместить функцию задержки в ОЗУ.
bolmoe
Apr 20 2007, 09:26
тут когда то промелькивала подобная штука, выкладываю код, сам еще не пробовал.............
#include "delay.h"
void delay_ns(unsigned int count)
{
while(--count);
}
void delay_us(unsigned int count)
{
count*=10;
do
{
__asm
{
nop
nop
nop
nop
nop
nop
}
}while(count--);
}
void delay_ms(unsigned int count)
{
count*=10000;
do
{
__asm
{
nop
nop
nop
nop
nop
nop
}
}while(count--);
}
Оптимизатор компилятора уберёт все эти "NOP"ы.
даже если бы не убрал, все равно не будет работать
На какой частоте работает ядро? Сколько тактов будут выполняться операторы цикла while (мне так кажется что дольше nop'ов) ?
вообщем код (по крайней мере для ARM) явно не рабочий - можете не пробовать
zltigo
Apr 23 2007, 11:53
Цитата(etoja @ Apr 23 2007, 06:22)

Оптимизатор компилятора уберёт все эти "NOP"ы.
Да

? Компилятторы уже начали оптимизировать ASM?
Другое дело, что сколь-нибудь стабильных способов нет. И приведенный выше ни чем в лучшую сторону не отличается от прочих.
Для относительно больших (не по тактам

)задержек можно использовать обращение к периферии.
Компилятор HT-PIC ("C" для PIC процессоров) оптимизирует ассемблерные команды, если включить такую опцию.
Alex B._
Apr 24 2007, 09:13
>> Компилятор HT-PIC ("C" для PIC процессоров) оптимизирует
>> ассемблерные команды, если включить такую опцию.
не путайте, он "оптимизирует" уже после кодогенератора и оптимизатора компилёра. "inline" ассемблер в сишном коде он не трогает.
sonycman
Dec 27 2008, 13:38
Цитата(axle @ Apr 19 2007, 18:37)

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

Цитата(asen @ Apr 18 2007, 14:47)

таймеры заняты для другово ! задержки десятки микросекунд !
Так ведь можно и уже заюзанный периодический таймер использовать. Нужно только знать, с какой частотой увеличивается/уменьшается регистр таймера, и высчитывать необходимую разницу в цикле ожидания...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.