21dinglei 发表于 2013-06-20 13:52

回复 4# Dsheng
谢谢回复!CPU处理这个线程的时间不会超过4mS,具体操作可精简。线程使用的是sched_FIFO。TICK值更改应该要慎重吧?我也认为,Linux对于处理mS级的实时不应该这么烂。那么,你认为问题的关键是在哪里?


   

21dinglei 发表于 2013-06-20 13:55

回复 9# mordorwww

单个线程运行都是没有问题的,不会出现丢失现象,但是,如果添加了线程调度,或进程调度,就会出现事件丢失的现象。这个,我是利用input子系统来从内核给用户传事件的,读取事件采用的是阻塞的read。
谢谢!

   

21dinglei 发表于 2013-06-20 13:58

回复 8# duanius

谢谢回复!

曾尝试过剥离用户层工作,想把实时性的搬移到内核来做,但是上层的业务底层根本无法实现。所以只能啃这块骨头了!

谢谢!
   

blake326 发表于 2013-06-20 15:49

哪个kernel? hrtimer 开了吗?
应该是进程调度的问题

Dsheng 发表于 2013-06-20 17:20

是啊,你这内核版本是多少?
一个线程能及时调度,多线程后,处理事件的线程就不能得到及时响应?
这多个线程的优先级怎么设置的?

21dinglei 发表于 2013-06-20 19:55

回复 14# Dsheng
内核版本是2.6.32

单个线程是能够及时响应的,如果添加另外的线程,响应事件的这个线程就会出现事件丢失现象。如果创建的是普通线程create_normal_pthread,就不会丢失。但是,要求又不能是普通线程,必须是实时线程,并有自己的优先级表。

create_pthread(&atid, SCHED_FIFO, 30,(start_r)FUNC1)//线程1用来响应中断事件
create_pthread(&btid, SCHED_FIFO, 15,(start_r)FUNC2)//线程2仅是执行一些加减运算

其中线程1中:
fd = open("/dev/input/event4", O_RDONLY); //event4为注册的input事件
...
while(1)
{
      ...
      read(fd,&buf,sizeof(struct input_event));
      code = buf.code;
      switch(code)//判断输入事件是否是中断事件
      case KEY_F1://假设KEY_F1就是输入的中断事件
      test = test^1;
      ioctl(fd_test,test);//调用测试GPIO驱动响应(fd_test只是为了用方便测量响应是否满足要求,当有中断事件发生时,相应GPIO状态翻转,方便用示波器测量)
      ...
}

丢失事件的现象貌似是有规律的,基本上正常响应两百多个中断后就会丢失10个左右的中断,然后又回复正常,依次循环。

谢谢!

   

21dinglei 发表于 2013-06-20 20:21

回复 13# blake326

谢谢!
内核版本2.6.32
给14楼回复的比较详细,还望能看一下。

我也认为是调度产生的问题,至于hrtimer,这个倒真没有用到,我的操作如下:
驱动层注册了GPIO的中断,用来接收外部4mS的中断信号。在中断回调函数里input_event上报事件,用户层阻塞read这个事件。结构较为简单。

不知道hrtimer对这种应用有什么益处,还望指出错误并普及一下知识。

谢谢!
   

Dsheng 发表于 2013-06-20 22:06

我也没想明白,等待高手啊。
对了,你系统里面有没有实时优先级大于30的实时线程啊

blake326 发表于 2013-06-21 10:19

回复 16# 21dinglei


    你有没有做磁盘io。可能睡眠了?

21dinglei 发表于 2013-06-21 11:18

回复 17# Dsheng

呵呵,非常感谢了!
优先级好像不是关键问题,我层将实时优先级设到最高,效果也是一样的。
应该还是和调度有关系。
因为,系统粒度HZ调到1000之后,现象是有好转的,但是未能根除。

   
页: 1 [2] 3 4
查看完整版本: Linux中断响应,使用Linux信号传送机制,内核层发送信号至用户层