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

 
 
 
Reply to this topicStart new topic
> Функция __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
nml
сообщение Jul 14 2005, 11:01
Сообщение #2


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

Группа: Свой
Сообщений: 86
Регистрация: 13-06-04
Из: Minsk
Пользователь №: 29



Цитата(Oleg_IT @ Jul 14 2005, 12:35)
Использую компилятор IAR. В фирменных исходниках применяют функцию __delay_cycles(...); Но в документации её нет. Только скудное упоминание в каком-то htm файле. Ведёт себя странно, компилятор её то оптимизирует, то оставляет.
*


Да ну что вы... вот из PDFки что идет в комплекте:

__delay_cycles __delay_cycles(unsigned long int);
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.
Note: The specified value must be a constant integer expression and not an expression that is evaluated at runtime.

на самом деле код будет сгенерирован примитивный - константу в регистр(ы) и вертушка(ки). В случае необходимости добавляются NOPы. Да вы напишите и посмотрите в листинг... Все сразу станет ясно.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 14 2005, 12:19
Сообщение #3


Местный
***

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



Минимальная задержка один такт. Компилятор просто вставит NOP, который выполняется один такт. Если больше задержка, то будет подставлен код, выполняющийся указанное количество тактов. Действительно, посмотри листинг и все поймешь.
Go to the top of the page
 
+Quote Post
BVU
сообщение Jul 14 2005, 12:44
Сообщение #4


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

Группа: Свой
Сообщений: 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
Сообщение #5


Знающий
****

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



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


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

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



Проблема до конца непонятна...
Тогда поясните из какого места в своей программы Вы пытаетесь сделать вызов подпрограммы задержки на 1000мс (1с)?


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


Знающий
****

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



Точек задержек в программе несколько, в разных файлах проекта. В одних файлах они работают, а в других оптимизируются. В html-ках что-то сказано про это, но я с IAR-ом пока на ВЫ и не пойму в чём дело.
Максимальная задержка на (unsigned long int) нопов? (unsigned long int) в IAR-е 4 байта?
Go to the top of the page
 
+Quote Post
BVU
сообщение Jul 15 2005, 08:24
Сообщение #8


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

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



Стоят ли у Вас
#include <inavr.h>
#include <io'ваш тип контроллера'.h>
во всех файлах c/cpp?
Обычно все работает, как положено...


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


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

Группа: Свой
Сообщений: 174
Регистрация: 4-11-04
Из: zp.ua
Пользователь №: 1 046



Цитата(Oleg_IT @ Jul 15 2005, 07:19)
Точек задержек в программе несколько, в разных файлах проекта. В одних файлах они работают, а в других оптимизируются. В html-ках что-то сказано про это, но я с IAR-ом пока на ВЫ и не пойму в чём дело.
Максимальная задержка на (unsigned long int) нопов? (unsigned long int) в IAR-е 4 байта?
*


Максимальная задержка -- посмотрите экспериментально, она существенно меньше доступного диапазона unsigned long, что-то в районе 480 тысяч если я еще помню.
С иаром идет комплект документации в pdf-файлах, ищите раздел Intrinsic function или что-то подобное


--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jul 18 2005, 06:20
Сообщение #10


Знающий
****

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



Цитата(BVU @ Jul 15 2005, 12:24)
Стоят ли у Вас
#include <inavr.h>
#include <io'ваш тип контроллера'.h>
во всех файлах c/cpp?
Обычно все работает, как положено...
*


Да, всё везде стоит.
В файле iccavr.htm говорится

AVRC0012: When compiling with optimization level 6 or higher, calls to the __delay_cycles intrinsic function were considered to be dead code, and were thus removed.

У меня оптимизация "минимум размер кода" может это мой случай? Но в других точках проекта эта функция работает.
Go to the top of the page
 
+Quote Post
BVU
сообщение Jul 18 2005, 12:55
Сообщение #11


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

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



Если все же не так критично отнестись к требованиям Вашей оптимизации попробуйте "поиграться" с отключением элементов оптимизации в разделе: Project->Options...->ICCAVR->Optimizations: Enabled optimizations. Возможно это даст какой то результат. Других вариантов пока нет, кроме как организовать задержку на таймерах, если они в данный момент не используются.
P.S. Непредвиденными последствиями после "оптимизации кода" страдают многие компиляторы, особенно это проявляется, когда производиться дезассемблирование кода. Дизассемблер не может восстановить участки исходника, т.к. они оптимизированы, а попросту говоря их не существует.


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


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

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Можно переписать функцию задержки с внутренней переменной, объявленной как volatile:

Код
void delayms(unsigned long ms)
{
volatile unsigned long dly;
       dly=ms;
       while(--dly) __delay_cycles(_1ms));
}


Тогда никакие оптимизации не страшны smile.gif
Go to the top of the page
 
+Quote Post
BVU
сообщение Jul 19 2005, 05:18
Сообщение #13


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

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



Согласен. Возможно, что вариант с применением volatile будет иметь положительный эффект(надо пробовать, практика подтвердит!).
http://www.kalinin.ru/programming/cpp/12_09_00.shtml


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


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 15-07-05
Пользователь №: 6 827



sad.gif
Go to the top of the page
 
+Quote Post
subver
сообщение Jul 21 2005, 03:09
Сообщение #15


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

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Цитата
//Наверное нужно так переписать

Да, конечно smile.gif ,
запарка вышла.
Go to the top of the page
 
+Quote Post

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

 


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


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