title: 16-驱动调试(六)利用中断打印
date: 2019/1/15 23:35:14
toc: true
---

原理

  • 这一章节也没啥新知识,原理就是利用系统时钟的中断,去打印一些信息.

  • 在进入中断之前,会保存现场,包括LR,可以打印这个LR就能看到,定时器中断是普通中断,保存现场的时候已经将返回地址+4到LR寄存器,这个是硬件决定的,所以我们查找这个返回地址的时候减去4.

保护现场

  • 硬件自动保存

    • 保存当前的cpsr到中断下的scpsr
    • 保存返回地址到LR寄存器,(某种异常模式的LR等于被中断的下一条指令的地址)它有可能是PC + 4有可能是PC + 8,到底是那种取决于不同的情况
  • 软件需要做的stmdb sp!, {r0-r12, lr}

    • 保存R0~R12寄存器

    • 保存LR寄存器,注意这个保存之后是退出中断的返回地址,因为ARM架构的原因,不同的中断异常有不同的返回地址,所以需要对这个LR先进行一些运算再保存.偏移地址如下:举个例子比如UDEF异常,只需要直接复制,而FIQ则需要保存LR+4

      BL      MOV PC, R14
      SWI     MOVS PC, R14_svc
      UDEF    MOVS PC, R14_und
      FIQ     SUBS PC, R14_fiq, #4
      IRQ     SUBS PC, R14_irq, #4
      PABT    SUBS PC, R14_abt, #4
      DABT    SUBS PC, R14_abt, #8 

死循环判断流程

记录pid,如果pid一直是同一个并且大于10s,打印这个pid和LR

asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
{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;#ifdef 1static pid_t pre_pid;                    //进程号  static int cnt=0;                          //计数值if(irq==30)          //判断irq中断号,是否等于系统时钟{  if(pre_pid==current->pid){   cnt++;}else{cnt=0;   pre_pid=current->pid;}if(cnt==10*HZ)   //超时10s{cnt=0;printk("s3c2410_timer_interrupt : pid = %d, task_name = %s\n",current->pid,current->comm);printk("pc = %08x\n",regs->ARM_pc);}
}
#endifirq_enter();desc_handle_irq(irq, desc);/* AT91 specific workaround */irq_finish(irq);irq_exit();set_irq_regs(old_regs);
}

代码简单解释

  • 中断号是30,在include\asm-arm\arch-s3c2410\Irqs.h,或者使用cat /proc/interrupt查看

  • current->pid:当前进程的PID号
  • current->com表示当前进程的name

  • HZ也是一个宏,代表每S的频率,比如每隔10ms加1,那么HZ就等于100

  • 参数的regs表示原有的寄存器,用他来查看进来之前普通函数的lr

参考

https://www.cnblogs.com/lifexy/p/8024415.html

转载于:https://www.cnblogs.com/zongzi10010/p/10272077.html

驱动调试(六)利用中断打印相关推荐

  1. 从零开始之驱动发开、linux驱动(六十七、内核调试篇--printk使用)

    printk的使用我们在内核,驱动调试的时候使用的非常多 比如前面在调试usb驱动的时候 #include <linux/init.h> #include <linux/usb/in ...

  2. 嵌入式软件之裸板与驱动调试

    目录 一.裸板调试 1.1 点灯法 1.2 串口调试 1.3 JTAG原理 1.4 JTAG调试 二.驱动调试 2.1 printk调试 2.1.1 printk原理 2.1.2 printk的使用 ...

  3. [linux kernel] 内核下ksz8081驱动调试

    系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 - ...

  4. Linux下按键设备驱动开发以及对中断的上半部分和下半部分详细介绍

    文章目录 一.编写并且加载设备树插件 (1)检测管脚是否占用 (2)添加设备树插件 (3)加载设备树插件 二.中断相关函数 (1)request_irq中断注册函数 (2)free_irq中断注销函数 ...

  5. 触摸屏gt9xx系列芯片驱动调试

    平台:STM32MP157 触摸屏芯片:gt911 驱动:goodix.c 现在很多平台都使用gt9xx系列的触摸屏,我在imx6dl平台和imx6ull平台都调试过这个芯片. 这次刚好调试157平台 ...

  6. 初级驱动调试笔记-总结

    文章目录 一.拿到开发板的第一步 二.调试第一步 三.Makefile说明 3.1 内核版本说明 3.2 Makefile文件 3.3 Makefile 与Kconfig的关系 3.4 defconf ...

  7. 驱动调试(二)-环形缓冲区到文件

    目录 驱动调试(二)-环形缓冲区到文件 目标 框架分析 虚拟文件系统proc dmesg proc_misc_init kmsg_read do_syslog 程序1创建文件 程序2提供读函数 程序3 ...

  8. android 电容屏(二):驱动调试之基本概念篇

    关键词:android  电容屏 tp 工作队列 中断 多点触摸协议 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:S5PV310(sams ...

  9. Linux驱动调试中的Debugfs的使用简介

    Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...

  10. Linux驱动调试中的Debugfs的使用简介 CONFIG_DEBUG_FS 的功能与配置

    Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...

最新文章

  1. 深入解析Android关机
  2. mysql 插入数据后返回该条数据id
  3. 乔治华盛顿大学计算机科学专业,乔治华盛顿大学计算机专业排名如何
  4. CenOS7中使用Docker安装配置Redis(数据持久化与数据卷映射)
  5. 那个抗血栓机器人_礼来抗血栓药物普拉格雷(Effient)不及波利维(Plavix)
  6. java时间类Date、Calendar及用法
  7. 青海师大c语言研究生专业课_【考研资讯】多所高校更改专业课科目!考研人还能再怎么惨?...
  8. flask对mysql数据库增删改查_flask后台框架1.4(mysql配置+数据库增删改查)-Go语言中文社区...
  9. 从RedHat到MongoDB,开源商业软件是如何占领世界的
  10. mysql数据库工程师考证题_100道MySQL常见面试题总结
  11. HTC官方通用解锁教程(附一键解锁工具)
  12. 使用 RuPengGame游戏引擎包 建立游戏窗体 如鹏游戏引擎包下载地址 Thread Runnable 卖票实例...
  13. 【PM模块】基础概念简介
  14. Python 使jupyter notebook 从指定浏览器启动 以及编程中途更换浏览器
  15. android qq分享图文中的图标不显示问题的解决
  16. 降噪效果好的蓝牙耳机该怎么选?盘点四款高品质降噪蓝牙耳机
  17. process on画流程图和思维导图总结
  18. 用无线插板控制RC(远程遥控)小车
  19. 186、项目超过255个摄像机怎么分配IP地址
  20. PS如何制作粉尘手绘飞溅涂鸦效果

热门文章

  1. Java-JDK:JDK百科
  2. woff字体找不到导致的404错误
  3. 运行后台程序出现[1]+ Exit
  4. Javascript - Cookie
  5. 英文写作的25个黄金加分句型
  6. 数据流中的中位数 Find Median from Data Stream
  7. delete和truncate的区别
  8. Lucene.Net
  9. vi 中插入当前时间
  10. C#- XPath教程