rtlsigirq_app.c

来自「fsmlabs的real time linux的内核」· C语言 代码 · 共 104 行

C
104
字号
/* * (C) Finite State Machine Labs Inc. 2000 business@fsmlabs.com * * Released under the terms of GPL 2. * Open RTLinux makes use of a patented process described in * US Patent 5,995,745. Use of this process is governed * by the Open RTLinux Patent License which can be obtained from * www.fsmlabs.com/PATENT or by sending email to * licensequestions@fsmlabs.com */#include <stdio.h>#include <rtlinux_signal.h>unsigned long marker = 0;volatile unsigned long *marker_ptr = &marker;void handler(int unused){	*marker_ptr = 1;}int main(int argc, char **argv){	int i = 10;	struct rtlinux_sigaction sig, oldsig;	rtlinux_sigset_t myset, oldset;	int irq = 0;	if (argc != 2) {		fprintf(stderr, "%s IRQ#\n", *argv);		return -1;	}	irq = atoi(argv[1]);	fprintf(stderr, "Waiting for irq %d\n", irq);	if ((rtlinux_sigemptyset(&myset)) != 0) {		perror("rtlinux_sigemptyset(&myset)");		return (-1);	}	if ((rtlinux_sigaddset(&myset, irq)) != 0) {		perror("rtlinux_sigaddset(&myset, irq)");		return (-1);	}	sig.sa_handler = handler;	sig.sa_flags = RTLINUX_SA_ONESHOT;	if (rtlinux_sigaction(irq, &sig, &oldsig)) {		printf("Couldn't get irq\n");		perror("rtlinux_sigaction");		return -1;	}	if ((rtlinux_sigprocmask(RTLINUX_SIG_BLOCK, &myset, &oldset)) != 0) {		perror		    ("rtlinux_sigprocmask(RTLINUX_SIG_BLOCK, &myset, &oldset)");		return (-1);	}	*marker_ptr = 0;#ifdef RTL_PSC_SIGMASKS_WORK_CORRECTLY	while (i--) {		sleep(1);		if (*marker_ptr) {			/* free the irq */			sig.sa_handler = RTLINUX_SIG_IGN;			rtlinux_sigaction(irq, &sig, &oldsig);			fprintf(stderr,				"oops, handler got called at wrong time\n");			return -1;		}	}#endif	if ((rtlinux_sigprocmask(RTLINUX_SIG_UNBLOCK, &myset, &oldset)) !=	    0) {		perror		    ("rtlinux_sigprocmask(RTLINUX_SIG_BLOCK, &myset, &oldset)");		return (-1);	}	i = 10;	while (i--) {		sleep(1);		if (*marker_ptr) {			/* free the irq */			sig.sa_handler = RTLINUX_SIG_IGN;			rtlinux_sigaction(irq, &sig, &oldsig);			return 0;		}	}	/* free the irq */	sig.sa_handler = RTLINUX_SIG_IGN;	rtlinux_sigaction(irq, &sig, &oldsig);	printf("marker unchanged\n");	return -1;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?