2487|4

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

中断处理程序里的等待机制出错 [复制链接]

我编写了一个AT91RM9200平台下使用armlinux的设备驱动,主要功能是在中断程序里面读外设FPGA产生的数据,然后通过read系统调用传给用户空间,特殊一点的地方是外设需要由我自己启动。这里贴出有关的几个程序:
  驱动部分:
// 全局变量声明
wait_queue_head_t mywq;
unsigned char f_rcv_over; //外设数据接收完标志   
//驱动回调函数
static ssize_t my_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
  {
    (*(u32*)AIC_ICCR_VA) = (0x1<      writew(0x0000,FPGA_DATA_VA[0]); //启动外设,使之产生数据
     enable_irq(myFpgaMobile_IrqNum);//允许AT91接收中断
     wait_event_interruptible(mywq,(f_rcv_over==1));//阻塞读进程,等待唤醒
     f_rcv_over=0;
     copy_to_user(buffer,mydata,count);//向用户空间传输数据
  }

void my_IrqHandler(int irq,void *dev_id, struct pt_regs *regs)//中断处理程序
{  //关中断及接收FPGA产生的数据
     ....
   //数据接收完并存放于mydata数组中,以下设置标志并唤醒被阻塞的读进程
    f_rcv_over=1;
    wake_up_interruptible(&mywq);
}

static int init_module(void) //驱动模块初始化程序
{ ......
  init_waitqueue_head(&mywq);//初始化等待队列
  ......
}

  用户应用程序部分:
  void main(void)
{  ......
  read(fpga_dev,mydata_buffer,data_length); //fpga_dev是外设的描述符
  for(i=0;i     printf("0x%x,"mydada_buffer);
  ......
}

  程序编译能通过,现在每次中断处理程序运行到wake_up_interruptible(&mywq)一句是就会出错,程序完全死掉,同时中断程序接收数据的速度也很慢。如果不使用等待机制,改成如下的形式,程序工作正常,且中断接收处理也很快:
static ssize_t my_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
  {
    (*(u32*)AIC_ICCR_VA) = (0x1<      writew(0x0000,FPGA_DATA_VA[0]); //启动外设,使之产生数据
     enable_irq(myFpgaMobile_IrqNum);//允许AT91接收中断
     while(1){
        if(f_rcv_over==1) break;   
     }
     f_rcv_over=0;
     copy_to_user(buffer,mydata,count);//向用户空间传输数据
  }

void my_IrqHandler(int irq,void *dev_id, struct pt_regs *regs
{  //关中断及处理接收到的数据
     ....
   //数据接收完,并存放于mydata数组中,以下设置数据接收完标志
    f_rcv_over=1;
}

  请问,为什么使用等待机制不能正常工作呢?起初怀疑跟我的头文件有关系,但后来检查了又好像不是这个原因。头文件列出如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

最新回复

已经解决,问题源于采用的内核版本和编译器版本不一致。内核是2.4.19, 编译器用的arm-gcc3.3.2 。 改为 2.95.3可以解决  详情 回复 发表于 2009-1-8 17:03
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不懂,学习...
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
wait_event_interruptible(mywq,(f_rcv_over==1));//阻塞读进程,等待唤醒

init_waitqueue_head(&mywq);//初始化等待队列

------
一个传对象,一个传地址,会否是其中一个有问题?
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
按照《linux设备驱动程序》,这两个函数的写法都没错,编译是能通过的
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
已经解决,问题源于采用的内核版本和编译器版本不一致。内核是2.4.19, 编译器用的arm-gcc3.3.2 。 改为 2.95.3可以解决
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表