增量不会超过0x01

时间:2014-06-26 10:11:36

标签: c debugging increment microcontroller iar

所以我有功能:

int f1(uint8_t* a, int b)
{ 
    for(int i = 0; i < b; i++)
        f2(&a[i]);

    return 1;
}

static void f2(uint8_t* a)
{
    REG1 = *a;
    ...
    *a = REG2;
}

“a”是一个数据寄存器,用作缓冲区,通过不同的包装函数将数据从主循环一直放入目标函数f2()。

“REG1”和“REG2”是进出的I / O寄存器,数据以“a”传递。通过硬件操作,“REG2”的值在f2()中隐式改变。

当我在调试模式下观察变量变化时,会发生以下情况:

  
      
  1. b = 2
  2.   
  3. 声明i = 0,i&lt; B'/ LI>   
  4. 致电f2
  5.   
  6. 将i增加到i = 1,i <1。 B'/ LI>   
  7. 致电f2
  8.   
  9. 将i增加到i = 0 ,i&lt; B'/ LI>   

由于“i”永远不会达到2,所以循环永远不会结束。该程序使用IAR EW for AVR进行编译和调试。关闭编译器的优化。

2 个答案:

答案 0 :(得分:0)

正如@Lundin所说,这似乎是内存破坏的错误。

如果您可以使用调试器,请尝试在i上插入write-watchpoint。它可能会帮助你^ o ^

(当只考虑这些代码时,我可以假设a已损坏,而*a = REG2;可能会在堆栈上写入,最终i会被更改)

答案 1 :(得分:0)

@Lundin是正确的,我用指针传递指针的地址而不是指针本身:

f2(&a[i]);