首页 > 其他分享 >驱动调试_Panic

驱动调试_Panic

时间:2023-09-06 15:13:48浏览次数:25  
标签:cnt irq pid regs timer current 驱动 Panic 调试

原理:是系统时钟中断永不停息,可在系统时钟中断中添加打印信息。

系统定时器中断中调试(不可打印寄存器reg)

cat /proc/interrupts									//可查看系统定时器中断

/*
 * IRQ handler for the timer
 */
static irqreturn_t										//linux-2.6.22.6\arch\arm\plat-s3c24xx\time.c
s3c2410_timer_interrupt(int irq, void *dev_id)			//系统定时器中断,视频介绍是5ms 触发一次
{
	////////////////////////////////////////////////
	/* 如果10秒钟之内都是同一个进程在运行,就打印*/
	static pid_t pre_pid;
	static inti cnt=0;
	if (pre_pid == current->pid){
		cnt ++
	}else{
		cnt = 0;
		pre_pid = current->pid;
	}
	if (cnt == 10*HZ){
		cnt = 0;
		printk("s3c2410_timer_interrupt : pid = %d, task_name = %s\n", current->pid, current->comm);
	}
	////////////////////////////////////////////////


	write_seqlock(&xtime_lock);
	timer_tick();
	write_sequnlock(&xtime_lock);
	return IRQ_HANDLED;
}
static struct irqaction s3c2410_timer_irq = {
	.name		= "S3C2410 Timer Tick",
	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
	.handler	= s3c2410_timer_interrupt,
};

中断处理函数中调试,与上面有区别,可以打印出pc值

asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)				//中断处理函数,与上面有区别,可以打印出pc值   	linux-2.6.22.6\arch\arm\kernel\irq.c
{
	struct pt_regs *old_regs = set_irq_regs(regs);
	struct irq_desc *desc = irq_desc + irq;

	/*
	 * Some hardware gives randomly wrong interrupts.  Rather
	 * than crashing, do something sensible.
	 */
	if (irq >= NR_IRQS)
		desc = &bad_irq_desc;

	////////////////////////////////////////////////
	if(irq == 30)		//即等于系统定时器中断
	{
		/* 如果10秒钟之内都是同一个进程在运行,就打印*/
		static pid_t pre_pid;
		static inti cnt=0;
		if (pre_pid == current->pid){
			cnt ++
		}else{
			cnt = 0;
			pre_pid = current->pid;
		}
		if (cnt == 10*HZ){
			cnt = 0;
			printk("asm_do_IRQ : pid = %d, task_name = %s\n", current->pid, current->comm);
			printk("pc = %08x\n", regs->ARM_pc);											//打印出PC,确定函数
		}
	}
	////////////////////////////////////////////////

	irq_enter();

	desc_handle_irq(irq, desc);

	/* AT91 specific workaround */
	irq_finish(irq);

	irq_exit();
	set_irq_regs(old_regs);
}



./firstdrvtest on 
	asm_do_IRQ => s3c2410_timer_interrupt : pid = 752, task name = firstdrvtest
	pc = bf000084
	asm_do_IRQ => s3c2410_timer_interrupt : pid = 752, task name = firstdrvtest
	pc = bf000084   											// 对于中断, pc-4才是发生中断瞬间的地址

参考:韦东山Linux教程

标签:cnt,irq,pid,regs,timer,current,驱动,Panic,调试
From: https://www.cnblogs.com/charlie12345/p/17682318.html

相关文章

  • 驱动调试_Oops
    a.作为模块:1.根据pc值确定该指令属于内核还是外加的模块 pc=0xbf000018它属于什么的地址?是内核还是通过insmod加载的驱动程序? 先判断是否属于内核的地址:看System.map确定内核的函数的地址范围:c0004000~c03265a4 如果不属于System.map里的范围,则它属于insmod加载的驱动......
  • 驱动调试_prink
    驱动调试之printk的原理UBOOT传入console=ttySAC0console=tty11.内核处理UBOOT传入的参数 __setup("console=",console_setup); //当内核处理参数时,会调用console_setup来处理 //Linux-4.9.88\kernel\printk\printk.c console_setup add_preferred_console//我想用......
  • android调试工具--dumpsys
    dumpsys执行格式为:dumpsys[option] 其中option参数可以为service和acitivity,参数service可以是系统中任意一个服务,比如meminfo服务显示内存信息,cpuinfo现实cpu信息参数acitivity可以现实所有的activity信息......
  • 20.2 设备树中的 platform 驱动编写
    一、设备树下的platform驱动  platform驱动框架分为总线、设备和驱动,总线不需要我们去管理,这个是Linux内核提供。在有了设备树的前提下,我们只需要实现platform_driver即可。 1. 修改pinctrl-stm32.c文件   先复习一下pinctrl子系统和gpio子系统,pinctrl子......
  • “数据驱动”时代,企业为什么需要实时湖仓?
    当谈到数据湖的时候,大家都在说,可以把所有数据(结构化/半结构化/非结构化)一股脑都丢进去,进行统一的元数据管理。然后上层计算对接,进行流批计算/OLAP分析/算法分析。这个没问题,数据湖确实能承接底层的这部分能力,但是同时出现的问题也是不容忽视的。本文将关注讨论,利用湖仓架构,统一......
  • Windows驱动程序是支持多线程【chatgpt】
    是的,Windows驱动程序是支持多线程的。驱动程序是运行在操作系统内核空间的软件模块,可以通过创建和管理多个线程来实现并发处理的能力。通过多线程,驱动程序可以同时处理多个请求或事件,提高系统的响应性能和并发处理能力。在Windows驱动程序的开发中,可以使用内核模式线程来执行异步......
  • Java反序列化:CommonsCollections5调试分析
    基础知识1.BadAttributeValueExpException相关源码可以看到这个异常类的支持序列化和反序列化,同时在反序列化readObject函数中会涉及到toString函数publicclassBadAttributeValueExpExceptionextendsException{/*Serialversion*/privatestaticfinal......
  • 记录--CSS 滚动驱动动画 scroll()
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助CSS滚动驱动动画scroll()animation-timeline通过scroll()指定可滚动元素与滚动轴来为容器动画提供一个匿名的scrollprogresstimeline.通过元素在顶部和底部(或左边和右边)的滚动推进scrollprogresst......
  • LED汽车尾灯驱动IC 3~36v输出电流AP5165B降压恒流芯片
    产品描述AP5165B是一款外围电路简单的连续电流模式的降压型LED恒流驱动芯片。在输入电压高于LED电压时,可以有效地用于驱动一颗或者多颗串联LED。输出电流可调,最大可达1A。适用于3-36V电压范围的非隔离式恒流LED驱动领域。AP5165B内置功率开关和一个高端电流检测电路,可以......
  • LED灯降压恒流驱动芯片5~60v输出1.5A大电流AP51656
    产品描述AP51656是一款连续电感电流导通模式的降压恒流源,用于驱动一颗或多颗串联LED输入电压范围从5V到60V,输出电流最大可达1.5A。根据不同的输入电压和外部器件,可以驱动高达数十瓦的LED。内置功率开关,采用高端电流采样设置LED平均电流,通过DIM引脚可以接受模拟调光和......