- 论坛徽章:
- 0
|
printk可以在进程“上下文”和中断“上下文”使用。
什么叫中断上下文呢?进程中关(软)中断,算什么上下文?
不废话了。说点实际的,printk的输出的最少保证条件是什么?输出到哪里?关硬中断或软中断的情况下,信息能输出到串口终端吗?
这个问题做个试验就可以验证了哇,下面给出我给你的验证过程:只截取了部分代码,
在中断上下文中使用:- if (request_irq(virq, Uart_int_irq, 0, "Serial_com_irq", NULL)) { //申请中断处理函数
- printk(KERN_ERR "Serial_com: Serial_com_irq allocation failed\n");
- }
复制代码- static irqreturn_t Uart_int_irq(int irq,void *data)
- {
- printk(KERN_ALERT"recv_data=%u",tmp8);//每次中断的时候打印出接受到的数据,我在调试的时候可以打印出来,当进入到中断处理函数的时候就成为中断上下文
- }
复制代码 在进程上下文中使用:- static struct file_operations serial_com_fops = {
- ioctl: serial_com_ioctl,
- llseek: NULL,
- read: serial_com_read,
- write: serial_com_write,//提供给用户一个写设备的接口
- mmap: NULL,
- poll:serial_com_poll,
- open: serial_com_open,
- release: serial_com_release,
- };
复制代码- static ssize_t serial_com_write(struct file * file, const char * buf, size_t count, loff_t *ppos)
- {
- dev_minor=*(int *)(file->private_data);
- printk("write dev_minor=%d\n",dev_minor);//打印出设备号,这就是在进程上下文,当你调用驱动提供的这个写接口的时候,陷入到内核态的时候其实用的就是当前进程的上下文
- }
复制代码 对于关中断下当然也可以使用,举个最简单的例子:- raw_local_irq_disable();//关中断,有实时补丁的情况下关当前处理器的中断
- printk(KERN_ALERT"start to update .......\n");//调用printk,显示是可以打印,这个我在以前的驱动中也用过
- raw_local_irq_restore();//开中断
复制代码 |
|