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/EK-TM4C129EXL:硬件观察点未触发(后续)

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/671871/ccs-ek-tm4c129exl-hardware-watchpoint-not-triggering-follow-up

器件型号:EK-TM4C129EXL

工具/软件:Code Composer Studio

您好!

这是一个较旧线程的后续操作: CCS/EK-TM4C129EXL:硬件观察点未触发

我们再次使用全新的 CCS 8.0分析了硬件观察点的行为。 错误(或不确定性)仍然存在。 这是因为: BTW:地址 0x40064004 不是位段地址。 TM4C129E 数据表第115页指出:外设位带别名从0x4200.0000到0x43FF.FFFF。

这意味着0x40064004是标准外设存储器访问。 数据表第10.3.1.2章介绍了数据寄存器修改多个位(使用位掩码)的操作。 因此、地址0x40064004的最后一个"4"表示选择最低 GPIODATA 位的0b100。 然后可以将其设置为1或0。 同样适用于0x400643FC:0x3FC = 0b11111100、它选择从7到0的所有位都可更改。

因此、如果我按照旧线程中的建议选择0x40064004作为硬件观察点的触发地址、我可以(有时)在访问 GPIO 端口 N 的位0时成功地触发硬件观察点

但是、如果我选择0x400643FC、它不会触发、尽管内存浏览器正确显示了寄存器内容的更改。 不幸的是、这不能像我们所知道的那样正常工作。

更奇怪的是:如果我同时写入两个位(例如、位0和位1来打开引脚0和1上的两个 LED)、位0上的观察点停止被触发。 因此、只能在一个端口上触发一个单一位访问、而不能在多个位上触发。  

还有更多的问题:有时、当调试终止并重新启动时、会显示一个观察点被禁用、但它仍然有效、即使在所有断点都被删除后也是如此!

下次重新启动调试时、观察点仍然处于活动状态。 但无法将其删除、因为没有! 哈? 如果再次重新创建观察点、则执行会恢复、但现在不会在活动观察点停止!...

抱歉、这会使硬件观测点对我们的应用无用。

也许有人有新的建议或解释?

此致、Greg

//
//显示 EK-TM4C129EXL 上的奇怪硬件观察点行为的简单示例
//*********

#include 
#include 
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"


int main (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPION);

//在这里等待3个时钟
SysCtlDelay (2);

GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1_GPIO_PIN_0);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1|GPIO_PIN_0、0x00);

while (1)
{
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、1);//观察点0x40064004触发正确
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);//观察点0x40064004触发正确
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1|GPIO_PIN_0、3);//观察点0x40064004不会触发
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1|GPIO_PIN_0、0);//观察点0x40064004不会触发
}
}

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

    Greg、

    我查看了旧的论坛主题和错误报告、并有以下评论。  

    GPIOPinWrite()函数主动执行以下例程:

    [引用 user="gpio.c"]

    空 GPIOPinWrite (uint32_t ui32Port、uint8_t ui8引脚、uint8_t ui8Val)

    //
    //检查参数。
    //
    assert (_GPIOBaseValid (ui32Port));

    //
    //写入引脚。
    //
    HWREG (ui32Port +(GPIO_O_DATA +(ui8引脚<< 2)))= ui8Val;

    [/报价]

    因此,它会执行 CPU 对从括号之间的表达式计算得出的地址的写入:ui32Port +(GPIO_DATA+(ui8Pins <<2)

    文件 hw_gpio.h 将 GPIO_0_DATA 定义为0x0。 因此、对于您的六个写入操作、地址为:

    0x40064004
    0x40064008
    0x40064008
    0x40064004
    0x4006400C
    0x4006400C

    有鉴于此并查看上一个线程中显示的解释、我认为观察点被正确触发-即、只有当 CPU 显式写入观察点指定的地址时。  

    我在这个帖子的底部发送了一个我在这里执行的运行操作所做的短片、因此、也许您可以尝试发现我可能做的任何事情。  

    [引用 user="Gregor Burmberger"]

    还有更多的问题:有时、当调试终止并重新启动时、会显示一个观察点被禁用、但它仍然有效、即使在所有断点都被删除后也是如此!

    下次重新启动调试时、观察点仍然处于活动状态。 但无法将其删除、因为没有! 哈? 如果再次重新创建观察点、则执行会恢复、但现在不会在活动观察点停止!...

    [/报价]

    IIRC Cortex M 内核中的断点/观察点通常在内核本身而不是在 IDE 上设置、因此、如果在后续调试启动之间硬件未复位或断电、我会期望这种奇怪的行为。 我过去曾几次发现自己处于这种情况。

    此外、只需检查以下选项是否已停用、如果您在关闭调试会话时将延迟的观察点/断点保持在活动状态、这也会造成一些混淆。

    希望这对您有所帮助、

    拉斐尔

    e2e.ti.com/.../2018_2D00_03_2D00_15_5F00_13h36_5F00_15.mp4