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

 
 
> Функция задержки
алексей500
сообщение Jun 19 2010, 23:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 22-05-10
Пользователь №: 57 445



А не подскажите, как реализовать функцию задержки в микросекундах, ну или в тактах, без таймера и прерываний? Нашёл на форуме вот такое:



Код
volatile unsigned int x = us * 12;

while(--x);




Только это был ответ на:

Цитата
Никто не поделиться кодом, который делает задежку в микросекундах без таймеров, а так просто с помощью нупов или циклом для частоты 48 Мгц???



А для произвольной частоты это можно организовать? Пишу в IAR. Контроллер AT91SAM7A3.
Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aspID
сообщение May 22 2012, 08:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



Позвольте подниму эту тему из далекого забытого прошлого...

До недавнего времени для создания задержек пользовался макроподстановками (кстати, найденными здесь же)

Код
#ifndef F_CPU
# warning "F_CPU not defined for delay.h, using 1MHz"
# warning "To define F_CPU go Proj->Opt->C/C++->Defined symbols"
# define F_CPU 1000000UL
#endif

#define _delay_ns(x) __delay_cycles(x*F_CPU/1000000000)
#define _delay_us(x) __delay_cycles(x*F_CPU/1000000)
#define _delay_ms(x) __delay_cycles(x*F_CPU/1000)
#define _delay_s(x) __delay_cycles(x*F_CPU)


Но внимательно изучая на досуге IAR C/C++ Compiler Reference Guide нашел там следующее:
Цитата
Description Makes the compiler generate code that takes the given amount of cycles to perform, that
is, it inserts a time delay that lasts the specified number of cycles.
The specified value must be a constant integer expression and not an expression that is
evaluated at runtime
.

Вот я и позадумался... а правильно ли так использовать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 22 2012, 09:35
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Если в качестве x вы подставляете константу, то и все выражение может быть вычисленно на этапе компиляции и компилятор может вставить код задержки на нужное количество циклов. Если в качестве x вы подставите переменную - компилятор выругается и компилировать откажется.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


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


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