|
|
  |
Функция __delay_cycles(...);, Описание???? |
|
|
|
Jul 14 2005, 11:01
|

Частый гость
 
Группа: Свой
Сообщений: 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ы. Да вы напишите и посмотрите в листинг... Все сразу станет ясно.
|
|
|
|
|
Jul 15 2005, 08:45
|

Частый гость
 
Группа: Свой
Сообщений: 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 или что-то подобное
--------------------
Имей мужество пользоваться своим собственным разумом! (с) И.Кант
|
|
|
|
|
Jul 18 2005, 06:20
|
Знающий
   
Группа: Свой
Сообщений: 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. У меня оптимизация "минимум размер кода" может это мой случай? Но в других точках проекта эта функция работает.
|
|
|
|
|
Jul 18 2005, 12:55
|

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

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

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

|
Можно переписать функцию задержки с внутренней переменной, объявленной как volatile: Код void delayms(unsigned long ms) { volatile unsigned long dly; dly=ms; while(--dly) __delay_cycles(_1ms)); } Тогда никакие оптимизации не страшны
|
|
|
|
|
Jul 21 2005, 03:09
|

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

|
Цитата //Наверное нужно так переписать Да, конечно  , запарка вышла.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|