реклама на сайте
подробности

 
 
> точная програмная задержка на LPC2138, какие есть примеры реализатции
asen
сообщение Apr 18 2007, 09:42
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



Используем среду IAR for ARM вот необходимо организовать програмные задержки т.е. сделать функцию которая выдолнялась заданое количество слоков ядра! задержки от 50 до 5000 скажим тактов процессорного ядра как кто это делал на арм в компиляторе под AVR есть встроиная функция __delay_cycles(количество тактов) требуется создать аналог но под ARM ! Есть предложения или примеры реализатции ? biggrin.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
Ivan_Kov
сообщение Apr 18 2007, 10:42
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 30-10-06
Из: г. Курск
Пользователь №: 21 787



имхо таймер есть для этого.
Go to the top of the page
 
+Quote Post
asen
сообщение Apr 18 2007, 10:47
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 513
Регистрация: 5-09-05
Из: Барнаул
Пользователь №: 8 220



таймеры заняты для другово ! задержки десятки микросекунд !
Go to the top of the page
 
+Quote Post
Ivan_Kov
сообщение Apr 18 2007, 10:53
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 30-10-06
Из: г. Курск
Пользователь №: 21 787



на асме пустой цикл написать. дешево и сердито.
Go to the top of the page
 
+Quote Post
etoja
сообщение Apr 18 2007, 12:15
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



В начале программы калибруешь программную задержку по таймеру.
Go to the top of the page
 
+Quote Post
VAI
сообщение Apr 18 2007, 12:16
Сообщение #6


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



если абсолютное количество тактов мало волнует, а нужна задержка на несколько микросекунд, но чтоб не зависело от установленой на данный момент оптимизации, на эту функцию надо вписать оптимизацию ручками. Для Кейл-РеалВиев это #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--; )
  ;
}


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
axle
сообщение Apr 19 2007, 14:37
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



Использование такой функции для ARM возможно только при отключенном MAM (MEMORY ACCELERATOR MODULE), иначе точное время выполнения функции предсказать невозможно. А выключать MAM не резонно. Поэтому таким способом задержек никто и не пользуется.
Можно конечно калибровать задержку при инициализации программы, но это уже посложней, да и абсолютной точности не гарантирует. Так например реализованы короткие задержки в ядре линукс.
Мне кажется, что для небольшого проекта все-таки лучший вариант изыскать способ и использовать таймер тикающий с нужной частотой. Собственно я так в своих проектах и делаю.
smile.gif
Go to the top of the page
 
+Quote Post
Alechek
сообщение Apr 20 2007, 07:29
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Ну МАМ можно не выключать. Его можно обойти, разместить функцию задержки в ОЗУ.
Go to the top of the page
 
+Quote Post
bolmoe
сообщение Apr 20 2007, 09:26
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



тут когда то промелькивала подобная штука, выкладываю код, сам еще не пробовал.............


#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--);
}
Go to the top of the page
 
+Quote Post
etoja
сообщение Apr 23 2007, 06:22
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Оптимизатор компилятора уберёт все эти "NOP"ы.
Go to the top of the page
 
+Quote Post
axle
сообщение Apr 23 2007, 11:44
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 19-04-07
Пользователь №: 27 167



даже если бы не убрал, все равно не будет работать
На какой частоте работает ядро? Сколько тактов будут выполняться операторы цикла while (мне так кажется что дольше nop'ов) ?
вообщем код (по крайней мере для ARM) явно не рабочий - можете не пробовать
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 23 2007, 11:53
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(etoja @ Apr 23 2007, 06:22) *
Оптимизатор компилятора уберёт все эти "NOP"ы.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
etoja
сообщение Apr 24 2007, 08:40
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 121
Регистрация: 14-01-05
Из: Москва
Пользователь №: 1 952



Компилятор HT-PIC ("C" для PIC процессоров) оптимизирует ассемблерные команды, если включить такую опцию.
Go to the top of the page
 
+Quote Post
Alex B._
сообщение Apr 24 2007, 09:13
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



>> Компилятор HT-PIC ("C" для PIC процессоров) оптимизирует
>> ассемблерные команды, если включить такую опцию.

не путайте, он "оптимизирует" уже после кодогенератора и оптимизатора компилёра. "inline" ассемблер в сишном коде он не трогает.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Dec 27 2008, 13:38
Сообщение #15


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



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

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

Так ведь можно и уже заюзанный периодический таймер использовать. Нужно только знать, с какой частотой увеличивается/уменьшается регистр таймера, и высчитывать необходимую разницу в цикле ожидания... smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01457 секунд с 7
ELECTRONIX ©2004-2016