[中断怎么安排优先级呢?急!]

yuzhibing   2009-7-27 13:08 楼主
初学wince,遇到点问题,请教各位大侠:

系统是:s3c2440 + wince5.0
实现目的:FPGA与s3c2440的GPIO通信,使用EINT0和EINT1中断
过程:FPGA有两路信号,每路信号产生的中断间隔是50ms,两路间的中断信号间隔是25ms;当FPGA产生中断信号,s3c2440响应,wince中写的中断IST中读取数据,每次的数据量300bit

出现的问题:为每路信号写了一个驱动,总共2个驱动,当单个驱动加载时,正常响应,接受的数据也正常;当这2个驱动先后加载,都在接受中断信号时,发现只有EINT0正常,而EINT1有响应中断,但接受不到数据。这是怎么回事啊?是没有设置IST的优先级吗?如果要设置,那该如何设置呢?优先级0 - 255,分了4个区间,那该设置为那个区间呢?

请各位大侠指点指点,多谢啦!!

回复评论 (15)

可能跟优先级无关,检查ISR和IST,问题很可能出在这两地方。
点赞  2009-7-27 13:34
还没查出问题
自己先顶起!
点赞  2009-7-28 07:45
这个在手册中有,你仔细看看中断的那个章节。
2440 是默认是轮询优先级。——也可以自己设定
不过使用EINT0和EINT1中断都是最高的优先级
所以不需要你设置。
点赞  2009-7-28 08:04
通过串口打印信息,EINT0 和 EINT1中断都有响应,可就是IST没有进去,是不是线程被堵塞掉了?如果要设置线程的优先级,是设置多少为好呢?
因为通信总共是要用到6个中断的,今天试了试3个GPIO驱动都加载了,发现USB同步断开了,这下问题越来越多了,不知从何下手

还请各位大侠指点指点啊
点赞  2009-7-28 12:56
IST 没有被执行 不存在优先级高低的问题,如果你不设置,好像默认是103吧
很多都是默认的,没有执行说明有些事件触发等存在问题,你仔细对比成功例子
good luck
点赞  2009-7-28 13:00
还是自己来顶下,白天公司无法上网
调了下程序,发现ISR、IST均有响应,分别加载EINT0、EINT1时,发现有个规律,总是最后加载的那个中断IST能读取到FPGA发过来的数据,而另一个中断IST能进入运行,但读取不到数据。
在IST中

  1. while (1)
  2. {
  3.     ret = WaitForSingleObject(gWaitEvent, INFINITE);
  4.     if ((ret == WAIT_OBJECT_0) && (g_bKillIST == FALSE))
  5.     {

  6.         //使用GPIO发送的时钟从FPGA读取数据到缓存
  7.          。。。。。。

  8.         SetEvent(gReadKeyEvent[0]);       
  9.     }
  10.     else
  11.     {       
  12.         CloseHandle(gWaitEvent);
  13.         RETAILMSG(1, (TEXT("::: EINT_IntrThread Exit. \r\n")));
  14.         return 0;       
  15.     }

  16.     InterruptDone(g_EINTSysIntr);  /* 通知内核: 中断处理结束 */
  17. }   


IST中读取数据过程很短,从示波器中看,读取300bit才200多微秒,正常的话,两个IST都正常读取数据才对,为什么会只有其中一个才能正确读取到数据呢?两个驱动的IST都是默认优先级的话,那是不是会轮流执行呢?
点赞  2009-7-29 00:52
你现在是能够进入IST,但是不能独到数据?如果能进入读不到,那么极有可能是你FPGA的问题,是否有数据出来呢?
点赞  2009-7-29 08:47
多谢大侠gooogleman!

FPGA是被动发送数据,arm送一个时钟FPGA发一个数据,这两个驱动,我单个单个加载都很正常,能正确正常接收到数据,也验证了FPGA是没问题的吧。当我先后加载这两个驱动后,发现中断IST都有进:

  1. // [b]中断EINT0和EINT1的IST类似[/b]
  2. while (1)
  3. {
  4.     ret = WaitForSingleObject(gWaitEvent, INFINITE);
  5.     if ((ret == WAIT_OBJECT_0) && (g_bKillIST == FALSE))
  6.     {
  7.         EINT_Count++; // 记录进入IST的次数

  8.         //使用GPIO发送的时钟从FPGA读取数据到缓存
  9.          for ()
  10.         {
  11.              //v_pIOPregs->rGPBDAT 设为高
  12.              //从GPIO读FPGA数据,并存入缓存
  13.              //v_pIOPregs->rGPBDAT 设为低
  14.          }

  15.         SetEvent(gReadKeyEvent[0]);   
  16.     }
  17.     else
  18.     {   
  19.         CloseHandle(gWaitEvent);
  20.         RETAILMSG(1, (TEXT("::: EINT_IntrThread Exit. \r\n")));
  21.         return 0;   
  22.     }

  23.     InterruptDone(g_EINTSysIntr);  /* 通知内核: 中断处理结束 */
  24. }


