Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: точная програмная задержка на LPC2138
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
asen
Используем среду IAR for ARM вот необходимо организовать програмные задержки т.е. сделать функцию которая выдолнялась заданое количество слоков ядра! задержки от 50 до 5000 скажим тактов процессорного ядра как кто это делал на арм в компиляторе под AVR есть встроиная функция __delay_cycles(количество тактов) требуется создать аналог но под ARM ! Есть предложения или примеры реализатции ? biggrin.gif
Ivan_Kov
имхо таймер есть для этого.
asen
таймеры заняты для другово ! задержки десятки микросекунд !
Ivan_Kov
на асме пустой цикл написать. дешево и сердито.
etoja
В начале программы калибруешь программную задержку по таймеру.
VAI
если абсолютное количество тактов мало волнует, а нужна задержка на несколько микросекунд, но чтоб не зависело от установленой на данный момент оптимизации, на эту функцию надо вписать оптимизацию ручками. Для Кейл-РеалВиев это #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--; )
  ;
}
axle
Использование такой функции для ARM возможно только при отключенном MAM (MEMORY ACCELERATOR MODULE), иначе точное время выполнения функции предсказать невозможно. А выключать MAM не резонно. Поэтому таким способом задержек никто и не пользуется.
Можно конечно калибровать задержку при инициализации программы, но это уже посложней, да и абсолютной точности не гарантирует. Так например реализованы короткие задержки в ядре линукс.
Мне кажется, что для небольшого проекта все-таки лучший вариант изыскать способ и использовать таймер тикающий с нужной частотой. Собственно я так в своих проектах и делаю.
smile.gif
Alechek
Ну МАМ можно не выключать. Его можно обойти, разместить функцию задержки в ОЗУ.
bolmoe
тут когда то промелькивала подобная штука, выкладываю код, сам еще не пробовал.............


#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--);
}
etoja
Оптимизатор компилятора уберёт все эти "NOP"ы.
axle
даже если бы не убрал, все равно не будет работать
На какой частоте работает ядро? Сколько тактов будут выполняться операторы цикла while (мне так кажется что дольше nop'ов) ?
вообщем код (по крайней мере для ARM) явно не рабочий - можете не пробовать
zltigo
Цитата(etoja @ Apr 23 2007, 06:22) *
Оптимизатор компилятора уберёт все эти "NOP"ы.

Да smile.gif? Компилятторы уже начали оптимизировать ASM?
Другое дело, что сколь-нибудь стабильных способов нет. И приведенный выше ни чем в лучшую сторону не отличается от прочих.
Для относительно больших (не по тактам smile.gif )задержек можно использовать обращение к периферии.
etoja
Компилятор HT-PIC ("C" для PIC процессоров) оптимизирует ассемблерные команды, если включить такую опцию.
Alex B._
>> Компилятор HT-PIC ("C" для PIC процессоров) оптимизирует
>> ассемблерные команды, если включить такую опцию.

не путайте, он "оптимизирует" уже после кодогенератора и оптимизатора компилёра. "inline" ассемблер в сишном коде он не трогает.
sonycman
Цитата(axle @ Apr 19 2007, 18:37) *
Мне кажется, что для небольшого проекта все-таки лучший вариант изыскать способ и использовать таймер тикающий с нужной частотой. Собственно я так в своих проектах и делаю.
smile.gif

Цитата(asen @ Apr 18 2007, 14:47) *
таймеры заняты для другово ! задержки десятки микросекунд !

Так ведь можно и уже заюзанный периодический таймер использовать. Нужно только знать, с какой частотой увеличивается/уменьшается регистр таймера, и высчитывать необходимую разницу в цикле ожидания... smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.