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.

[参考译文] TMS320F28388D:在"Debug Expression"窗口中、结构不更新

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1113808/tms320f28388d-structure-not-update-in-debug-expression-window

器件型号:TMS320F28388D

您好!

我们有一些代码在 CPU1的中断上运行(中断由 CPU2触发)。 在中断中、我们切换 GPIO、我们可以看到它在表达式窗口中切换。 因此我们知道中断正在运行。

当改变模拟输入值时、我们还会看到"AdccResultRegs.ADCRESULT0"寄存器中的变化。

// *************************************************************************************************
// *
// * Function name : Cpu1Task3Calc()
// * Creation date : 2022-06-13
// * Programmer    : Ralf Rink
// *
// * Description   : Task 3 der CPU1, sampling period = 128 x system sampling period
// *                 mit einer CONTROL_LOOP_CYCLE_TIME_NS von 31,25µs = 4 ms
// *                 Poti-Handling zum Sollpositionen-Generator
// *
// *************************************************************************************************
inline void Cpu1Task3Calc(IPC_CPU1Task3DataIn* input, IPC_CPU1Task3DataOut* output)
{
    static uint16_t  alive = 1;       // Umschaltung zwischen Still-Alive-LED und Laufzeit-Messung
    static uint16_t  ledCounter = 0;  // Variable für Still-Alive-LED


    if(alive == 0)
    {
        // Laufzeit-Messung
        GpioDataRegs.GPASET.bit.GPIO3 = 1;
    } else
    {
        // CPU1-Alive-LED (0,5 Hz / 2000 ms)
        if(ledCounter >= STILL_ALIVE_LED_UPDATE_LOOPS_CPU1_TASK3)
        {
            GpioDataRegs.GPATOGGLE.bit.GPIO3 = 1;
            ledCounter = 0;
        }
        ledCounter++;
    }

    SOLLPOSGENERATOR::callADC(&SOLLPOSGENERATOR::sollPosGen.poti);

    if(SOLLPOSGENERATOR::sollPosGen.poti.valueChanged)
    {
        SOLLPOSGENERATOR::potiNewCalcInit(&paramsUser.kinematics[0],
                                          &SOLLPOSGENERATOR::sollPosGen.poti,
                                          &SOLLPOSGENERATOR::sollPosGen.kinematics.calc[0],
                                          &SOLLPOSGENERATOR::sollPosGen.kinematics,
                                          &SOLLPOSGENERATOR::sollPosGen.time[0],
                                          &SOLLPOSGENERATOR::sollPosGen.time[1],
                                          &SOLLPOSGENERATOR::sollPosGen.timeBuffer);
    }

    // output->data = input->data + 1;

    if(alive == 0)
    {
        // Laufzeit-Messung
        GpioDataRegs.GPACLEAR.bit.GPIO3 = 1;
    }
}

在函数"SOLLPOSGENERATOR::callADC (&SOLLPOSGENERATOR::sollPosGen.poti)"中、我们将"AdcResultRegs.ADCRESULT0"复制到全局变量"AdccResult0"。 该变量始终显示零、而不是"AdccResultRegs.ADCRESULT0"中的相同值。 此外、我们的结构"SOLLPOSGENERATOR::sollPosGen"没有任何值会更新。

int32_t SOLLPOSGENERATOR::callADC(Potentiometer* pPoti)
{
    int32_t     errorCode = 0;
    static bool Stillstand = true;
    static bool Test = true;


    // start conversions immediately via software, ADCA
    AdccRegs.ADCSOCFRC1.all = 0x0003; //SOC0 and SOC1
    // Store results
    AdccResult0 = AdccResultRegs.ADCRESULT0;

    if (((AdccResult0 - pPoti->value) > 90) || ((pPoti->value - AdccResult0) > 90 ))
    {
        pPoti->value = AdccResult0; //int32 wert mit uint16 wert
        Stillstand = false;
        //pPoti->PotiValueChanged = true;
    } else if((!Stillstand) ) //&& (pPoti->PotiValue == AdccResult0)
    {
        //pPoti->PotiValueChanged = true;
        if((!Stillstand) && (!Test))
        {
            pPoti->valueChanged = true;
            Stillstand = true;
            Test = true;
        }
        Test = false;
    }

    return errorCode;
}

有人能帮我们解决这个(调试)问题吗?

