使用linux create_timer和sigaction API时出现分段错误

时间:2015-08-23 17:32:36

标签: c linux timer segmentation-fault sigaction

我试图将以下代码集成到一个运行在ARM< - > DSP系统上的更大的程序(不幸的是,我无法分享):

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <time.h>

#define CLOCKID CLOCK_REALTIME
#define SIG SIGUSR1

timer_t timerid;

int i = 0;
int sec = 0;

volatile int keep_going = 1;

clock_t curr_time = 0, t_old = 0;

static void handler(int sig)
{
    curr_time = clock();
    if ((curr_time - t_old)/CLOCKS_PER_SEC >= 10.)
    keep_going = 0;
}

int main(int argc, char *argv[])
{
    struct sigevent sev;
    struct itimerspec its;
    long long freq_nanosecs;
    sigset_t mask;
    struct sigaction sa;
    memset(&sa, 0, sizeof sa);

    // Timer settings
    printf("Establishing handler for signal %d\n", SIG);
    sa.sa_flags = SA_SIGINFO;
    sa.sa_handler = handler;
    sigemptyset(&sa.sa_mask);
    sigaction(SIG, &sa, NULL);

    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIG;
    sev.sigev_value.sival_ptr = &timerid;
    timer_create(CLOCKID, &sev, &timerid);

    /* Start the timer */
    its.it_value.tv_sec = 0;
    its.it_value.tv_nsec = 1000;
    its.it_interval.tv_sec = its.it_value.tv_sec;
    its.it_interval.tv_nsec = its.it_value.tv_nsec;

    timer_settime(timerid, 0, &its, NULL);
    t_old = clock();
    while(keep_going);
    printf("%f sec passed..\n", (double)(curr_time - t_old)/CLOCKS_PER_SEC);
    exit(EXIT_SUCCESS);
}

正如您所看到的,这是一个非常简单的代码,当它在系统上自行运行时,它可以正常工作。这里的while循环仅用于演示,可以忽略。 处理程序和初始化步骤是相同的​​。

当我尝试将其与更大的程序集成时,问题就出现了 - 突然,如果我将定时器间隔设置为短于10毫秒,则会出现分段错误。

我试图将处理程序中的操作减少到一个简单的行,&#39; curr_time = 0&#39;,认为它可能与处理程序中的浮点运算有关,但它没有做到帮助

应该注意的是,我使用连续内存分配API用于ARM&lt; - &gt; DSP共享内存缓冲区,但我怀疑它与它有什么关系,因为我没有在处理程序中分配任何新内存

那么,有没有人知道分段错误的可能原因?

0 个答案:

没有答案