[英]pointers and local variables in C
希望不要在此处创建重复的主题,这是我的疑问:
我正在使用Atmel Xmega处理器,正在使用AtmelStudio(gcc),并且在这种情况下,我必须通过设备发送内存区域:
volatile unsigned char *areatobetransferred;
void afunction (unsigned int someint)
{
unsigned int otherint;
otherint=(someint<<8) | (someint>>8); //used to swap lobyte and hibyte
otherfunction ((volatile unsigned char *)&otherint);
}
void otherfunction (volatile unsigned char * pointedarea)
{
areatobetransferred=pointedarea;
bytestosend=2;
StartSenderInterrupt();
}
ISR (SenderInterrupt)
{
deviceport=*areatobetransferred;
if (length<bytestosend)
{areatobetransferred++;
bytestosend++;}
else StopSenderInterrupt();
}
现在,我的问题是,尽管当我从另一个模块调用此例程时,我会获得正确的行为,但是在另一个模块中,我却无法获得正确的结果。 具体来说,在ISR中,除非我将局部变量声明为静态变量,否则我只会得到垃圾,而不是将正确的局部变量“ otherint”值作为指针传递给我。 如果我将其读取到调用例程和中断服务例程中,则指针值绝对正确,而指向指针的值仅在调用例程“ afunction”中正确。 更深入地了解,我发现如果将局部变量声明为非静态变量,则将其分配在堆栈上,在内存的远端(应为它),而如果声明为静态,则将其置于内存空间。
我没有调试工具,对汇编程序的了解也不多,我想这是:-当我声明一个局部变量时,只有当我在其范围内时,它的值才会被保留-如果我调用其他例程,或者在发生中断的情况下(以我为例),我有一个指向本地变量的指针,该变量存储了我的变量所在的正确位置,但也许最终该地址上的内容最终被其他数据覆盖,所以这就是为什么我只会得到垃圾。 -如果我将变量声明为静态变量,则该变量将被分配一次,并且其值和位置永远不会通过ISR或在调用其他例程时更改,因此我始终会读取正确的值。
最后,我认为运气可以在其他模块上按需运行只是运气问题:如果我扩展项目或更改“该”特定项目,那么我认为它在那里也会开始失败。
我的猜测正确吗?
谢谢
您的ISR正在尝试访问要areatobetransferred
并且这是在ISR外部(间接)设置为&otherint
。 然而, otherint
是在栈上afunction
。 因此,如果afunction
ISR之前退出被调用时,值otherint
将变得不确定。 这就是为什么使其静态工作。 另一种方法是,在完成ISR后使用malloc()
和free()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.