先后加载两个IST后,从串口打印的信息知道了,

  1. EINT_Count++; // 记录进入IST的次数

两个IST都有执行到,也记录下了进入IST的次数

但是,在数据处理这段程序,却只有最后加载的那个驱动能读取到数据

  1. //使用GPIO发送的时钟从FPGA读取数据到缓存
  2. for ()
  3. {
  4.     //v_pIOPregs->rGPBDAT 设为高
  5.     //从GPIO读FPGA数据,并存入缓存
  6.     //v_pIOPregs->rGPBDAT 设为低
  7. }

从示波器上看到,只有其中一路有时钟输出。这是为什么啊?EINT_Count++不是有执行到吗,如果顺序执行的话,那数据处理这段程序那也应该能执行到啊,为什么会只有一路有输出呢?难道被阻塞掉啦?数据处理这段时间是很短的,我从示波器上可了就几百us。
点赞  2009-7-29 10:52
是不是EINT0的才能读到?

EINT1不行?

如果是那么估计有这种可能性
第一、EINT0的中断优先级比EINT1高,并且中断发生太频繁,甚至这两个中断条件是同时产生的,那么按照中断优先级自然只会响应EINT0了。
点赞  2009-7-29 11:07
跟加载顺序有关,最后加载EINT0,就EINT0能读到,EINT1读不到;最后加载的是EINT1,则EINT1读到,EINT0读不到;IST都有进入,而且设置的IST计数器也都有执行到,可就是GPIO时钟发不出来。中断大概25ms就有一次,为什么总是最后加载的那个会读取到数据?很郁闷,这个原因找很久了还没头绪
点赞  2009-7-29 14:47
引用: 引用 10 楼 y2dg4lf 的回复:
跟加载顺序有关,最后加载EINT0,就EINT0能读到,EINT1读不到;最后加载的是EINT1,则EINT1读到,EINT0读不到;IST都有进入,而且设置的IST计数器也都有执行到,可就是GPIO时钟发不出来。中断大概25ms就有一次,为什么总是最后加载的那个会读取到数据?很郁闷,这个原因找很久了还没头绪


哦,好像我也遇到了这个问题。
我的外部串口驱动使用了EINT1和EINT2,现在就像你描述的一样,谁先使能就谁起作用,另外一个不能响应了,我至今也纳闷。按照道理不会的啊。

楼主你也想想,解决了,告诉我一生,我现在很少同时用两个外部串口,所以我暂时没有理会。
嘿嘿。希望可以找到答案。
点赞  2009-7-29 14:56
这问题我也郁闷,大家没有遇到过吗?
点赞  2009-7-29 16:41

我的问题已经解决了,原因是犯了低级错误:

原来管脚配置为

  1. v_pIOPregs->rGPBCON &= ~(0x03 << 18);
  2. v_pIOPregs->rGPBCON |= ~(0x02 << 18);


改为如下就可以了

  1. v_pIOPregs->rGPBCON &= 0x33ffff;
  2. v_pIOPregs->rGPBCON |= 0x040000;


后面加载的驱动使用了错误的管脚配置,把前面的配置全覆盖更改了,所以就出现了上面的错误。以前一直往WinCE的ISR、IST方面找原因,而忽略了最初级的配置,导致问题一直拖到现在。

经常去gooogleman你的博客,期待你的问题精彩讲解。
点赞  2009-7-30 10:36
引用: 引用 13 楼 y2dg4lf 的回复:
我的问题已经解决了,原因是犯了低级错误:

原来管脚配置为
C/C++ code
v_pIOPregs->rGPBCON&=~(0x03<<18);
v_pIOPregs->rGPBCON|=~(0x02<<18);

改为如下就可以了
C/C++ code
v_pIOPregs->rGPBCON&=0x33ffff;
v_pIOPregs->rGPBCON|=0x040000;

后面加载的驱动使用了错误的管脚配置,把前面的配置全覆盖更改了,所以就出现了上面的错误。以前一直往WinCE的ISR、IST方面找原因,而忽略了最初级的配置,导致问题一直拖到现在。

经常去gooogleman你的博客,期待你的问题精彩讲解。


我现在签了保密协议,不准写博客了,嘿嘿

哦,我的问题也有这种可能性哦。我回去检查一下先。
点赞  2009-7-30 12:48
这搞的,连博客都不让写
哈哈,那保密费可得多点了
点赞  2009-7-30 21:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复