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.

[参考译文] CCS/MSP430F5522:如何查找声明为 float 的变量存储在存储器中的哪个位置?

Guru**** 2550550 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/591216/ccs-msp430f5522-how-do-i-find-where-variables-declared-as-floats-are-stored-in-memory

器件型号:MSP430F5522

工具/软件:Code Composer Studio

我不确定我是否会正确地问这个问题、因此请多多包涵。

我在从 A/D 转换器读取存储的数据时遇到问题。  当我调试并查看从 A/D 转换器引脚设置的变量时、我的12个变量中的11个存储为0。  最后一个是预期值。  当我通过 USB 将我的器件连接到我的计算机时、我可以看到 MSP430 USB HID 应用程序上每个变量的值、这些变量的值都按预期读数。  只有当它断开连接时、除一个变量之外的所有变量都将丢失。  我猜这是因为它们被设置为存储在不正确的寄存器中、但如何找到这些变量的存储位置?  

供参考、这些变量 都基于从多达3个 A/D 引脚读取的值。  USB HID 应用程序允许用户选择与每个变量对应的引脚、并且无论它们基于哪个 A/D、同一变量在调试器中始终读为零。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Kyle、
    您如何存储变量? 您是否有可以共享的代码?

    您是否正在使用 DMA? 如果是、您可以检查 DMAxDA 寄存器中的存储器位置。

    如果您在连接到 USB 时查看调试器中的变量、它们是否仍读为0?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复!

    缺少的变量存储为浮点值、但它们是静态结构的一部分。  至于存储在存储器中的方式、这就是我要尝试了解的内容。  我继承了这个项目、我很确定这些变量为零、因为存在内存存储问题、但我无法找到它们的存储位置。

    静态结构测试结果 starResults ={0、0、0、0、0、0、0、0、0、0、0、0、0、0}; 
    struct testresults
    {
    float ch1Amplitude;
    float ch2Amplitude;
    float ch3Amplitude;
    int min1;
    int max1;
    int min2;
    int max2;
    int min3;
    int maX3;
    浮点曲折1;
    float 曲折2;
    float 曲折3;
    }; 

    用于比较值的多个位置的变量、但这是将其设置为从模拟输入引脚读取的正确模拟值的函数:

    void testMethod_2 (test_data_t * t、int chan、int led)//连接升压板时具有高灵敏度
    {
    
    
    int i、j、c、k;
    int numTests = 1;//64;//8;
    
    
    long results[2];
    int sample [3];
    
    
    for (i=0;); i< 2;+i)
    {
    results[i]=0;
    }
    
    switch_adc_input( chan );
    if (AdcResolution == TWELVEBITS)
    {
    adc_CONTROL2 |= BIT5;//adc_RES;//设置为12位分辨率
    adc_CONTROL2 &=~BIT4;//
    }
    
    =222;//
    
    ADC12CC1201
    | ADC12CL1;ADC12CC1 = ADC1201;ADC12MCTL1
    
    
    //ADC_control0 |= ADC_ENABLE_CONV;//如果
    
    
    (c < 600)//跳过测试并报告-1结果(由于噪声过大),则启用 ADC 转换。
    {
    
    
    pHOTODIODE1_OFF;pHOTODIODE2_OFF;
    timer_us (100);//测试
    (k=0;k < 1;+k)
    {
    if (chan=ADC_AMP1OUT)
    pHOTODIODE1_ON;
    else pHOTODIODE2_ON;
    
    
    (i=ADC_AMPLED_ON)
    
    ;{=LED = 0;/= 1) naked (+ ON);/I POLLED_ON (= 0);= 0);/I POLLED_ON (+ OFF;= 0)
    
    
    
    使用 LED "5"来不使用 LED、或者在下一条语句中将 LED 时间设置得太短。
    Timer_us (2);
    LED1_OFF;LED2_OFF;LED3_OFF;//关闭 LED
    timer_us (t->消隐_us);
    if (chan=ADC_AMP1OUT)
    PHOTODIODE1_ON;
    else PHOTODIODE2_ON;
    timer_us (t->meas _AMPLES_DE1_ON)
    ;ther_ADC_DELAG_ING_ING_ING_OPT2_ON;elimation_Index;t_ADC_ADC_ADC_ADC_ADC_DE_RESPON_RATE_RESTON_RATE
    adcResults=0;
    adc_control0 |= adc_start_conv+adc_enable_conv; //开始转换
    __bis_SR_register (LPM0_Bits + GIE); //输入 LPM4,启用中断
    __NO_OPERATION (); //对于调试
    
    器采样[0]= adcResults>5;//(long) ADC_MEMORY_LOC;
    PHOTODIODE1_OFF;PHOTODIODE2_OFF;
    timer_us (50);
    LED_ON (LED、 PD_OFF);//LED_ON (LED、PD_ON);
    TIMER_us (t->ledOn_usec);
    LED1_OFF; LED2_OFF;LED3_OFF;//关闭 LED
    TIMER_us (t->blank_us);
    if (chan=ADC_AMP1OUT)
    PHOTODIODE1_ON;
    否则 PHOTODIODE2_ON;
    timer_us (t->meas _delay_us);
    
    adcIndex=ADC_SAMPS_幅 值;tESt2_T2_TESTAM_S
    adcResults=0;
    adc_control0 |= adc_start_conv+adc_enable_conv; //开始转换
    __bis_SR_register (LPM0_Bits + GIE); //输入 LPM4,启用中断
    __NO_OPERATION (); //对于调试
    
    器采样[1]= adcResults>5;//(long) ADC_MEMORY_LOC;
    
    SAMPLE[0]=SAMPLE[1]-SAMPLE[0];
    results[0]+=(long) SAMPLE[0];
    
    timer_us (10);//350);//450);//1000);
    
    }
    
    
    
    
    
    ~ADC_CONTROR0 &=~ADC_ENABLE_CONV;//禁用 ADC 转换 ADC12CTL0 &=~ADC12MSC;ADC12CTL1 &= ADC12CONSEQ_2;
    ADC12IE=0;
    ADC_CONTROL2 |= BIT4;//ADC_RES; //设置为10位分辨率
    ADC_CONTROL2 &=~BIC5;//
    
    results[0]=(results[0]/numTests);
    
    
    //timer_us (75);// 5ms x 10 = 50ms
    }
    else
    results[0]=-1;
    
    pHOTODIODE1_ON;// timer_us (75);// 5ms x 10 = 50ms}elt=
    
    starResults.ch1Amplitude;[currentIndex&= 0]=[currentResults=[t&s=
    
    starResults.ch2Amplitude
    
    ;[currentIndex]=[current] starResults.ch3Amplitude (parats=[t&=);[startdata=[startouts=[t&outs=0].outs=[current](parats=[t&outs=[t&s].outs=[r&s].outs=[t&s=[t&s] 

    需要注意的关键部分是:

    starResults.ch2Amplitude =(float) result[0];
    否则 starResults.ch3Amplitude =(float) result[0]; 

    ch2Amplitude 和 ch3Amplitude 是卡在0的变量。


    Ch1Amplitude 是预期模拟值的变量。 我在连接到调试器时读取这些值。 

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

    您好、Kyle、

    首先、ID 要指出、如果 MSP430上可能、应尽量避免使用浮点数。 它们效率低下。 其次、我假设结构中的其他9个变量取决于 CH2和 CH3振幅?

    如果您将结构添加到观察表达式、您可以看到结构及其内容的存储器位置。 (参见下图)

    您能否断点上面标记为第115行的内容并检查是否填充了 Result [0]? 或者、您可以交换第113行和第115行、查看是否在 ch2panding 中获得值;以排除内存问题。

    令我感到奇怪的是、你要转换第二个2、而不是第一个(工作)变量。 我对此进行了快速测试、结果相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次感谢您的帮助。 我非常感谢它、稍后我会在确定变量声明后处理它。 正如我说过的、我继承了这个项目、其中的许多项目对我来说都是一种新的。 其他变量是相对于前三个振幅变量的变量。 因此、应该填充最小值/最大值/平均值2和3和0、但对于1、应该填充该值。

    感谢您提供地址提示。 我实际上在监视该结构、但我的窗口很小、地址列不可见。 这是一个愚蠢的错误。

    开关线路113和115在调试器上生成了通道2振幅值、而与这些器件一同运行的 GUI 程序显示了预期的通道1振幅。 在"Expressions"选项卡上、该值显示在 ch2Amplitude 上、而 CH1为0、并且这些值的地址不会改变、因此我猜我的存储器问题理论无效。 现在我不知道问题会是什么
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否曾将其输入到第114和116行的其他项中?
    如果是、您能否断开点115和116行并检查结果[0]的内容?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它永远不会达到这些断点。 因此、这意味着 t=&stardata.BtestData[currentTestParmIndex]和(t=&stardata.CtestData[currentTestParmIndex]从不为 true。 但为什么 A 的情况如此呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这意味着它始终为真。 因此、出于某种原因、t 不会被修改。 尝试 Ctrl +单击 t、或右键单击并单击"显示引用"。 这将有助于您跟踪它不发生变化的原因。 然后、您只需了解如何输入该部分代码并获得匹配条件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我仍然没有解决这个问题、但现在我能够后退了、我肯定能够解决这个问题、因为您的建议、谢谢 Cameron!

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

    乐于助人:)