字符设备中断处理问题

ABitTrouble 2011-03-19 12:33:10
各位好,本人基于ARM —— FPGA —— 串口写了一个Linux驱动程序,详细内容如下:
FPGA接收串口数据,只要接收到数据就拉高连接ARM的中断线,
ARM的中断线是高电平触发,用中断触发方式接收数据,我写了一个字符驱动程序,
在read函数中interruptible_sleep_on(&wq)阻塞读取,
在中断服务程序中读出FPGA的寄存器中的数据放入字符数组buffer中,
然后wake_up_interruptible(&wq)唤醒等待队列,让用户的read读出数据,现在问题出来了,串口发出的数据量很大,
字符数组buffer一次放不下,我让中断到达字符数组buffer大小就退出中断,让用户程序把数据读走,
可中断出来之后,用户没来得及读数据又发生中断了,造成数据丢失。
我如何保证用户把数据读走再处理中断,请给一个简单示例或者说说原理,不胜感激!
...全文
215 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ABitTrouble 2011-03-21
  • 打赏
  • 举报
回复
我在read函数中使用spin_lock_irq怎么禁止不了外部中断,不是说能够禁止本地CPU的硬件中断吗?
我的中断时共享中断,但我想屏蔽处理其它事情,再开中断。
bolin123 2011-03-19
  • 打赏
  • 举报
回复
在read函数中interruptible_sleep_on(&wq)中后面加上disable_irq(int irq)函数取消中断,到read函数退出的时候在打开中断enable_irq(int irq);
ABitTrouble 2011-03-19
  • 打赏
  • 举报
回复
但我有一个疑问,用自旋锁中间的语句执行时间要短,但copy_to_user向用户空间拷数据时会休眠,这是不是冲突,也就是说这么用不合适。
ABitTrouble 2011-03-19
  • 打赏
  • 举报
回复
谢谢你!
我刚才看了一下自旋锁,用spin_lock_irq和spin_unlock_irq来加锁并禁止中断应该可以,等我试试看。
bolin123 2011-03-19
  • 打赏
  • 举报
回复
用自旋锁试试
ABitTrouble 2011-03-19
  • 打赏
  • 举报
回复
取消中断合适吗?有没有更好的办法?
我一开始也想这么干,可看看串口驱动(现在还没有看懂)好像不是这么干的,它好像是向tty push数据,后边处理时工作队列,不知道它怎么能保证缓冲区满就把数据给用户的,而不被中断影响;没看明白,有人能帮忙讲解一下吗?
ABitTrouble 2011-03-19
  • 打赏
  • 举报
回复
补充一下,我是在Linux下开发的驱动。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