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

 
 
> Функция __delay_cycles(...);, Описание????
Oleg_IT
сообщение Jul 14 2005, 09:35
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Использую компилятор IAR. В фирменных исходниках применяют функцию __delay_cycles(...); Но в документации её нет. Только скудное упоминание в каком-то htm файле. Ведёт себя странно, компилятор её то оптимизирует, то оставляет.
Какие обции компилятора (или что ещё) нужно задействовать, что бы она всегда работала?
Какая максимальная задержка на ней возможна?
А может есть ещё какая-нибудь функция задержки на N мс?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
BVU
сообщение Jul 14 2005, 12:44
Сообщение #2


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

Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264



Практически все, кто работает на IAR пользуются этой встроенной функцией для создания задержки:

__delay_cycles __delay_cycles(unsigned long int);

Делаете такие определения:
//**********************************************
#define ClkFreq 16000000 // частота кварцевого резонатора или частота на которой работает контроллер.
#define _1us (unsigned long int)((ClkFreq / 1000000) / 1.25) // 1.25 погрешность на вызов функции для 1us.
#define _1ms (unsigned long int)(ClkFreq / 1000)
//**********************************************

Сами функции задержки соответственно могут выглядеть так:
void DelayMs(unsigned int d)
{
while(--d)__delay_cycles(_1ms);
}

void DelayUs(unsigned int d)
{
while(--d)__delay_cycles(_1us);
}

Делаете вызов той или другой функции в зависимости на сколько милисекунд или микросекунд делаете задержку.


--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jul 14 2005, 13:30
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Код функции я вижу в дисассемблере. Но вопрос в другом. Иногда эта функция вообще не вставляется. Почему компилятор её оптимизирует? На 480 мс работает, 1 с нет, частота проца 4 МГц. Ставлю подряд 3 вызова по 400 мс, нет их в коде. В другом месте программы подряд 5-10 вызовов работают. Что за чудеса?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Oleg_IT   Функция __delay_cycles(...);   Jul 14 2005, 09:35
- - nml   Цитата(Oleg_IT @ Jul 14 2005, 12:35)Использую...   Jul 14 2005, 11:01
- - VladislavS   Минимальная задержка один такт. Компилятор просто ...   Jul 14 2005, 12:19
- - BVU   Проблема до конца непонятна... Тогда поясните из к...   Jul 14 2005, 13:49
|- - Oleg_IT   Точек задержек в программе несколько, в разных фай...   Jul 15 2005, 05:19
|- - bialix   Цитата(Oleg_IT @ Jul 15 2005, 07:19)Точек зад...   Jul 15 2005, 08:45
- - BVU   Стоят ли у Вас #include <inavr.h> #include ...   Jul 15 2005, 08:24
|- - Oleg_IT   Цитата(BVU @ Jul 15 2005, 12:24)Стоят ли у Ва...   Jul 18 2005, 06:20
- - BVU   Если все же не так критично отнестись к требования...   Jul 18 2005, 12:55
- - subver   Можно переписать функцию задержки с внутренней пер...   Jul 19 2005, 02:44
- - BVU   Согласен. Возможно, что вариант с применением vola...   Jul 19 2005, 05:18
- - jimmi   RE: Функция __delay_cycles(...);   Jul 20 2005, 14:06
- - subver   Цитата//Наверное нужно так переписать Да, конечно...   Jul 21 2005, 03:09


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 01:03
Рейтинг@Mail.ru


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