繁体   English   中英

C语言中的FPGA中断处理

[英]FPGA interrupt handling in C

我有一个在C语言中的Microblaze微处理器上设计状态机的课程。我遇到的问题是,我必须更改某些图片。 假设我在FPGA上按了BTNL。 我必须得到一张风景图片5秒钟,经过3秒钟后我必须使该图片闪烁。 同时,必须在7段显示器上显示5s-> 0s时间。 在这种情况下,已经检测到按钮并且必须显示闪烁模式。 该中断每0.004s发生一次,微处理器的时钟为100MHz。

for(j=0; j<=5secs; j++)
{
    if(j>3secs)
    {
        if(counter == sec){
            counter=0;
            if(temp==white){ //white background
                temp=background;
            }
            else temp=white;
        }else counter++;
        XGpio_DiscreteWrite(&REGION[4],1,temp);
    }
    else XGpio_DiscreteWrite(&REGION[4],1,temp);
    if(j==5secs)
        states = IDLE;
}

我的主要问题是在7段显示器上显示数字。 当我将displayNumber()函数放在这种情况下时,一旦转到displayNumber()行,整个东西就会冻结。 我知道嵌套的for循环会花费大量时间和精力,并且我认为这可能会导致问题,但是我找不到有效的解决方案。 任何想法或建议都非常感谢。

另一件事是我尝试了一个标志,但是由于中断处理,它不起作用。

编辑:我不是要获取我的问题的复制/粘贴解决方案。 整个过程相当庞大,我的意思是verilog项目以及在c中完成的其他功能的文件。 我没想到您会运行代码并复制整个内容,因为学校为我提供了Verilog项目,因此您必须生成一个比特流,然后在板上上传并运行整个内容。 我在这里只是在寻找关于如何改进此问题的建议,如果您在FPGA上遇到过这种行为,还有任何想法。

感谢您花时间阅读问题!

多亏了克雷格(Craig),我确实更加关注如何设置displayNumber()函数。 结果发现它卡在了中断中,我只需要从其他地方驱动它即可。 因此,谢谢您指出正确的方向,克雷格!

如果您认为这可能对其他人没有帮助,请告诉我,以便将其删除。

因此,问题在于ISR的定义及其与DisplayNumber()函数的结合。

基本上,我的ISR如下所示:

void hwTimerISR(void *CallbackRef)
{
interruptServiced = FALSE;
interruptCounter++;
if (interruptCounter == 1)
{
    interruptCounter = 0;
    displayDigit(); //needed to display the number on the display
    operation(state); // function that moves the FSM's states
    interruptServiced = TRUE;
}

return;
}

基本上,问题是在不得不退出5秒钟的情况下, displayNumber函数将调用displayDigit()并将其全部卡住。 我要做的是更改状态,而不是更改操作功能,而是更改主要状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM