gpt4 book ai didi

c - 在 Linux 内核中处理 UART 轮询期间的 CTRL-C

转载 作者:行者123 更新时间:2023-11-30 17:51:34 28 4
gpt4 key购买 nike

我读取了一个系统调用,如下所示:

ssize_t serp_read(struct file *filep, char __user *buf, size_t count, loff_t *offp){
ssize_t cnt;
char *buffer;
int i;

buffer = kmalloc(count * sizeof(char), GFP_KERNEL);

for (i = 0; i != count; ++i) {
buffer[i] = UART_read();
if(buffer[i] == '\n')
break;
}

cnt = copy_to_user(buf, buffer, i);
kfree(buffer);
if(cnt) {
printk("Error in copy_to_user() cnt is %d\n", cnt);
i -= cnt; /* bytes successfully copied */
}

return i;
}

UART_read() 是

unsigned char UART_read(void){
unsigned int buf;
if( ( inb(UART + UART_LSR) & UART_LSR_FE ) == 1){
printk("KERNEL - Framing error"); return -1;}
else if( ( inb(UART + UART_LSR) & UART_LSR_PE ) == 1){
printk("KERNEL - Parity error"); return -1;}
else if( ( inb(UART + UART_LSR) & UART_LSR_OE ) == 1){
printk("KERNEL - Overrun error"); return -1;}

while( ( ( inb(UART_LSR + UART) ) & UART_LSR_DR ) == 0 ){
schedule();
}
buf = inb(UART);
return (char)buf;
}

在我的测试程序中我调用它

    rb = read(fd, buffer, sizeof(buffer));
if ( rb < 0){
perror("Error");
}
else {
buffer[rb] = '\0';
}

因此,从我在测试程序中调用它的那一刻起,除非 UART 获取一些字符,否则我无法退出。但我希望能够中断这个过程。我可以做一个普通的处理程序来处理 CTRL-C 吗?或者我必须做一些不同的事情才能达到同样的效果?如果调用了处理程序,内核程序随后会去哪里?或者如果我在测试程序中只有一个普通的处理程序,内核中会发生什么?它到底有用吗?

此外,内核代码是一个程序,而测试程序则是另一个程序。

最佳答案

我相信您可以做的是在应用程序级别编写一个信号处理程序,捕获 SIGINT (ctrl+c) 或您选择的任何信号(前提是我们可以处理这些信号)

并从信号句柄调用 IOCTL 调用到内核内部的驱动程序反过来应该重新安排您的内核读取可能是逻辑的变化,如下所示

您需要在内核中实现 IOCTL 调用以及此

 /** This NO_SIGNAL_FROM_USER is a GLOBAL variable at kernel 
which should be set based on your IOCTL**/

while( (( ( inb(UART_LSR + UART) ) & UART_LSR_DR ) == 0 ) && (NO_SIGNAL_FROM_USER)){
schedule();
}

阅读时会发生一些变化

for (i = 0; i != count && NO_SIGNAL_FROM_USER ; ++i) {
buffer[i] = UART_read();
if(buffer[i] == '\n')
break;
}
/*** RESET THE SIGNAL HERE AGAIN ***/

P.S - 哎呀忘记了,您可能还需要在用户应用程序中的信号处理程序中进行更多处理,但这又取决于我的猜测。

关于c - 在 Linux 内核中处理 UART 轮询期间的 CTRL-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16653965/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com