This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/LAUNCHXL-F28379D:将指针作为函数参数传递到结构体时出错

Guru**** 2587365 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/907565/compiler-launchxl-f28379d-errors-passing-a-pointer-to-a-structure-as-a-function-parameter

器件型号:LAUNCHXL-F28379D
主题中讨论的其他器件:C2000WARE

工具/软件:TI C/C++编译器

我的问题是、我将一个指向结构体的指针作为函数参数传递。  当我多次将指向结构体的指针传递给函数、然后在下一个函数调用中将指针更改为指向另一个结构体时、就会发生错误。  函数执行时接收到的地址不正确。  接收到的地址与函数时传递的地址不同。 被调用(正确的地址)。

下面是调试器中问题的图示。  下面是传递给函数的地址:

该函数可获得以下结果:

按下 F5 "step Into"键即可将这两个视图分开。  不用说、当这个函数运行时、它会生成大量内容、写入错误的地址。

结构如下所示:

/定义扫描结构
结构体扫描{
浮点值;
先浮动;
最后浮动;
浮点数增量;
uint16 i;
uint16 n;
};

struct Sweep VoutSweep;
struct Sweep VinSweep;
struct Sweep VcoSweep; 

函数:

int SweepStep (struct Sweep *扫描,int Reset){
Int carry1 = 0;
如果(重置){
sweep->value = sweep->first;
sweep->i = 0;
如果(sweep->delta =0) sweep->delta = 1; //不进行零除
sweep->n =(int)( sweep->last - sweep->first )/sweep->delta +.5);
} 否则,如果(sweep->i=sweep->n){
残留1 = 1;
sweep->value = sweep->first;
sweep->i = 0;
} 否则{
sweep->value += sweep->delta;
扫描->i++;
}
回送1;
} 

该函数调用:

if (进位&& VIN_sweep_on){
进位= SweepStep (&VinSweep、0);//当上一次扫描达到最终值时、递增下一次扫描
}

if (执行&& Vout_sweep_on){
进位= SweepStep (&VoutSweep、0); //扫描在达到其最终值时返回1,否则返回0
}

if (进位&& VCO_sweep_on){
进位= SweepStep (&VcoSweep、0);//当上一次扫描达到最终值时、递增下一次扫描
} 

该程序运行 SweepStep (&VinSweep、0)的扫描、直到它绕回并返回1。 然后运行 SweepStep (&VoutSweep、0)、并使用指向不同结构的指针。
这就是问题发生的时间。

这个问题的另一个特点是很难重现,因为似乎不相关的变化影响到它的发生。 最初、我在进行调用的两个函数中都使用了本地"carry (进位)"变量
(B4状态机函数)和 SweepStep 函数中。 我发现、如果我在任一位置更改进位变量的名称、问题就会消失。 这是没有意义的、因为两者都是
局部变量、但这是我的观察结果。 但现在问题再次出现、如上所述、两个变量具有不同的名称。

我正在运行 C2000Ware_3.01.00.00和 CCS 9.2.0.00013

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    if (进位&& VIN_sweep_on){
    进位= SweepStep (&VinSweep、0);//此操作运行正常!
    }
    
    
    if (执行&& Vout_sweep_on){
    进位= SweepStep (&VoutSweep、0); //在先前的 SweepStep 返回设置进位后,此处出现问题
    。}
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试在周围撒一些"易变"的关键字、看看这是否有帮助。

    
    
    /定义扫描结构
    结构体扫描{
    浮点值;
    先浮动;
    最后浮动;
    浮点数增量;
    uint16 i;
    uint16 n;
    };
    
    volatile struct Sweep VoutSweep;
    volatile struct Sweep VinSweep;
    volatile struct Sweep VcoSweep;
    ...
    
    ///--------------------------------
    void B4 (void)//运行参数扫描/-------------------------------------------------------
    
    {
    volatile int carry = 1;
    
    ...
    
    int SweepStep (volatile struct Sweep *扫描,int Reset){
    volatile int carry1=0;
    

    由于问题涉及"carry (进位)"变量和"Sweep"结构、我在它们上放置了"volatile (易失性)"。 尝试此操作后,问题未立即重新出现。 但正如我先前所说的那样,这个问题的出现和出现都是与之明显无关的变化,所以我没有信心我解决了任何问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否为代码中定义的所有结构(即 VoutSweep、VinSweep 和 VcoSweep)提供地址? 如果调用 SweepStep()函数的块,我建议检查中的逻辑。  您能否共享应用程序代码以便我可以在我的设置中重现此问题?

    谢谢

    Vasudha