所以我有功能:
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()中隐式改变。
当我在调试模式下观察变量变化时,会发生以下情况:
- b = 2
- 声明i = 0,i&lt; B'/ LI>
- 致电f2
- 将i增加到i = 1,i <1。 B'/ LI>
- 致电f2
- 将i增加到i = 0 ,i&lt; B'/ LI> 醇>
由于“i”永远不会达到2,所以循环永远不会结束。该程序使用IAR EW for AVR进行编译和调试。关闭编译器的优化。
答案 0 :(得分:0)
正如@Lundin所说,这似乎是内存破坏的错误。
如果您可以使用调试器,请尝试在i
上插入write-watchpoint。它可能会帮助你^ o ^
(当只考虑这些代码时,我可以假设a
已损坏,而*a = REG2;
可能会在堆栈上写入,最终i
会被更改)
答案 1 :(得分:0)
@Lundin是正确的,我用指针传递指针的地址而不是指针本身:
f2(&a[i]);