繁体   English   中英

C中的指针和局部变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM