[英]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(®ION[4],1,temp);
}
else XGpio_DiscreteWrite(®ION[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.