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.

[参考译文] CC1352R:代码仅在连接调试器时工作

Guru**** 2559730 points
Other Parts Discussed in Thread: CC1352R

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/971679/cc1352r-code-works-only-when-debugger-is-connected

器件型号:CC1352R

您好!

我再次遇到了代码仅在与调试器连接时才工作的问题。 在论坛上看,这种情况似乎不是很少见。 不幸的是,也很少有一个好的答案。

我阅读了有关调试器连接的硬件问题的内容。 但可以吗? 我甚至不知道。 从处理器的角度来看、无论是否连接了调试器、从内部闪存运行代码有何区别?

这是我的实际问题:

  • 我使用硬件计时器来获取一些计时信息。 该值由 HWREG (GPT0_NONBUF_BASE + GPT_O_TAR)读取;
  • 现在、我有一个等待一些节拍的等待函数:
#pragma FUNCTION_OPTIONS ("-opt_level=0")
void Tbl_HW:::waitTicks (uint32_t nTicks)
{
uint32_t startValue = HWREG (GPT0_NONBUF_BASE + GPT_O_TAR);
uint32_t actValue;
操作
{
actValue = HWREG (GPT0_NONBUF_BASE + GPT_O_TAR);
}
while ((actValue-startValue)< nTicks);
} 

我有一个使用 LED 的信号函数

void Tbl_HW::SignalPoint (int nSignals)
{
SwitchRedOff ();
//switchGreenOn();
WAIT_ms (300);
while (nSignals > 0)
{
nSignals-;
SwitchBlueOn();
WAIT_ms (200);
switchBlueOff();
wait_ms (200);
}
wait_ms (700);
} 

然后在类的临时实例的析构函数中调用该 SignalPoint 函数。 当我运行这个程序时、在连接调试器的情况下、我看到蓝色 LED 照明。 但是、当调试器断开连接时、LED 保持暗。

我考虑了一些优化、从编译器中删除了我的等待循环。 因此、我插入了函数选项 pragma。 但这似乎没有什么不同。 即使我使用调试器运行它、调试器也会将程序下载到目标并执行它。 断开调试器连接并执行下电上电后、将启动相同的程序、该程序仍位于内部闪存中。 因此、这也不可能是根本原因。

有什么想法、我可以在未连接调试器时执行什么操作来使它也运行?

大家好
Erwin

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

    当调试器被连接时、芯片不能下降到待机状态。 因此、如果您的电路板由于某种原因具有导致待机问题的设置、这可能会导致程序在调试器连接时运行、而不是在其他情况下运行。

    -您的电路板上是否有32kHz xtal  

    -您已设置使用哪个 LF 时钟源?  

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

    为了清楚说明、我的功能是:

    void a::foo (void)
    {
    TB B;//创建对象 B
    的实例 B.doSmomething()
    }
    
    void a:::foo2 (void)
    {
    foo();
    //在 foo 末尾调用 B 的析构函数。
    //在该析构函数中,蓝色 LED 在一段时间内被打开
    
    doSomethingElse();//在 doSomethingElse 中,红色 LED 被打开
    } 

    通常、我首先看到蓝色 LED、然后看到红色 LED、这是连接调试器时的情况。

    如果没有调试器、我只会看到红色 LED。 这意味着处理器不会进入睡眠状态、也不会崩溃。 它的工作原理只是除了析构函数的信令。 因此、我不确定是否调用析构函数、即使是应该调用的函数也是如此。 为了证明这一点、我应该将一个示波器连接到蓝色 LED 引脚。 如果析构函数中的时序在没有调试器的情况下变得很简单、并且200mSec 的导通时间现在为20µSec μ s、这应该可以在示波器中看到。 但我的眼睛看不到蓝色。 但连接示波器并不那么容易。

    Erwin

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

    这没有回答我的任何问题。 我需要知道您运行代码的硬件以及您如何设置 LF 时钟源。  

    此外、您为什么直接读取寄存器而不使用驱动程序?  

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

    抱歉。

    硬件是我们采用 CC1352R 处理器的客户设计。 连接了32kHz 和48MHz 晶体。 因此、LF 由这个32kHz 晶体驱动。

    该功能是我的自定义引导加载程序的一部分、并且直接在 resetISR 函数中运行、甚至会将跳转至_c_int00。 由于此引导加载程序也应起作用、当擦除所有剩余的闪存页时、大多数驱动程序函数不能使用。 我只使用 direkt 寄存器访问或 ROM 函数。 我在引导加载程序处理开始时调用的 SetupTrimDevice 函数也是 SDK 源代码的副本、但 ROM 函数是直接调用的。 正常的驱动程序/SDK 函数首先执行一些断言检查、该检查在调用 ROM 函数之前在闪存中实现。 因此、对于空闪存、此器件不存在、因此它们无法正常工作。

    我通过观察 LED 看到的情况、我的解释是调用 B 的函数(请参阅上面的代码)、代码不会随着 B 完成后的最终信号而停止、但 B 析构函数中的信号仅在与调试器一起运行时可见。

    希望这有助于理解

    Erwin

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

    您好、Erwin、  

    您使用的是哪个版本的 SDK、您的应用基于哪个示例?  

    您是否使用单独的 BIM? 片上还是片外?  

    谢谢、  
    ELIN