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/TM4C1290NCPDT:在调试模式下按顺序执行

Guru**** 2988540 points

Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/937988/ccs-tm4c1290ncpdt-out-of-order-execution-in-debug-mode

器件型号:TM4C1290NCPDT

工具/软件:Code Composer Studio

您好!

我在   Windows 10 x64专业版下将 CCS 版本10.1.0.00010与 TivaC EK-TM4C1294XL LaunchPad 搭配使用。

我注意到、当我在调试模式下单步执行代码时、代码执行路径不是按照在源代码中写入的顺序。 我想正在进行某种优化。 但是、这是一个相当误导性   的情况、例如、我注意到代码似乎在之前的 GPIOPinTypeGPIOInput 之前执行 GPIOPinRead。 这使得调试非常令人困惑。 请作出澄清。

谢谢、

Sam

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

    尊敬的 Sam:

    [引用 user="Sam Frank "]我想正在进行某种优化。

    这很有可能。  

    https://dev.ti.com/tirex/explore/node?node=AA6fEd9YTSwdDSyHdoLE9Q__FUz-xrs__LATEST

    使用的优化级别是多少?

    谢谢

    Ki

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

    您好 Ki、

    调试构建中的优化级别为2。

    Sam

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

    是的、-o2相当激进、此时源代码行调试开始变得非常困难。

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

    我关闭了优化、然后在源代码之后单步执行代码。 但是、在  GPIOPinTypeGPIOInput 之前执行 GPIOPinRead 并进行-o2优化是很奇怪的! 启用优化后、Code Composer Studio 是否准确地遵循处理器中的代码执行?

    谢谢、

    Sam

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

    我不是优化器专家、但看到代码看起来执行不符合顺序(对于优化代码)也不常见。 在我发送的链接中:

    • 单步执行是否完全按照所写的代码进行? 或者、它是否以似乎随机的顺序跳过?

    您不能依赖源代码行调试来获得高度优化的代码。

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

    好的、谢谢!

    Sam

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

    [引用 USER="Sam Frank "]但是、很奇怪的是看到 GPIOPinRead 是在 GPIOPinTypeGPIOInput 之前执行的、并且进行了-o2优化! [/引用]优化器可以重新排序不会更改观察到的行为的指令。 对于具有函数调用的源语句、可能会生成多条指令。 优化器可以重新排序为函数调用执行"设置"操作的指令、例如加载寄存器、同时仍以源代码顺序正确执行实际函数调用。

    例如、采用了以下示例来源:

    void main (void)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOJ))
    {
    }
    GPIOPinTypeGPIOInput (GPIO_PORTJ_BASE、GPIO_PIN_0 | GPIO_PIN_1);
    GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_0 | GPIO_PIN_1、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
    Switch_Inputs = GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0 | GPIO_PIN_1);
    } 

    当编译器使用使用 TI ARM 编译 器 v20.2.2且使用 -O2时、当源代码在 CCS 10.1中步进时、中执行的源语句的明显顺序为:

    • SysCtlPeripheralReady
    • SysCtlPeripheralEnable
    • SysCtlPeripheralReady
    • GPIOPinRead
    • GPIOPinTypeGPIOInput
    • GPIOPadConfigSet
    • GPIOPinRead

    即源步进显示了一个混乱的顺序。

    CCS 调试器中的"Disassembly"视图显示了与生成的指令交错的源语句:

    Main():
    000003b8:B510 按 {R4、r14}
    14. while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOJ)
    ) 000003ba:4C0D LDR R4、[PC、#0x34]
    13. SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
    000003bc:4620 MOV R0、R4
    000003be:F000F839 BL SysCtlPeripheralEnable
    14 while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOJ))
    $C$L1:
    000003c2:4620 MOV R0、R4
    000003c4:F000F81A BL SysCtlPeripheralReady
    000003c8:2800 CMP R0、#0
    000003ca:D0FA 波克 1美元1美元
    19. Switch_Inputs = GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0 | GPIO_PIN_1);
    000003cc:4C09 LDR R4、[PC、#0x24]
    17. GPIOPinTypeGPIOInput (GPIO_PORTJ_BASE、GPIO_PIN_0 | GPIO_PIN_1);
    000003ce:2103. MOV R1、#3
    000003d0:4620 MOV R0、R4
    000003d2:F000F887 BL GPIOPinTypeGPIOInput
    18. GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_0 | GPIO_PIN_1、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
    000003d6:2103 MOV R1、#3
    000003d8:2201 MOV R2、#1
    000003da:230A MOV R3、#0xA
    000003dc:4620 MOV R0、R4
    000003DE:F7FFFF13 BL GPIOPadConfigSet
    19. Switch_Inputs = GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0 | GPIO_PIN_1);
    000003e2:2103. MOV R1、#3
    000003e4:4620 MOV R0、R4
    000003e6:F000F88E BL GPIOPinRead
    000003ea:4903 LDR R1、[PC、#0xc]
    000003ec:6008 结构 R0、[R1]
    000003ee:BD10 弹出 {R4、PC} 

    实际函数调用的顺序、即 BL 指令、与源语句中的顺序相匹配。 CCS 调试器中显示的令人困惑的源步进顺序是优化器对源语句重新排序的多条指令的副作用。 在此示例中、重新排序是有效的。