首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于S3C2440的linux设备驱动程序定时器计数错误

基于S3C2440的linux设备驱动程序定时器计数错误
EN

Stack Overflow用户
提问于 2014-08-27 11:19:38
回答 1查看 83关注 0票数 0

我写了一个linux设备驱动程序,学习红外遥控的编码。

XINT0(GPIOF0)用于接收来自红外二极管的信号。在XINT0中断处理程序中使用Timer0进行计数,记录高电压和低电压的周期。

GPIO和定时器的配置是合适的。TCNTB的Timer0初始值为50000,有时电压电平周期正确,但有时TCNT0观察值为50000,说明定时器工作不正常。

在每个中断循环中,观察值打印如下。

代码语言:javascript
复制
<4>current observation value: 49786
<4>current observation value: 49702
<4>current observation value: 50000
<4>current observation value: 49969
<4>current observation value: 50000
<4>current observation value: 49996
<4>current observation value: 50000
<4>current observation value: 49998
<4>current observation value: 47827
<4>current observation value: 49392
<4>current observation value: 49906
<4>current observation value: 50000
<4>current observation value: 49970
<4>current observation value: 50000
<4>current observation value: 49997
<4>current observation value: 50000
<4>current observation value: 49998
<4>current observation value: 50000

代码如下:

代码语言:javascript
复制
static irqreturn_t gpio_study_irq_handler(int irq, void *wbuf)
{
  unsigned int *buf=(unsigned int *)wbuf;
  unsigned int temp;
  if(0==IrDA_cnt){
    timer_setup(&Study_Timer,MAX_CODE_WIDTH);
    timer_on(&Study_Timer);
    IrDA_cnt++;
    return IRQ_RETVAL(IRQ_HANDLED);
  }
  temp=ioread32(Study_Timer.tcnto);
  timer_off(&Study_Timer);      
  printk("current observation value: %d\n",temp);
  *(buf+IrDA_cnt-1)=MAX_CODE_WIDTH-read_timer_cnt(&Study_Timer);
  iowrite32(MAX_CODE_WIDTH,Study_Timer.tcntb);

  temp=ioread32(Study_Timer.tcon);
  iowrite32(temp|0x02,Study_Timer.tcon);
  temp=ioread32(Study_Timer.tcon);
  iowrite32(temp&(~0x02),Study_Timer.tcon);

  timer_on(&Study_Timer);
  IrDA_cnt++;
  if(IrDA_cnt > CODE_MAX_LEN)
  {
    wake_up_interruptible(&IrDA_Study_Queue);
    return IRQ_RETVAL(IRQ_HANDLED);
  }
  return IRQ_RETVAL(IRQ_HANDLED);
}
EN

回答 1

Stack Overflow用户

发布于 2014-08-27 15:52:29

系统函数IRQ 在服务处理程序中占用太多时间。当定时器最终开启时,中断请求已经到来,导致观察值的恒定值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25518427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档