此致 Ralf

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

    您好、Ralf、

    在您的 callADC 函数中、您将在强制转换后立即读取 ADC 结果寄存器。 ADC 转换需要一些时间、具体取决于您配置的采集窗口大小(ACQPS)+数据表中指定的实际转换时间。 在读取结果寄存器之前、应添加以下行:

    //等待 ADC 转换完成 
    while (((AdccRegs.ADCINTFlG.all 和0x0003)!= 0x0003);
    //清除中断标志
    AdccRegs.ADCINTFLGCLR.ALL = 0x0003;

    这将解决该问题。

    此致、
    Ibukun

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

    Ibukun、您好!

    我们每4ms 调用一次转换。 因此、应该在变量中看到"旧"ADC-Result、否则我们就不会看到。 此外、其他变量(没有 ADC 值)也不会更新。

    在称为中断的周期性调试中、SoM 设置可能错误?

    此致 Ralf

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

    您好、Ralf、

    感谢您的澄清。 以下是几个问题:

    • 您能否确认、当您在 ISR 中的第11行设置调试断点时、您能够在 ADCC 的 ADCRESULT0寄存器中观察到之前的转换结果?
    • 变量 AdccResult0在哪里定义以及如何定义?
    • 还有哪些变量未更新?

    谢谢、
    Ibukun

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

    Ibukun、您好!

    -当 我设置一个断点时、我可以看到 ADCC 的 ADCRESULT0寄存器在接下来的两个函数调用之间发生了变化。 通过"连续刷新"、ADCRESULT0寄存器也会在不使用断点的情况下刷新

    -变量 AdccResult0在同一 cpp 文件内全局声明。

    /**
     * @file ADC_SPG.cpp
     * @author Wilko.Moritz
     * @date 16.04.2021
     * @brief Implementation.
     *
     * For a detailed description see the belonging header file.
     */
     
    
    #include "f28x_project.h"
    #include "f2838x_globalprototypes.h"
    #include "f2838x_adc.h"
    #include "adc.h"
    
    #include "SollPosGenerator/SollPosGenerator.h"
    
    
    using namespace SOLLPOSGENERATOR;
    
    Uint16 AdccResult0;
    
    
    int32_t SOLLPOSGENERATOR::callADC(Potentiometer* pPoti)
    {
        int32_t     errorCode = 0;
        static bool Stillstand = true;
        static bool Test = true;
    
    
        // Wait for ADC conversion to complete
        //while ((AdccRegs.ADCINTFLG.all & 0x0003) != 0x0003);
        // Clear interrupt flag
        //AdccRegs.ADCINTFLGCLR.all = 0x0003;
        // Store results
        AdccResult0 = AdccResultRegs.ADCRESULT0;
    
        if (((AdccResult0 - pPoti->value) > 90) || ((pPoti->value - AdccResult0) > 90 ))
        {
            pPoti->value = AdccResult0; //int32 wert mit uint16 wert
            Stillstand = false;
            //pPoti->PotiValueChanged = true;
        } else if((!Stillstand) ) //&& (pPoti->PotiValue == AdccResult0)
        {
            //pPoti->PotiValueChanged = true;
            if((!Stillstand) && (!Test))
            {
                pPoti->valueChanged = true;
                Stillstand = true;
                Test = true;
            }
            Test = false;
        }
    
        // start conversions immediately via software, ADCA
        AdccRegs.ADCSOCFRC1.all = 0x0003; //SOC0 and SOC1
    
        return errorCode;
    }

    另一个变量是一个位于名称空间去红色变量(=> SolollPosGenerator sollPosGen;)内的变量。 "SolollPosGenerator"是自己的#typedef-structure。

    此致 Ralf

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

    您好、Ralf、

    我将为您进一步研究这个问题。 我已尝试使用命名空间设置复制您的方案、但看到全局变量更新时没有问题。 我还将尝试在这里与我们的一些其他专家进行磋商。

    此致、
    Ibukun

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

    Ibukun、您好!

    我发现、链接器命令文件中的.bss 段在源代码中初始化为 CLA 程序代码。 将其更改为 CLA 数据存储器后、更新变量即可正常工作。 这解决了我的问题。

    基于链接器命令文件中的设置自动生成的源代码会很有帮助。

    谢谢、Ralf Rink、此致

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

    您好、Ralf、

    很高兴听到您能够解决此问题。  我怀疑也存在某种编译器/链接器问题。

    此致、
    Ibukun