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.

[参考译文] TMS320F280039C:CCS 可以监视 uint16_t 中的位在运行时是否发生更改

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1520576/tms320f280039c-possible-for-ccs-to-monitor-if-a-bit-inside-an-uint16_t-is-changed-during-runtime

器件型号:TMS320F280039C
主题:C2000WARE 中讨论的其他器件

工具/软件:

尊敬的 champs:

我向我们的客户询问这个问题。

用户使用基于位字段的结构来使用其标志。

现在、他们想知道 uint16_t 变量中的位在运行时是否发生了更改。

CCS 是否可以监测 uint16_t 变量中的位在运行期间是否发生了变化?

这里的挑战是可以更改同一 unit16_t 变量的其他15位。

用户尝试使用 CCS 硬件观察点来监视变量、但它会随着变量的任何位的变化而损坏。

用户只希望监控变量的位4。

或者您有任何其他建议吗?

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

    尊敬的 Wayne:

    条件断点 可用于设置 BP 触发条件(var ^ PreviousValue) & 0x0010 或某种类似语句。

    客户还可以创建记录第四位的先前值和当前值的变量、并通过一些简单的逻辑对此进行检查。  

    我将邀请 CCS 专家进行进一步确认。  

    此致、

    Aishwarya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Deshine Deshine 说:
    用户尝试使用 CCS 硬件观察点来监视变量、但它将像变量的任何位更改一样中断。

    F280039C 观察点支持指定数据掩码:

    数据掩码可用于过滤或屏蔽要观察的数据的位、以便只有特定位或位模式才会触发观察点。

    谢谢

    Ki

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

    尊敬的 Ki:

    让我再检查一下。

    它们的定义与下面的类似(几乎与我们的位域代码相同)。

     

    struct ADCCTL1_BITS {           // bits  description
        Uint16  TEMPCONV:1;         // 0     Temperature sensor connection
        Uint16  VREFLOCONV:1;       // 1     VSSA connection
        Uint16  INTPULSEPOS:1;      // 2     INT pulse generation control
        Uint16  ADCREFSEL:1;        // 3     Internal/external reference select
        Uint16  rsvd1:1;            // 4     reserved
        Uint16  ADCREFPWD:1;        // 5     Reference buffers powerdown
        Uint16  ADCBGPWD:1;         // 6     ADC bandgap powerdown
        Uint16  ADCPWDN:1;          // 7     ADC powerdown
       Uint16  ADCBSYCHN:5;        // 12:8  ADC busy on a channel
        Uint16  ADCBSY:1;           // 13    ADC busy signal
        Uint16  ADCENABLE:1;        // 14    ADC enable
        Uint16  RESET:1;            // 15    ADC master reset
    };
    
    union ADCCTL1_REG {
        Uint16                all;
        struct ADCCTL1_BITS   bit;
    };
    

    现在、我们要监测一个位、比如 这里的位0、TEMPCONV。

    然后、我们可使用带有其掩码的观察点。

    1表示屏蔽它(阻止它)、0表示允许它。

    因此、如果我们只想观察位0、我们应该将数据掩码用作 FFFE。

    这样、即使其他位更改了位1-15、也会将其忽略。

    只能触发位0的变化。

    我们的理解是否正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、如果我们只想观察位0、我们应该将数据掩码用作 FFFE。

    如果您想忽略位1-15的更改、并且仅在位0的更改时触发、则应使用数据掩码值0x1

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

    尊敬的 Ki:

    在我们的测试中似乎出现了问题。

    发送数据

    C:\ti\c2000\C2000Ware_5_04_00_00\driverlib\f28003x\examples\led

    并且仅修改了 led_ex1_blinky.c、如下所示。

    //#############################################################################
    //
    // FILE:   main.c
    //
    // TITLE:  Universal LED Project
    //
    // Universal LED Project Example
    //
    // This example demonstrates how to blink an LED using the **Universal Project**.
    // In order to migrate the project within syscfg, click the swtich button under 
    // the device view and select your corresponding device to migrate, saving the
    // project will auto-migrate your project settings.
    //!
    //!  \note This example project has support for migration across our C2000 
    //!  device families. If you are wanting to build this project from launchpad
    //!  or controlCARD, please specify in the .syscfg file the board you're using.
    //!  At any time you can select another device to migrate this example.
    //
    //#############################################################################
    //
    //
    // $Copyright:
    // Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without 
    // modification, are permitted provided that the following conditions 
    // are met:
    // 
    //   Redistributions of source code must retain the above copyright 
    //   notice, this list of conditions and the following disclaimer.
    // 
    //   Redistributions in binary form must reproduce the above copyright
    //   notice, this list of conditions and the following disclaimer in the 
    //   documentation and/or other materials provided with the   
    //   distribution.
    // 
    //   Neither the name of Texas Instruments Incorporated nor the names of
    //   its contributors may be used to endorse or promote products derived
    //   from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //#############################################################################
    
    //
    // Included Files
    //
    #include "driverlib.h"
    #include "device.h"
    #include "board.h"
    #include "c2000ware_libraries.h"
    
    typedef struct BitFieldReg {           // bits  description
        uint16_t  bit0:1;
        uint16_t  bit1:1;
        uint16_t  bit2:1;
        uint16_t  bit3:1;
        uint16_t  bit4:1;
        uint16_t  bit5:1;
        uint16_t  bit6:1;
        uint16_t  bit7:1;
        uint16_t  bit8:1;
        uint16_t  bit9:1;
        uint16_t  bit10:1;
        uint16_t  bit11:1;
        uint16_t  bit12:1;
        uint16_t  bit13:1;
        uint16_t  bit14:1;
        uint16_t  bit15:1;
    }   BitFieldReg;
    
    typedef union BitFieldRegType {
        uint16_t            all;
        BitFieldReg         bit;
    } BitFieldRegType;
    
    BitFieldRegType BitFieldRegType_Inst1;
    BitFieldRegType *BitFieldRegType_pt1;
    
    
    // Main
    //
    void main(void)
    {
    
        //
        // Initialize device clock and peripherals
        //
        Device_init();
    
        //
        // Disable pin locks and enable internal pull-ups.
        //
        Device_initGPIO();
    
        //
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        //
        Interrupt_initModule();
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // PinMux and Peripheral Initialization
        //
        Board_init();
    
        //
        // C2000Ware Library initialization
        //
        C2000Ware_libraries_init();
    
        //
        // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
        //
        EINT;
        ERTM;
    
        //
        // Loop Forever
        //
        for(;;)
        {
            //
            // Turn on LED
            //
            GPIO_writePin(myBoardLED0_GPIO, 0);
    
            //
            // Delay for a bit.
            //
            DEVICE_DELAY_US(500000);
    
            BitFieldRegType_Inst1.bit.bit0 = 0;
    //        BitFieldRegType_Inst1.bit.bit1 = 1;
    //        BitFieldRegType_Inst1.bit.bit2 = 1;
    //        BitFieldRegType_Inst1.bit.bit3 = 1;
    
    
            //
            // Turn off LED
            //
            GPIO_writePin(myBoardLED0_GPIO, 1);
    
            //
            // Delay for a bit.
            //
            DEVICE_DELAY_US(500000);
    
            BitFieldRegType_Inst1.bit.bit0 = 1;
    //        BitFieldRegType_Inst1.bit.bit1 = 0;
    //        BitFieldRegType_Inst1.bit.bit2 = 0;
    //        BitFieldRegType_Inst1.bit.bit3 = 0;
        }
    }
    
    //
    // End of File
    //
    
    

    位0按预期在运行期间在0和1之间变化。

    像上述设置观察点后、它不会停止。

    出什么问题了吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    运行期间位0在0和1之间按预期变化。

    请注意、"Data Value"(数据值)设置为"0x0"、因此仅当位0被清零时、将数据值设置为0x1的掩码"0x0"才会触发。 如果用户希望它在设置位0时触发(从0变为1)、则需要将数据值指定为"0x1"。 如果您要在发生任何更改时触发、则可能需要设置两个观察点。

    话虽如此、我尝试了 CCS 12.8和 CCS 20.2、但这里有一些错误。 在20.2.0上、当我将该值设置为0并将 mask 设置为1时、即使位0被清零、它也不会停止。 当我将该值设置为1并将掩码设置为1时、它始终会触发-即使该位被清除也是如此。 这似乎不是我所期望的行为。 我需要就此向工程部门咨询。

    谢谢

    Ki

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

    尊敬的 Ki:

    是的。

    我已经在 CCS 12.8.1上进行了测试、发现了与您上述相同的行为。 这就是为什么我感到困惑和怀疑是否有一个错误,也.

    请在您与工程部门核实后随时给我发帖。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请在您与工程部门核实后让我留言。

    我用工程展示了行为、他们似乎同意行为也不是他们所期望的。 我为此问题提交了一个错误。 跟踪链接: https://sir.ext.ti.com/jira/browse/EXT_EP-12629

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

    尊敬的 Ki:

    您是否希望提高其优先级、因为用户需要使用它来调试现场侧产品中的问题?

    如果您能尽快解决此问题、将不胜感激、因为它会对业务产生影响。

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

    我将对此进行讨论。 请注意、这可能不是简单的修复、因此我无法保证时间线。 客户可能希望了解 Aishwarya 建议的权变措施。

    经过进一步调查、该问题似乎会影响最新的 C2000器件、例如具有 ERAD 的器件。 较旧的 C2000器件似乎不存在此问题/

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

    尊敬的 Ki:

    您能否告诉我 Aishwarya 建议的解决方法?

    我看不到它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="4952" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1520576/tms320f280039c-possible-for-ccs-to-monitor-if-a-bit-inside-an-uint16_t-is-changed-during-runtime/5859926 #5859926"]

    您能否告诉我 Aishwarya 建议的解决方法?

    我看不到它。

    [/报价]

    这是对此主题的第一个回复:

    [报价 userid="573843" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1520576/tms320f280039c-possible-for-ccs-to-monitor-if-a-bit-inside-an-uint16_t-is-changed-during-runtime/5846208 #5846208"]

    尊敬的 Wayne:

    条件断点 可用于设置 BP 触发条件(var ^ PreviousValue) & 0x0010 或某种类似语句。

    客户还可以创建记录第四位的先前值和当前值的变量、并通过一些简单的逻辑对此进行检查。  

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

    尊敬的 Ki:

    让我澄清背后的逻辑。

    在我看来、CCS 观察点使用 F280039 ERAD、这是一种用于直接监测数据线的硬件。

    使用条件断点就像 CCS GEL 软件进行后处理一样。 也就是说、CCS 观察点由变量的任何变化触发、然后使用 GEL 计算变量的过滤位。 这样、只有变量的更改比 CCS GEL 的计算时间慢得多、以便 CCS GEL 可以计算变量并生成触发条件时、才有意义。

    我的理解是否正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通过使用条件断点、这就像通过 CCS GEL 软件进行后处理。 也就是说、CCS 观察点由变量的任何更改触发、然后使用 GEL 计算变量的过滤位。

    是的。

    这样、只有变量的更改比 CCS GEL 的计算时间慢得多、以便 CCS GEL 可以计算它并生成触发信号、这才有意义。

    此类条件断点属于侵入式。 因此、当在任何写入时触发观察点时、CPU 会停止、以便调试器随后可以评估表达式、以查看是否满足条件。 如果是、则 CPU 将保持暂停、前提是所需的操作是保持暂停或执行任何其他指定的操作、然后自动恢复 CPU 的执行。 如果不满足此条件、则自动执行 CPU。 需要注意的关键是、在调试器评估条件时 CPU 始终暂停。