簡體   English   中英

終止 c 中信號處理程序的執行

[英]to terminate the execution of signal handler in c

我目前正在從事涉及使用 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);

如果我理解正確,您需要每x u 秒的進程執行“狀態更新”(而不是掛鍾時間,因為 SIGVTALRM 對我來說意味着ITIMER_VIRTUAL )。

最安全、最簡單的方法是接受一個掛起的信號,而不是將該信號傳遞給信號處理程序。

在產生任何線程之前,使用pthread_sigmask到 SIG_BLOCK 至少 SIGVTALRM。 所有新線程都將繼承該信號掩碼。 然后,產生你的狀態線程,分離,它設置一個間隔的虛擬時鍾計時器和循環,等待接受 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
}

在旁邊

可以使用信號處理程序正確執行此操作。

它非常微妙,細微差別很重要。 您可能應該知道sigaction優於signal以及為什么。 該信號處置(注冊的“處理程序”或“行為”)是全局進程屬性,盡管信號傳遞本身和信號屏蔽是每個線程的。 sig_atomic_t並不一定意味着volatile ,以及為什么你會關心。 在信號處理程序中可以安全地調用非常非常少的函數。 在我看來,那個sigemptyset(&sa.sa_mask)有點像貨物,你幾乎可以肯定在任何后續處理程序中都需要一個完整的掩碼。

即使那樣,這也不值得。 信號接受是一種優於傳遞的習慣用法:您在安全的時間和地點對信號做出反應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM