Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中终止信号处理程序的执行_C_Linux_Raspberry Pi - Fatal编程技术网

在c中终止信号处理程序的执行

在c中终止信号处理程序的执行,c,linux,raspberry-pi,C,Linux,Raspberry Pi,我目前正在从事一个项目,涉及使用SPI通信将ADC与Ras.-Pi接口。在这个项目中,我使用定时器控制SPI的初始化,然后定时器启动一个信号处理器。在信号处理器中,SPI传输发生,值存储在一个变量中,我在线程中访问这个变量,并将接收到的值存储在数组中。 代码运行,但程序从未从信号处理程序中出来。我希望处理程序每次处理一个值时都跳转到线程来存储接收到的值。 有人能给我指一些可靠的东西吗 void getSPIvalues(){ // A new Thread which runs parallel

我目前正在从事一个项目,涉及使用SPI通信将ADC与Ras.-Pi接口。在这个项目中,我使用定时器控制SPI的初始化,然后定时器启动一个信号处理器。在信号处理器中,SPI传输发生,值存储在一个变量中,我在线程中访问这个变量,并将接收到的值存储在数组中。 代码运行,但程序从未从信号处理程序中出来。我希望处理程序每次处理一个值时都跳转到线程来存储接收到的值。 有人能给我指一些可靠的东西吗

void getSPIvalues(){ // A new Thread which runs parallel and get the values from ADC over SPI
    printf("inside thread function\n");
    timer_useconds(100, 1);
    spiValues[i] = rawData;
    printf("from thread, value = %d\n", spiValues[i]);
    i++;
}

void signalHandler(int sig){ 
    printf("inside handler function\n");
    PWMGenerate(0, 26, 2);  //Zyklus = 960 ns, Freuquency = 1,1 MHz, duty clycle= 8 %
    char data[2];
    bcm2835_spi_transfern(data, sizeof(data));
    rawData = (int)(data[0] << 8 | data[1]);
    bcm2835_gpio_write(PIN, LOW);
}

    //Handler Installation
    memset(&sa, 0, sizeof(sa));
    sigemptyset(&sa.sa_mask);
    sa.sa_handler = &signalHandler;
    sigaction(SIGVTALRM, &sa, NULL);
void getSPIvalues(){//一个新线程,它并行运行并通过SPI从ADC获取值
printf(“内部线程函数\n”);
定时器使用秒(100,1);
spiValues[i]=原始数据;
printf(“来自线程,值=%d\n”,spiValues[i]);
i++;
}
无效信号处理器(int sig){
printf(“内部处理函数\n”);
PWMGenerate(0,26,2);//Zyklus=960ns,频率=1,1MHz,占空比=8%
字符数据[2];
bcm2835_spi_传输(数据、大小(数据));

rawData=(int)(数据[0]如果我理解正确,您希望在进程执行的每x useconds(而不是像SIGVTALRM对我暗示的那样,在挂钟时间)进行一次“状态更新”)

最安全、最简单的方法是发送,而不是将该信号传递给信号处理程序

在生成任何线程之前,请使用
pthread\u sigmask
至少SIG\u阻止SIGVTALRM。所有新线程都将继承该信号掩码。然后,生成状态线程detached,它设置一个有效期间虚拟时钟计时器和循环,等待接受VTALRM:

static void *
my_status_thread(void *ignored) { // spawn me with VTALRM blocked
    sigset_t desired;             // for me and everyone else!

    sigemptyset(&desired);
    sigaddset(&desired, SIGVTALRM);

    set_itimer_virtual(100, 1);  // setitimer()

    while (1) {
        int s;
        (void)sigwait(&desired, &s);
        // we got VTALRM, pull the data
        PWMGenerate(...);
        ....
        printf("value is %d\n", ...);
    }

    return NULL; // not reached
}
在一边 使用信号处理程序可以正确执行此操作

这是非常细微的差别,细微差别很重要。你可能应该知道这一点以及原因。这是一种信号处理(注册的“处理者”或“行为”)是一个全局进程属性,尽管信号传递本身和信号屏蔽是每个线程的。这就是为什么您会关心的原因。在信号处理程序中可以安全调用的函数非常少。这
sigeptyset(&sa.sa_mask)
在我看来,有点像货物崇拜,你几乎可以肯定,在任何重要的处理程序中都需要一个完整的面具


即使这样,它也不值得。信号接受是一种优于传递的习惯用法:在安全的时间和地点对信号做出反应。

信号处理程序不应该像看上去那样做繁重的工作。事实上,信号处理程序中永远不应该调用许多函数,包括
printf
。请看,我建议您创建一个最小的工作示例来说明您的问题。这将使每个人都更容易进行测试,甚至您自己也可能会发现流程中发生了什么。嗨,printf if仅用于检查是否调用了处理程序。即使我省略printf,程序也不会从处理程序中出现。您能理解吗什么代码支持信号处理程序?@KaustubhBhargava即使我省略了printf,程序也不会从处理程序中出来。这是因为你不能安全地调用函数,比如
bcm2835\u spi\u transfern()
bcm2835\u gpio\u write()
从信号处理器内部。句号。你不能。非常感谢你的回答。你说得对,我不需要每隔x useconds更新状态,但我希望每隔x useconds从我的ADC接收值。我希望接收受到中断控制。因为操作系统对中断有限制,所以我走了这条路。Th你建议的方法看起来不错,我试试看,然后告诉你。