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

 
 
> Интервальный таймер в линуксе на 80х86 и АРМе, Почему-то работает с разными периодами
Гвоздик
сообщение Mar 20 2008, 07:56
Сообщение #1


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

Группа: Свой
Сообщений: 153
Регистрация: 2-12-04
Из: Чебоксары
Пользователь №: 1 289



Здравствуйте. Запускаю эту подпрограмму:
Код
/* 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)

В чем может быть дело?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 2)
Kirill Frolov
сообщение Mar 20 2008, 08:14
Сообщение #2


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

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



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


В ламуксе есть такое понятие как jiffies. Так вот их длина конфигурируется от 1мс до 10мс и от платформы зависит. В преждние времена и на пц было 10мс, а на альфе сразу 1мс. Это собтвенно частота таймерных прерываний. Видимо это зависит от реализации процитированных функций, НЕ ЗНАЮ, но вполне допускаю что на половине платформ точность меньше одного jiffy получить невозможно. Хотя теоретически путём перепрограммирования таймера в том же ПЦ, да и в атмловских армах, можно отмерять интервалы вплоть до если не единиц, то десятков микросекунд.


--------------------
[ZX]
Go to the top of the page
 
+Quote Post
amw
сообщение Mar 20 2008, 10:00
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(Гвоздик @ Mar 20 2008, 09:56) *
В чем может быть дело?

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

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

jiffies увеличивается на 1 при каждом прерывании. Но зависимость не строгая. Если более приоритетное прерывание привело к пропуску прерывания от таймера - то jiffies может изменить на 2 и более.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post

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

 


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


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