Таймеры (Таймеры)

Модератор: Модераторы разделов

rapa
Сообщения: 29
ОС: Linux Fedora 8

Таймеры

Сообщение rapa »

У меня такой вопрос.Пишу для Linux Embedded.К чипу на обычный вход(обычный вход - это вход на который напряжение или подаётся или нет.) прицепленна железка(Buzzer).Когда на вход напряжение подаётся с определённой частотой, то эта железяка начинает пищать.В зависимости от частоты писк может быть выше или ниже.Т.е. если нужно,чтобы железка пищала с частотой 1КНz = 1000Hz,т.е. 0.001 сек. или 1милисек,то нужно подавать напряжение на этот вход 500 микросекумд, а следующие 500 микросекунд выключать и так в течении какого-то времени.В программе,после выполнения ряда условий, мне нужно,чтобы она(железка) запищала,но с определённой частотой.Мне для этого посоветовали воспользоваться таймерами,функцией setitimer/getitimer, но я не очень понял как они работают,что такое tv_value и tv_interval и т.д.
Может меня кто-нить просвятить по этому вопросу?

Заранее спасибо.
Спасибо сказали:
alfss
Сообщения: 262

Re: Таймеры

Сообщение alfss »

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
Спасибо сказали:
rapa
Сообщения: 29
ОС: Linux Fedora 8

Re: Таймеры

Сообщение rapa »

Спасибо конечно,но такое описание я и сам нашёл.
Мне бы,пожалуйста, что проишодит с параметрами,после того, как таймер побежал и как они обновляются?Возможно ли обновить параметры после того, как таймер уже бежит какое-то время, самому? И т.д. ...
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Таймеры

Сообщение Voice »

rapa, посмотрите Роберт Лав "Разработка Ядра Linux", там есть глава про интересующий Вас вопрос.
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
rapa
Сообщения: 29
ОС: Linux Fedora 8

Re: Таймеры

Сообщение rapa »

Voice
Это не совсем то, а точнее это совсем не то.То,что описывается в предложенной вами книге - это таймеры ядра.А мне нужны таймеры на уровне пользователя.
Спасибо сказали:
Аватара пользователя
Gloomy
Сообщения: 340
Статус: сочувствующий

Re: Таймеры

Сообщение Gloomy »

Кусок кода из рабочей софтины. Проверен и отлажен.

Код: Выделить всё

#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;
}
Спасибо сказали: