【惊现】6410 wince 6 FIQ 存在BUG ?

一介布衣萧萧 2013-06-29 12:40:03
加精
最近要调试个模块,用到软解,需要在中断里面采集数据。一开始使用IRQ发现采集回来的数据受干扰严重,所以采用FIQ。
但在使用FIQ的时候,发现一个很严重的问题,既然无法进入到FIQ的处理函数OEMInterruptHandlerFIQ()中。

S3C6410 + WINCE6.0

IRQ使能部分代码:

// set GPN0 as Ext.Interrupt[0]
v_pIOPregs->GPNCON &= ~(0x3<<0);
v_pIOPregs->GPNCON |= (0x2<<0);
// pull up
v_pIOPregs->GPNPUD &= ~(0x3<<0);
v_pIOPregs->GPNPUD |= (0x2<<0);
// EINT1,0 falling edge triggered
v_pIOPregs->EINT0CON0 &= ~(0x7<<0);
v_pIOPregs->EINT0CON0 |= (0x2<<0);
// Enable Interrupt EINT0
v_pIOPregs->EINT0MASK &= ~(0x1<<0);
// EINT0~EINT3 belongs to INT_EINT0(VIC0)
// set INT_EINT0 as FIQ type
//v_pVIC0Pregs->VICINTSELECT |= (0x1<<0);
// set INT_EINT0 as IRQ type
v_pVIC0Pregs->VICINTSELECT &= ~(0x1<<0);
// Enable INT_EINT0 interrupt
v_pVIC0Pregs->VICINTENABLE |= (0x1<<0);

这样配置之后,硬件中断能够正常进入到 OEMInterruptHandler() IRQ处理函数中。
但是选择为FIQ方式之后,发现既然无法进入到 OEMInterruptHandlerFIQ() 处理函数中。

intr.c的初始化:

static void InitializeVIC(void)
{
// Disable All Interrupts
g_pVIC0Reg->VICINTENCLEAR = 0xFFFFFFFF;
g_pVIC1Reg->VICINTENCLEAR = 0xFFFFFFFF;
g_pVIC0Reg->VICSOFTINTCLEAR = 0xFFFFFFFF;
g_pVIC1Reg->VICSOFTINTCLEAR = 0xFFFFFFFF;

// Clear Current Active Vector Address
g_pVIC0Reg->VICADDRESS = 0x0;
g_pVIC1Reg->VICADDRESS = 0x0;

// Initialize Vector Address Table
VICTableInit();

// Disable Vectored Interrupt Mode on CP15
System_DisableVIC();

// Enable IRQ Interrupt on CP15
System_EnableIRQ();

// Enable FIQ Interrupt on CP15
System_EnableFIQ();
}



从这里看的话,FIQ已经使能,但是为什么还是无法进入到FIQ处理中呢?确定物理中断已经产生,因为IRQ都能响应了。

6410的中断是使用VIC的,从这个初始化中我们看到其把VIC关闭了,但为什么还能够通过VIC控制器去使能IRQ中断?
难道要使用FIQ,必须得使能这个VIC吗?

我试过把System_DisableVIC();换成System_EnableVIC(),但是发现无法正常进入系统。在相应的中断处理那边卡住了,这说明6410 BSP的中断处理方式与VIC的中断处理方式不符。

请问有没遇到类似问题的朋友,麻烦支个招。也欢迎大家来讨论讨论
...全文
2399 68 打赏 收藏 转发到动态 举报
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
leechiao_ 2013-07-17
  • 打赏
  • 举报
回复
霸气
领衔主演 2013-07-16
  • 打赏
  • 举报
回复
虽然不知道在说什么,但是看起来好霸气!
Ei 2013-07-15
  • 打赏
  • 举报
回复
引用 59 楼 brantyou 的回复:
[quote=引用 58 楼 AAa_tnT 的回复:] 好久没来了,我也是追到和楼主差不多的程度,关注下,我的FIQ也没解决,
FIQ无法使用的问题已经解决了,你需要再仔细看一下文档的那个中断流程图,有个地方没有打开,导致了又FIQ信号和状态但却无法跳转到FIQ处理函数中。[/quote] 含,210的文档中 FIQ几乎一笔带过了,看来我得先看看 6410的。
chenmi0 2013-07-14
  • 打赏
  • 举报
回复
额、。。。。。。。。。。。。。。。。。。。。。。。。。。。
254313560 2013-07-13
  • 打赏
  • 举报
回复
FIQ一般很少用的啊
一介布衣萧萧 2013-07-12
  • 打赏
  • 举报
回复
引用 58 楼 AAa_tnT 的回复:
好久没来了,我也是追到和楼主差不多的程度,关注下,我的FIQ也没解决,
FIQ无法使用的问题已经解决了,你需要再仔细看一下文档的那个中断流程图,有个地方没有打开,导致了又FIQ信号和状态但却无法跳转到FIQ处理函数中。
lr2131 2013-07-12
  • 打赏
  • 举报
回复
引用 56 楼 brantyou 的回复:
[quote=引用 55 楼 lr2131 的回复:] [quote=引用 54 楼 lr2131 的回复:] [quote=引用 53 楼 brantyou 的回复:] [quote=引用 52 楼 lr2131 的回复:] 楼主哦,这个问题真怪呀。 S3C6410的是ARMv6体系结构的,从ARMv6体系结构开始,CPU核内已经不分FIQ和IRQ这种类别了。发生相应的中断,是直接跳到中断向量表中的相应的位置,不需要再具体细分是什么外设的中断再跳转,是直接跳到对应的位置。不是ARMv4和ARMv5那样,IRQ和FIQ都跳到一个位置,我要没记错的话。 ARMv6和ARMv7版本的ARM已经没有FIQ和IRQ了,说实话,FIQ虽然是确实比IRQ快点,但是ARM公司可能还是觉得实际使用的效果不理想,到ARMv6和ARMv7后,优化了中断相应,不再有FIQ和IRQ的划分。全部的中断都很快,确实不行,可以配置优先级。 但是看了下S3C6410的datasheet,搜索了FIQ的关键字,居然还能搜到,我都晕了,这怎么回事。
你说的对,6410的中断产生后都是统一进入到VIC控制器后才区分FIQ和IRQ的,IRQ是会跳到中断向量表那里的。但是FIQ不一样,FIQ是不经过VIC的,所以最终是不会跳到中观向量表那个地方的,而是跳到0x1c那个地址。然而,就是因为最后这一跳被人截了,三星给的BSP里面也没有做处理,所以导致了这个bug的出现[/quote] 那你这么说,至少CPU是没问题,中断的硬件机制,S3C6410已经做到了,硬件机制只负责跳转到该跳的地方。你不是说了嘛,FIQ已经能跳到0x1C了,那接下来就是软件代码的工作了,不是硬件的责任了,硬件还知道继续往哪跳吗!!!。所以说,我个人觉得S3C6410的FIQ是没问题,这么流行的一款芯片怎么能出这么大的漏洞呢。 按你说的,有问题的是三星的BSP没有做好,到了0x1C后,不能继续往正确的地方跳。 另外,按你说的,如果FIQ真的是统一跳到0x1C,那么这个中断的硬件机制就还是ARMv4/v5那样了,你需要在0x1C处完善一下,如果LZ懂汇编,或者懂启动代码,其实这个问题不大,稍稍改一下就好了应该。 让我好奇的是,在0x1C这里,到底是该像ARMv4/v5那样写一条LDR的伪指令来跳转呢,还是直接用ARMv6/v7的DCD FIQHandle来跳转呢?反正不是前面一种就是后面一种,具体的参考S3C6410的datasheet。 个人感觉三星的总是喜欢不按ARM内核的规整来,比如说S3C44B0,居然中断向量表已经可以直接划分到各个外设的中断,整的有点像ARMv6/v7那样。而S3C6410如果是按你说的那样走FIQ,反倒又走回ARMv4/v5那样,这样做可以说这个和ARMv6的体系结构偏得很远了。真不知道三星是在怎么想的。 我也看看这个S3C6410的FIQ到底具体的整体细致流程是怎么样的,毕竟以后是一定会弄的,趁现在有人一起讨论,就打打铁来搞清楚这个问题。 [/quote] 补充一下,最后没跳到FIQ的isr中,也可能是跳到0x1C后,再跳没问题,但是在后面的代码,哪个地方就不对,最终没跳到FIQ的isr,具体是怎么个情况,LZ看能不能再看看,反正都已经查到这了,继续往下查,原因就会逐渐明朗。[/quote] FIQ不能用的问题我已经解决了,这个最关键的是不能跳到FIQHandle,也就是说CPU内部在产生中断后,没有响应跳转到异常地址那边。BSP在FIQHandle之后这些都做了,但就漏了最关键的一步[/quote] 你说的这个和最关键的一步,是指从0x1C再往后跳出了问题呢,还是说在这跳完之后有问题呢? 你在这里试试,DCD FIQHandle 我不知道MMU这里会不会引出问题来,要怎么避开MMU的问题。 或者这么写 LDR PC, FIQHandleAddr FIQHandleAddr DCD FIQHandle 同时也担心MMU的对这个的影响 以上两种方法试试吧。
一介布衣萧萧 2013-07-12
  • 打赏
  • 举报
回复
引用 55 楼 lr2131 的回复:
[quote=引用 54 楼 lr2131 的回复:] [quote=引用 53 楼 brantyou 的回复:] [quote=引用 52 楼 lr2131 的回复:] 楼主哦,这个问题真怪呀。 S3C6410的是ARMv6体系结构的,从ARMv6体系结构开始,CPU核内已经不分FIQ和IRQ这种类别了。发生相应的中断,是直接跳到中断向量表中的相应的位置,不需要再具体细分是什么外设的中断再跳转,是直接跳到对应的位置。不是ARMv4和ARMv5那样,IRQ和FIQ都跳到一个位置,我要没记错的话。 ARMv6和ARMv7版本的ARM已经没有FIQ和IRQ了,说实话,FIQ虽然是确实比IRQ快点,但是ARM公司可能还是觉得实际使用的效果不理想,到ARMv6和ARMv7后,优化了中断相应,不再有FIQ和IRQ的划分。全部的中断都很快,确实不行,可以配置优先级。 但是看了下S3C6410的datasheet,搜索了FIQ的关键字,居然还能搜到,我都晕了,这怎么回事。
你说的对,6410的中断产生后都是统一进入到VIC控制器后才区分FIQ和IRQ的,IRQ是会跳到中断向量表那里的。但是FIQ不一样,FIQ是不经过VIC的,所以最终是不会跳到中观向量表那个地方的,而是跳到0x1c那个地址。然而,就是因为最后这一跳被人截了,三星给的BSP里面也没有做处理,所以导致了这个bug的出现[/quote] 那你这么说,至少CPU是没问题,中断的硬件机制,S3C6410已经做到了,硬件机制只负责跳转到该跳的地方。你不是说了嘛,FIQ已经能跳到0x1C了,那接下来就是软件代码的工作了,不是硬件的责任了,硬件还知道继续往哪跳吗!!!。所以说,我个人觉得S3C6410的FIQ是没问题,这么流行的一款芯片怎么能出这么大的漏洞呢。 按你说的,有问题的是三星的BSP没有做好,到了0x1C后,不能继续往正确的地方跳。 另外,按你说的,如果FIQ真的是统一跳到0x1C,那么这个中断的硬件机制就还是ARMv4/v5那样了,你需要在0x1C处完善一下,如果LZ懂汇编,或者懂启动代码,其实这个问题不大,稍稍改一下就好了应该。 让我好奇的是,在0x1C这里,到底是该像ARMv4/v5那样写一条LDR的伪指令来跳转呢,还是直接用ARMv6/v7的DCD FIQHandle来跳转呢?反正不是前面一种就是后面一种,具体的参考S3C6410的datasheet。 个人感觉三星的总是喜欢不按ARM内核的规整来,比如说S3C44B0,居然中断向量表已经可以直接划分到各个外设的中断,整的有点像ARMv6/v7那样。而S3C6410如果是按你说的那样走FIQ,反倒又走回ARMv4/v5那样,这样做可以说这个和ARMv6的体系结构偏得很远了。真不知道三星是在怎么想的。 我也看看这个S3C6410的FIQ到底具体的整体细致流程是怎么样的,毕竟以后是一定会弄的,趁现在有人一起讨论,就打打铁来搞清楚这个问题。 [/quote] 补充一下,最后没跳到FIQ的isr中,也可能是跳到0x1C后,再跳没问题,但是在后面的代码,哪个地方就不对,最终没跳到FIQ的isr,具体是怎么个情况,LZ看能不能再看看,反正都已经查到这了,继续往下查,原因就会逐渐明朗。[/quote] FIQ不能用的问题我已经解决了,这个最关键的是不能跳到FIQHandle,也就是说CPU内部在产生中断后,没有响应跳转到异常地址那边。BSP在FIQHandle之后这些都做了,但就漏了最关键的一步
lr2131 2013-07-12
  • 打赏
  • 举报
回复
引用 54 楼 lr2131 的回复:
[quote=引用 53 楼 brantyou 的回复:] [quote=引用 52 楼 lr2131 的回复:] 楼主哦,这个问题真怪呀。 S3C6410的是ARMv6体系结构的,从ARMv6体系结构开始,CPU核内已经不分FIQ和IRQ这种类别了。发生相应的中断,是直接跳到中断向量表中的相应的位置,不需要再具体细分是什么外设的中断再跳转,是直接跳到对应的位置。不是ARMv4和ARMv5那样,IRQ和FIQ都跳到一个位置,我要没记错的话。 ARMv6和ARMv7版本的ARM已经没有FIQ和IRQ了,说实话,FIQ虽然是确实比IRQ快点,但是ARM公司可能还是觉得实际使用的效果不理想,到ARMv6和ARMv7后,优化了中断相应,不再有FIQ和IRQ的划分。全部的中断都很快,确实不行,可以配置优先级。 但是看了下S3C6410的datasheet,搜索了FIQ的关键字,居然还能搜到,我都晕了,这怎么回事。
你说的对,6410的中断产生后都是统一进入到VIC控制器后才区分FIQ和IRQ的,IRQ是会跳到中断向量表那里的。但是FIQ不一样,FIQ是不经过VIC的,所以最终是不会跳到中观向量表那个地方的,而是跳到0x1c那个地址。然而,就是因为最后这一跳被人截了,三星给的BSP里面也没有做处理,所以导致了这个bug的出现[/quote] 那你这么说,至少CPU是没问题,中断的硬件机制,S3C6410已经做到了,硬件机制只负责跳转到该跳的地方。你不是说了嘛,FIQ已经能跳到0x1C了,那接下来就是软件代码的工作了,不是硬件的责任了,硬件还知道继续往哪跳吗!!!。所以说,我个人觉得S3C6410的FIQ是没问题,这么流行的一款芯片怎么能出这么大的漏洞呢。 按你说的,有问题的是三星的BSP没有做好,到了0x1C后,不能继续往正确的地方跳。 另外,按你说的,如果FIQ真的是统一跳到0x1C,那么这个中断的硬件机制就还是ARMv4/v5那样了,你需要在0x1C处完善一下,如果LZ懂汇编,或者懂启动代码,其实这个问题不大,稍稍改一下就好了应该。 让我好奇的是,在0x1C这里,到底是该像ARMv4/v5那样写一条LDR的伪指令来跳转呢,还是直接用ARMv6/v7的DCD FIQHandle来跳转呢?反正不是前面一种就是后面一种,具体的参考S3C6410的datasheet。 个人感觉三星的总是喜欢不按ARM内核的规整来,比如说S3C44B0,居然中断向量表已经可以直接划分到各个外设的中断,整的有点像ARMv6/v7那样。而S3C6410如果是按你说的那样走FIQ,反倒又走回ARMv4/v5那样,这样做可以说这个和ARMv6的体系结构偏得很远了。真不知道三星是在怎么想的。 我也看看这个S3C6410的FIQ到底具体的整体细致流程是怎么样的,毕竟以后是一定会弄的,趁现在有人一起讨论,就打打铁来搞清楚这个问题。 [/quote] 补充一下,最后没跳到FIQ的isr中,也可能是跳到0x1C后,再跳没问题,但是在后面的代码,哪个地方就不对,最终没跳到FIQ的isr,具体是怎么个情况,LZ看能不能再看看,反正都已经查到这了,继续往下查,原因就会逐渐明朗。
lr2131 2013-07-12
  • 打赏
  • 举报
回复
引用 53 楼 brantyou 的回复:
[quote=引用 52 楼 lr2131 的回复:] 楼主哦,这个问题真怪呀。 S3C6410的是ARMv6体系结构的,从ARMv6体系结构开始,CPU核内已经不分FIQ和IRQ这种类别了。发生相应的中断,是直接跳到中断向量表中的相应的位置,不需要再具体细分是什么外设的中断再跳转,是直接跳到对应的位置。不是ARMv4和ARMv5那样,IRQ和FIQ都跳到一个位置,我要没记错的话。 ARMv6和ARMv7版本的ARM已经没有FIQ和IRQ了,说实话,FIQ虽然是确实比IRQ快点,但是ARM公司可能还是觉得实际使用的效果不理想,到ARMv6和ARMv7后,优化了中断相应,不再有FIQ和IRQ的划分。全部的中断都很快,确实不行,可以配置优先级。 但是看了下S3C6410的datasheet,搜索了FIQ的关键字,居然还能搜到,我都晕了,这怎么回事。
你说的对,6410的中断产生后都是统一进入到VIC控制器后才区分FIQ和IRQ的,IRQ是会跳到中断向量表那里的。但是FIQ不一样,FIQ是不经过VIC的,所以最终是不会跳到中观向量表那个地方的,而是跳到0x1c那个地址。然而,就是因为最后这一跳被人截了,三星给的BSP里面也没有做处理,所以导致了这个bug的出现[/quote] 那你这么说,至少CPU是没问题,中断的硬件机制,S3C6410已经做到了,硬件机制只负责跳转到该跳的地方。你不是说了嘛,FIQ已经能跳到0x1C了,那接下来就是软件代码的工作了,不是硬件的责任了,硬件还知道继续往哪跳吗!!!。所以说,我个人觉得S3C6410的FIQ是没问题,这么流行的一款芯片怎么能出这么大的漏洞呢。 按你说的,有问题的是三星的BSP没有做好,到了0x1C后,不能继续往正确的地方跳。 另外,按你说的,如果FIQ真的是统一跳到0x1C,那么这个中断的硬件机制就还是ARMv4/v5那样了,你需要在0x1C处完善一下,如果LZ懂汇编,或者懂启动代码,其实这个问题不大,稍稍改一下就好了应该。 让我好奇的是,在0x1C这里,到底是该像ARMv4/v5那样写一条LDR的伪指令来跳转呢,还是直接用ARMv6/v7的DCD FIQHandle来跳转呢?反正不是前面一种就是后面一种,具体的参考S3C6410的datasheet。 个人感觉三星的总是喜欢不按ARM内核的规整来,比如说S3C44B0,居然中断向量表已经可以直接划分到各个外设的中断,整的有点像ARMv6/v7那样。而S3C6410如果是按你说的那样走FIQ,反倒又走回ARMv4/v5那样,这样做可以说这个和ARMv6的体系结构偏得很远了。真不知道三星是在怎么想的。 我也看看这个S3C6410的FIQ到底具体的整体细致流程是怎么样的,毕竟以后是一定会弄的,趁现在有人一起讨论,就打打铁来搞清楚这个问题。
Ei 2013-07-12
  • 打赏
  • 举报
回复
好久没来了,我也是追到和楼主差不多的程度,关注下,我的FIQ也没解决,
一介布衣萧萧 2013-07-11
  • 打赏
  • 举报
回复
引用 52 楼 lr2131 的回复:
楼主哦,这个问题真怪呀。 S3C6410的是ARMv6体系结构的,从ARMv6体系结构开始,CPU核内已经不分FIQ和IRQ这种类别了。发生相应的中断,是直接跳到中断向量表中的相应的位置,不需要再具体细分是什么外设的中断再跳转,是直接跳到对应的位置。不是ARMv4和ARMv5那样,IRQ和FIQ都跳到一个位置,我要没记错的话。 ARMv6和ARMv7版本的ARM已经没有FIQ和IRQ了,说实话,FIQ虽然是确实比IRQ快点,但是ARM公司可能还是觉得实际使用的效果不理想,到ARMv6和ARMv7后,优化了中断相应,不再有FIQ和IRQ的划分。全部的中断都很快,确实不行,可以配置优先级。 但是看了下S3C6410的datasheet,搜索了FIQ的关键字,居然还能搜到,我都晕了,这怎么回事。
你说的对,6410的中断产生后都是统一进入到VIC控制器后才区分FIQ和IRQ的,IRQ是会跳到中断向量表那里的。但是FIQ不一样,FIQ是不经过VIC的,所以最终是不会跳到中观向量表那个地方的,而是跳到0x1c那个地址。然而,就是因为最后这一跳被人截了,三星给的BSP里面也没有做处理,所以导致了这个bug的出现
一介布衣萧萧 2013-07-11
  • 打赏
  • 举报
回复
6410 FIQ的问题已经解决,由此证实6410开发板提供的linux、wince等系统都存在FIQ不能使用的BUG。关键点在于6410 datasheet漏了介绍两个寄存器,导致FIQ没有接通,从而出现了产生FIQ却无法进入到FIQ处理的问题。

具体不便多说,敬请原谅!
美女我们不熟 2013-07-11
  • 打赏
  • 举报
回复
lr2131 2013-07-11
  • 打赏
  • 举报
回复
楼主哦,这个问题真怪呀。 S3C6410的是ARMv6体系结构的,从ARMv6体系结构开始,CPU核内已经不分FIQ和IRQ这种类别了。发生相应的中断,是直接跳到中断向量表中的相应的位置,不需要再具体细分是什么外设的中断再跳转,是直接跳到对应的位置。不是ARMv4和ARMv5那样,IRQ和FIQ都跳到一个位置,我要没记错的话。 ARMv6和ARMv7版本的ARM已经没有FIQ和IRQ了,说实话,FIQ虽然是确实比IRQ快点,但是ARM公司可能还是觉得实际使用的效果不理想,到ARMv6和ARMv7后,优化了中断相应,不再有FIQ和IRQ的划分。全部的中断都很快,确实不行,可以配置优先级。 但是看了下S3C6410的datasheet,搜索了FIQ的关键字,居然还能搜到,我都晕了,这怎么回事。
lr2131 2013-07-11
  • 打赏
  • 举报
回复
能不能进到FIQ的isr,你还得看: 1.CPSR的F位有没有清除。不使能FIQ,CPU当然不能响应,而中断控制器和外设控制的中断标记位虽然会置位。 2.确认CPU使能了FIQ中断,在发生FIQ前,注意看一下代码运行在什么模式下,CPU的7模式也是有优先级的,具体的我也忘了,当前模式如果在用户模式或系统模式下,且F位清除,那FIQ发生应该可以响应。其他模式,我没有试过,不知道会不会进不去FIQ,不乱说了。 3.发生FIQ时,注意CPU硬件只负责跳转到中断向量表的FIQ处,应该是在0x1C,如果CPU调转到这里,但是这里没有有效的代码,那最后当然还是不能跳转到FIQ的isr中,特别注意这点。要验证这个有没有问题,可以赋值函数指针为0x1C,然后调用这个函数,强制跳转到FIQ的isr中,看有没有进到FIQ的isr中,要是可以,那至少说明跳转代码没问题。
如此残酷 2013-07-11
  • 打赏
  • 举报
回复
神马来的!!!
飞蓬 2013-07-10
  • 打赏
  • 举报
回复
ZHENDEMA
下雪了好烦人 2013-07-10
  • 打赏
  • 举报
回复
不粗不错,学习了
xbzhayc 2013-07-10
  • 打赏
  • 举报
回复
这个很强大的呀
加载更多回复(32)

19,500

社区成员

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

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