gpt4 book ai didi

c - 变量在 ISR 中不递增

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:23 25 4
gpt4 key购买 nike

我有一个 ISR,它递增数组的变量“head”。问题是几个小时后,这个变量即使在增加后也会恢复到以前的值。像这样的东西:

array[head] = val; 
head++;
/*val is the byte that came from ISR and I am assigning it to my buffer 'array' at head position*/

现在,当我运行代码几个小时时,我观察到如果 head 是 119,存储来自 ISR 的字节,变成 120,并且在下一个中断而不是将下一个字节存储在 120 上并将 head 递增到 121,head再次变为 120 并覆盖我数组中的那个字节。可能是什么问题呢?欢迎提出任何建议!

注意:

  • head 是一个可变变量。
  • 中断速度非常快。

代码片段:

    /*before storing on to the circular buffer check whether it is full*/

if ((COM1RxBufHead == COM1RxBufTail - 1) ||((COM1RxBufHead == (COM1RXBUFSIZE - 1)) && (COM1RxBufTail == 0)))
{

logDEBUG("[FULL]");
U1STAbits.OERR = 0;
return;
}
else
{
/* Byte can be safely stored on to buffer*/
COM1RxBuf[COM1RxBufHead] = U1RXREG;


if (COM1RxBufHead == (COM1RXBUFSIZE - 1))
{
COM1RxBufHead = 0;
}
else
{
COM1RxBufHead++;
}

最佳答案

您在错误的抽象级别上工作。虽然完全可以使用 C 来编写这些东西,但是根据 C 代码本身找到似乎不可能解决的问题意味着您需要降低一个级别。

这意味着进入汇编程序/机器架构领域。

以下只是一般性建议,因为我实际上并不了解您的机器架构。

  • 检查编译器生成的实际汇编语言。查看翻译后的代码可能可以清楚地知道导致此问题的原因,例如缓存值的使用(即使您声明已将变量标记为 volatile) .

  • 确保在您运行 ISR 时禁用更多中断。我不知道任何不是这种情况的架构,但它们可能存在,需要您手动禁用和重新启用。

  • 即使在 ISR 中自动禁用中断,也有具有中断优先级的架构,其中较高优先级的中断可以中断正在进行的较低优先级 ISR。还有 NMI,不可屏蔽中断,它可以中断任何事情(尽管它们往往用于更严肃的事情)。

  • 如果您在 ISR 之外修改变量,请确保在执行此操作时禁用中断。这是为了防止 ISR 在更新中途运行的可能性,如果更新本身不是原子操作中断的话。这很可能是这种情况,因为使用潜在的循环缓冲区环绕递增指针几乎肯定是一个多指令(因此是可中断的)过程。

关于c - 变量在 ISR 中不递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19330947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com