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.

[参考译文] 编译器/TM4C1230H6PM:TM4C1230延迟函数 SysCtlDelay()问题

Guru**** 2481465 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/704676/compiler-tm4c1230h6pm-tm4c1230-delay-function-sysctldelay-problem

器件型号:TM4C1230H6PM

工具/软件:TI C/C++编译器

我使用延迟函数 SysCtlDelay()来延迟毫秒,该函数的实现方式如下:

void SlepMillisecond (U16 u16milisecond)
{
SysCtlDelay (SysCtlClockGet ()/ 3000 * u16milisecond);//1ms
} 
void
SysCtlDelay (uint32_t ui32Count)
{
_asm (" subs r0、#1\n"
" bne.n SysCtlDelay\n"
" BX lr");
} 

在正常情况下、工作正常。 但是、当我更改一些预编译宏(由我自己定义)时、此函数将输出双倍延迟时间。 我确信 预编译的宏 不会影响此代码。

我使用示波器检查时钟是否正常。 我还检查了 anothter 函数 执行时间、但是预编译的宏是更改的、执行时间是相同的、除了函数 SysCtlDelay()。

我单步执行此函数来调试反汇编、 在这两种情况下执行的汇编指令数是相同的。 因此、我真的不明白为什么 在相同代码和相同时钟的情况下它会有不同的结果?

编译器环境:IAR Embedded Workbench 7.0

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

    我想我在这里缺少了一个关键信息来了解正在发生的情况。

    您已经发布了 driverlib 代码、但在您通过自己定义预编译宏来更改它时、您也会提到它。 您能否发布更改内容、定义方式以及更改适用于哪些文件?

    另外、在相关的注释中、您尝试从重新定义宏中获得什么好处? 我不清楚为什么你甚至需要这么做、你能解释一下你通过重新定义宏来解决的问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
      我可能在问题中表达错误、应该是 编译器开关、而不是预编译的 Marco、因为 Marco 是区分存储版本和产品版本的标签。
        如下图所示、但是、当我启用 STORE_VERSION 和禁用 PRODUCT_VERSION 时、DELAY 函数具有正确的结果  
     当我 禁用 STORE_VERSION && ENABLE PRODUCT_VERSION 时、DELAY 函数的结果错误。
    以下是我如何在 工程中使用编译器开关:
    #ifdef product_version
    /*代码*/
    #endif
    
    #ifdef STORE_VERSION
    /*代码*/
    #endif 
    product_version 和 STORE_VERSION 存在于以下文件中,但 DELAY 函数的结果不正确(

    时间加倍)在 IoT_Sound.c 和 IoT_SLEEP.c 中调用它时、   

    因此、在我看来 、编译器开关不会影响 delay 函数的结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将 SysCtlDelay()更改为 ROM_SysCtlDelay(),这个问题得到了解决。 但我真的不知道为什么?!!!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先、我们相信您(实际上)正面临 "供应商 MCU 支持"的限制。    (您的异常使用情况-"对您的质疑过大"-因此可能"不公平"、给供应商带来负担...)

    您的代码: 'SysCtlDelay (SysCtlClockGet ()/ 3000 * u16milisecond);  //1ms'  

    尤其是'SysCtlClockGet ()'部分 会带来'vect'-它不会吗?   (硬编码您的值-而不是使用(远不止)麻烦 的'SysCtlClockGet ()'-证明您的优势-它不是吗?)

    由于'SysCtlDelay()'持续时间的"积分倍数"-您的'failing (加倍) mode'具有 someway /不知为何的-启用了'SysCtlDelay()'的"双路调用"。   是否证明您调用'SysCtlDelay()'... '背靠背'-注意-如果这样的'功能持续时间的下降'仍然存在吗?   如果第二次调用-获得"正常"持续时间-则可确保您的"故障模式"已"预先处置 "SysCtlDelay()到其"失败的命运"。

    作为一个水手——我们被教导要寻找“暴风雨中的任何港口”。   (几乎)可以保证您使用"众多 MCU 计时器之一"(而不是)-会"完全避免这个问题!"

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

    您好!

    不幸的是、我倾向于同意 CB1、因为这对我来说似乎很难解释或评论所提供的信息。

    您说的代码是什么

    void SlepMillisecond (U16 u16milisecond)
    {
    SysCtlDelay (SysCtlClockGet ()/ 3000 * u16milisecond);//1ms
    } 

    根据使用 product_version 或 STORE_VERSION 得出不同的结果?

    您是否在两种情况下都检查了 SysCtlClockGet 的结果?

    如果使用 ROM_COMMAND 有效、您可能需要注意的另一件事是优化和其他编译器设置。 遗憾的是、在 IAR 中、我不了解有关此类设置的任何可能的"问题"。

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

    Jacobi 先生(即 Ralph)

    彻底亵渎-" gotchas "-在更长的现有时间内引起-部署得更远-真正的(所有 ARM MCU 均已邀请) PRO IDE!    在这些"较低版本"中、极不可能、更明显的是、声称低价(免费)是他们(唯一的)"存在理由"。

    并造成巨大的痛苦和痛苦-当客户用户成长时-并希望评估任何 "跳跃式 ARM MCU"!    (有多个- BTW...)

    半夜-昨晚-我设计了一种方法来"解决"这张海报的问题:

    • 在他"失败"的情况下、系统地删除每个功能-一次一个。   预计少数(主要只有一个)功能将"导致海报出现问题!"   具有明确的"基于 kiss 的"发现-如此高的专注-最能成功地进行故障排除!   (从未通过"大混乱"实现-"立即实现!"