Отговори на тема  [ 19 мнения ]  Отиди на страница Предишна  1, 2
Проблем с _delay_ms(int) функция 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Проблем с _delay_ms(int) функция
Ще работи нормално ако __builtin_avr_delay_cycles() би трябвало да получава парамерър циклите за закъснение делено на 4. Което не изглежда така от заглавието и. Ама може и така да е. С тия безплатни бози изненадите са навсякъде :)


Чет Фев 02, 2012 1:45 pm
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Проблем с _delay_ms(int) функция
Да интересното в случая е:
Код:
Build succeeded with 0 Warnings...

Няма Warnings :)


Чет Фев 02, 2012 1:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение Re: Проблем с _delay_ms(int) функция
Виж в последната версия на тулчейна тая функция е различна, т.е. оправяли са уж нещо:
Код:
void
_delay_ms(double __ms)
{
   uint16_t __ticks;
   double __tmp ;
#if __HAS_DELAY_CYCLES && defined(__OPTIMIZE__) && !defined(__DELAY_BACKWARD_COMPATIBLE__)
   uint32_t __ticks_dc;
   extern void __builtin_avr_delay_cycles(unsigned long);
   __tmp = ((F_CPU) / 1e3) * __ms;

   #if defined(__DELAY_ROUND_DOWN__)
      __ticks_dc = (uint32_t)fabs(__tmp);

   #elif defined(__DELAY_ROUND_CLOSEST__)
      __ticks_dc = (uint32_t)(fabs(__tmp)+0.5);

   #else
      //round up by default
      __ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
   #endif

   __builtin_avr_delay_cycles(__ticks_dc);

#elif !__HAS_DELAY_CYCLES || (__HAS_DELAY_CYCLES && !defined(__OPTIMIZE__)) || defined (__DELAY_BACKWARD_COMPATIBLE__)
   __tmp = ((F_CPU) / 4e3) * __ms;
   if (__tmp < 1.0)
      __ticks = 1;
   else if (__tmp > 65535)
   {
      //   __ticks = requested delay in 1/10 ms
      __ticks = (uint16_t) (__ms * 10.0);
      while(__ticks)
      {
         // wait 1/10 ms
         _delay_loop_2(((F_CPU) / 4e3) / 10);
         __ticks --;
      }
      return;
   }
   else
      __ticks = (uint16_t)__tmp;
   _delay_loop_2(__ticks);
#endif
}


Отделно в хедъра на файла наистина пише да са включени оптимизациите:
Цитат:
\note In order for these functions to work as intended, compiler
optimizations <em>must</em> be enabled, and the delay time
<em>must</em> be an expression that is a known constant at
compile-time. If these requirements are not met, the resulting
delay will be much longer (and basically unpredictable), and
applications that otherwise do not use floating-point calculations
will experience severe code bloat by the floating-point library
routines linked into the application.


Код:
#ifndef __OPTIMIZE__
# warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
#endif


Какво стана като направи това, дето Никола те посъветва?


Чет Фев 02, 2012 6:11 pm
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Проблем с _delay_ms(int) функция
Оправи се :) Благодаря


Чет Фев 02, 2012 7:18 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 19 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни