1 问题
假设在驱动中,写入while(1),则加载模块后,一直无log输出,无法定位问题。
2 定时器
当内核中断产生时,会做以下几步:
1)pc-4(计算返回地址值),然后将各个寄存器值存到sp栈里
2)获取中断号,获取sp地址,然后调用asm_do_IRQ()
为了解决上述问题,在定时中断中,若发现一个进程10s内不断获取的进程,则打印PC值等。在asm_do_IRQ中加入
#ifdef 1
static 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);
}
}
#endif
获取PC值后,定位问题。