Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Интервальный таймер в линуксе на 80х86 и АРМе
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Гвоздик
Здравствуйте. Запускаю эту подпрограмму:
Код
/* Configure and start timer for CAN bus I/O transactions */
/* Input: CanBusDescriptor for write and read to/from it  */
/* Output: 0 - start is ok                                */
/*         -1 - not ok (invalid)                          */
int StartCanBusTimer(void)
{
  /* linux interval timer configuration */
  struct itimerval TimerId;
  struct sigaction sigact;

  /* clear all flags and handler before using signal action */
  memset(&sigact, 0, sizeof(sigact));
  /* define signal handler for timer interruption */
  sigact.sa_handler = &CanBusTimerHandler;

  if(sigaction(SIGALRM, &sigact, (struct sigaction *)NULL) != 0)
  {
    DEBUG_PRINT("Can not run signal action!\n");
    return -1;
  }

  /* configure timer */
  /* first time run timer handler after minimal time (1 us) */
  TimerId.it_value.tv_sec = 0;
  TimerId.it_value.tv_usec = 1;
  /* and every timing interval run timer handler again */
  TimerId.it_interval.tv_sec = 0;
  TimerId.it_interval.tv_usec = 1000;
  /* start the timer */
  setitimer(ITIMER_REAL, &TimerId, NULL);

  return 0;
}


При ее компиляции в линуксе на своем ПК таймерный интервал равен 1 мс (все в порядке), однако при ее перекомпиляции под АРМ (AT91SAM9260-EK) таймерный интервал становится 10 мс!
АРМовский компилятор - GCC брал с www.linux4sam.org:
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/paul/arm/src/gcc-4.2/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-shared --enable-threads --disable-libmudflap --disable-libssp --disable-libgomp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --prefix=/opt/codesourcery --enable-languages=c,c++ --enable-symvers=gnu --enable-__cxa_atexit --with-versuffix=CodeSourcery Sourcery G++ Lite 2007q1-10 --with-pkgversion=CodeSourcery Sourcery G++ Lite 2007q1-10 --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/paul/arm/install/arm-none-linux-gnueabi/libc --enable-poison-system-directories --with-build-time-tools=/scratch/paul/arm/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/paul/arm/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.2.0 20070413 (prerelease) (CodeSourcery Sourcery G++ Lite 2007q1-10)

В чем может быть дело?
Kirill Frolov
Цитата(Гвоздик @ Mar 20 2008, 10:56) *
При ее компиляции в линуксе на своем ПК таймерный интервал равен 1 мс (все в порядке), однако при ее перекомпиляции под АРМ (AT91SAM9260-EK) таймерный интервал становится 10 мс!


В ламуксе есть такое понятие как jiffies. Так вот их длина конфигурируется от 1мс до 10мс и от платформы зависит. В преждние времена и на пц было 10мс, а на альфе сразу 1мс. Это собтвенно частота таймерных прерываний. Видимо это зависит от реализации процитированных функций, НЕ ЗНАЮ, но вполне допускаю что на половине платформ точность меньше одного jiffy получить невозможно. Хотя теоретически путём перепрограммирования таймера в том же ПЦ, да и в атмловских армах, можно отмерять интервалы вплоть до если не единиц, то десятков микросекунд.
amw
Цитата(Гвоздик @ Mar 20 2008, 09:56) *
В чем может быть дело?

В ядре определен такой параметр как HZ.
Он определяет частоту прерываний таймера.
Зависит от архитектуры. Точнее от производительность процесора.
Поскольку АРМ медленее PC, то и HZ для него - меньше прерываний.
Обычно для АРМ
Код
#define HZ 100

То есть прерывание 100 раз в секунду.
Если Вы думаете, что Ваш процессор может прерываться с частотой 1000 раз в секунду - попробуйте изменить этот макрос.
Но вообще, это не рекомендуется. Из-за оверхеда прерываний.
Само ядро везде использует HZ для вычисления задержек и пр.
Цитата
... есть такое понятие как jiffies....

jiffies увеличивается на 1 при каждом прерывании. Но зависимость не строгая. Если более приоритетное прерывание привело к пропуску прерывания от таймера - то jiffies может изменить на 2 и более.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.