У меня такой вопрос.Пишу для Linux Embedded.К чипу на обычный вход(обычный вход - это вход на который напряжение или подаётся или нет.) прицепленна железка(Buzzer).Когда на вход напряжение подаётся с определённой частотой, то эта железяка начинает пищать.В зависимости от частоты писк может быть выше или ниже.Т.е. если нужно,чтобы железка пищала с частотой 1КНz = 1000Hz,т.е. 0.001 сек. или 1милисек,то нужно подавать напряжение на этот вход 500 микросекумд, а следующие 500 микросекунд выключать и так в течении какого-то времени.В программе,после выполнения ряда условий, мне нужно,чтобы она(железка) запищала,но с определённой частотой.Мне для этого посоветовали воспользоваться таймерами,функцией setitimer/getitimer, но я не очень понял как они работают,что такое tv_value и tv_interval и т.д.
Может меня кто-нить просвятить по этому вопросу?
Заранее спасибо.
Таймеры (Таймеры)
Модератор: Модераторы разделов
-
alfss
- Сообщения: 262
Re: Таймеры
setitimer, getitimer (POSIX.1–2001) <sys/time.h>
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
int getitimer(int which, struct itimerval *value);
Получить и установить значение value интервального таймера <which>. Старое значение таймера сохраняется в <ovalue>. Типы таймеров <which>:
* ITIMER_REAL – декремент в реальном времени(РВ) и вызывает SIGALARM;
* ITIMER_VIRTUAL – декремент только при выполнении процесса и вызывает SIGVTALRM;
* ITIMER_PROF – декремент при выполнении процесса и при выполнении системы на защите процесса, вызывает SIGPROF.
sleep, usleep, nanosleep (POSIX) <unistd.h, time.h>
unsigned int sleep(unsigned int seconds);
void usleep(unsigned long usec);
int nanosleep(const struct timespec *req, struct timespec *rem);
Функция задаёт интервал паузы: seconds – секунды, usec – микросекунды и req – наносекундах. В rem помещается реально прошедшее время.
http://homepages.cwi.nl/~aeb/linux/man2htm...etitimer.2.html
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
int getitimer(int which, struct itimerval *value);
Получить и установить значение value интервального таймера <which>. Старое значение таймера сохраняется в <ovalue>. Типы таймеров <which>:
* ITIMER_REAL – декремент в реальном времени(РВ) и вызывает SIGALARM;
* ITIMER_VIRTUAL – декремент только при выполнении процесса и вызывает SIGVTALRM;
* ITIMER_PROF – декремент при выполнении процесса и при выполнении системы на защите процесса, вызывает SIGPROF.
sleep, usleep, nanosleep (POSIX) <unistd.h, time.h>
unsigned int sleep(unsigned int seconds);
void usleep(unsigned long usec);
int nanosleep(const struct timespec *req, struct timespec *rem);
Функция задаёт интервал паузы: seconds – секунды, usec – микросекунды и req – наносекундах. В rem помещается реально прошедшее время.
http://homepages.cwi.nl/~aeb/linux/man2htm...etitimer.2.html
-
rapa
- Сообщения: 29
- ОС: Linux Fedora 8
Re: Таймеры
Спасибо конечно,но такое описание я и сам нашёл.
Мне бы,пожалуйста, что проишодит с параметрами,после того, как таймер побежал и как они обновляются?Возможно ли обновить параметры после того, как таймер уже бежит какое-то время, самому? И т.д. ...
Мне бы,пожалуйста, что проишодит с параметрами,после того, как таймер побежал и как они обновляются?Возможно ли обновить параметры после того, как таймер уже бежит какое-то время, самому? И т.д. ...
-
Voice
- Сообщения: 1073
- Статус: столлманист
- ОС: Debian GNU/Linux
Re: Таймеры
rapa, посмотрите Роберт Лав "Разработка Ядра Linux", там есть глава про интересующий Вас вопрос.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
М. В. Ломоносов
-
rapa
- Сообщения: 29
- ОС: Linux Fedora 8
Re: Таймеры
Voice
Это не совсем то, а точнее это совсем не то.То,что описывается в предложенной вами книге - это таймеры ядра.А мне нужны таймеры на уровне пользователя.
Это не совсем то, а точнее это совсем не то.То,что описывается в предложенной вами книге - это таймеры ядра.А мне нужны таймеры на уровне пользователя.
-
Gloomy
- Сообщения: 340
- Статус: сочувствующий
Re: Таймеры
Кусок кода из рабочей софтины. Проверен и отлажен.
Код: Выделить всё
#include <time.h>
#include <stdio.h>
#include <signal.h>
void timer_proc(int signo, siginfo_t* info, void *context)
{
static int counter = 0;
if (signo == SIGRTMAX) {
printf("counter = %d\n", ++counter);
}
}
int main(int argc, char **argv)
{
timer_t tm_id;
struct sigevent sigev;
struct itimerspec itval;
struct sigaction sigact;
struct itimerspec oitval;
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = SA_SIGINFO;
sigact.sa_sigaction = timer_proc;
if (sigaction(SIGRTMAX, &sigact, NULL) == -1) {
fprintf(stderr, "Error: Unable set signal handler\n");
return 1;
}
sigev.sigev_value.sival_ptr = NULL;
sigev.sigev_notify = SIGEV_SIGNAL;
sigev.sigev_signo = SIGRTMAX;
sigev.sigev_value.sival_ptr = &tm_id;
if (timer_create(CLOCK_REALTIME, &sigev, &tm_id) == 0) {
itval.it_value.tv_sec = itval.it_interval.tv_sec = 1; // интервал, секунд
itval.it_value.tv_nsec = itval.it_interval.tv_nsec = 0; // интервал, наносекунд
if (timer_settime(tm_id, 0, &itval, &oitval) != 0) {
fprintf(stderr, "Error: Unable set timer\n");
timer_delete(tm_id);
return 1;
}
}
else {
fprintf(stderr, "Error: Unable create timer\n");
return 1;
}
system("sleep 10s");
timer_delete(tm_id);
return 0;
}