驱动调试(六)利用中断打印
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
表示当前进程的nameHZ
也是一个宏,代表每S的频率,比如每隔10ms加1,那么HZ就等于100参数的
regs
表示原有的寄存器,用他来查看进来之前普通函数的lr
参考
https://www.cnblogs.com/lifexy/p/8024415.html
转载于:https://www.cnblogs.com/zongzi10010/p/10272077.html
驱动调试(六)利用中断打印相关推荐
- 从零开始之驱动发开、linux驱动(六十七、内核调试篇--printk使用)
printk的使用我们在内核,驱动调试的时候使用的非常多 比如前面在调试usb驱动的时候 #include <linux/init.h> #include <linux/usb/in ...
- 嵌入式软件之裸板与驱动调试
目录 一.裸板调试 1.1 点灯法 1.2 串口调试 1.3 JTAG原理 1.4 JTAG调试 二.驱动调试 2.1 printk调试 2.1.1 printk原理 2.1.2 printk的使用 ...
- [linux kernel] 内核下ksz8081驱动调试
系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 - ...
- Linux下按键设备驱动开发以及对中断的上半部分和下半部分详细介绍
文章目录 一.编写并且加载设备树插件 (1)检测管脚是否占用 (2)添加设备树插件 (3)加载设备树插件 二.中断相关函数 (1)request_irq中断注册函数 (2)free_irq中断注销函数 ...
- 触摸屏gt9xx系列芯片驱动调试
平台:STM32MP157 触摸屏芯片:gt911 驱动:goodix.c 现在很多平台都使用gt9xx系列的触摸屏,我在imx6dl平台和imx6ull平台都调试过这个芯片. 这次刚好调试157平台 ...
- 初级驱动调试笔记-总结
文章目录 一.拿到开发板的第一步 二.调试第一步 三.Makefile说明 3.1 内核版本说明 3.2 Makefile文件 3.3 Makefile 与Kconfig的关系 3.4 defconf ...
- 驱动调试(二)-环形缓冲区到文件
目录 驱动调试(二)-环形缓冲区到文件 目标 框架分析 虚拟文件系统proc dmesg proc_misc_init kmsg_read do_syslog 程序1创建文件 程序2提供读函数 程序3 ...
- android 电容屏(二):驱动调试之基本概念篇
关键词:android 电容屏 tp 工作队列 中断 多点触摸协议 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0 平台:S5PV310(sams ...
- Linux驱动调试中的Debugfs的使用简介
Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...
- Linux驱动调试中的Debugfs的使用简介 CONFIG_DEBUG_FS 的功能与配置
Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...
最新文章
- 深入解析Android关机
- mysql 插入数据后返回该条数据id
- 乔治华盛顿大学计算机科学专业,乔治华盛顿大学计算机专业排名如何
- CenOS7中使用Docker安装配置Redis(数据持久化与数据卷映射)
- 那个抗血栓机器人_礼来抗血栓药物普拉格雷(Effient)不及波利维(Plavix)
- java时间类Date、Calendar及用法
- 青海师大c语言研究生专业课_【考研资讯】多所高校更改专业课科目!考研人还能再怎么惨?...
- flask对mysql数据库增删改查_flask后台框架1.4(mysql配置+数据库增删改查)-Go语言中文社区...
- 从RedHat到MongoDB,开源商业软件是如何占领世界的
- mysql数据库工程师考证题_100道MySQL常见面试题总结
- HTC官方通用解锁教程(附一键解锁工具)
- 使用 RuPengGame游戏引擎包 建立游戏窗体 如鹏游戏引擎包下载地址 Thread Runnable 卖票实例...
- 【PM模块】基础概念简介
- Python 使jupyter notebook 从指定浏览器启动 以及编程中途更换浏览器
- android qq分享图文中的图标不显示问题的解决
- 降噪效果好的蓝牙耳机该怎么选?盘点四款高品质降噪蓝牙耳机
- process on画流程图和思维导图总结
- 用无线插板控制RC(远程遥控)小车
- 186、项目超过255个摄像机怎么分配IP地址
- PS如何制作粉尘手绘飞溅涂鸦效果