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-TM4C1294XL:用于忽略循环

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/573848/ccs-ek-tm4c1294xl-for-loop-being-ignored

器件型号:EK-TM4C1294XL

工具/软件:Code Composer Studio

您好!

我遇到 for 循环问题、代码编译正常、但程序似乎忽略 for 语句。 如果我将"for (for)"更改为"while (while)"、代码将按预期运行。 导致此行为的原因可能是什么? 我缺少一些启用循环的设置?

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

    循环中的代码是什么?

    如果代码没有副作用、例如、是为了尝试创建延迟、优化器可能会删除循环。

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

    如果您提供了相关代码和构建设置、则会更容易。

    请记住、C 语言编译器(即 C 语言)具有"全部为平面存储器"模型、该模型源自它来自(Unix)的环境。 C 中没有 I/O。如果在编译器范围之外发生了一些变化(即外设寄存器、中断例程)、则必须使用"volatile"告知编译器。 否则、他将在第一个优化级别将其删除。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Helder、
    在编程学习过程中,每隔一段时间,他就会“发现 C 语言中的错误”:)
    再看一下、因为如果您的代码没有达到您预期的效果、它可能会达到您编写的效果!
    在绝望的情况下、关闭所有优化并使一切变得不稳定-只能确保。
    谢谢
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    if (ROM_SysCtlResetCauseGet ()& SYSCTL_CAUSE_WDOG0)
    {
    uint32_t pui32Data[1];
    volatile uint16_t i;
    uint16_t j = 0;
    
    EEPROM_Init();
    
    //均匀地使用 EEPROM (至少尝试一下)
    对于(I = 0;I <= 6136;I += 4)
    {
    ROM_EEPROMRead (pui32Data、0x00 | I、sizeof (pui32Data));
    
    if (pui32Data[0]= 0xFFFFFFFF)
    中断;
    
    if (i ==6136)
    {
    ROM_EEPROMRead (pui32Data、0x17FC、sizeof (pui32Data));
    
    if (pui32Data[0]= 0xFFFFFFFF)
    {
    pui32Data[0]= 0;
    ROM_EEPROMProgram (pui32Data、0x17FC、sizeof (pui32Data));
    }
    
    j +=(I/4);
    pui32Data[0]+= j;
    I = 0;
    J = 0;
    
    EEPROMMassEras();
    
    ROM_EEPROMProgram (pui32Data、0x17FC、sizeof (pui32Data));
    
    中断;
    }
    }
    
    pui32Data[0]= 0;
    
    ROM_EEPROMProgram (pui32Data、0x00 | I、sizeof (pui32Data));
    ROM_EEPROMRead (pui32Data、0x17FC、sizeof (pui32Data));
    
    if (pui32Data[0]!= 0xFFFFFFFF)
    {
    if (i ==0)
    I = 4;
    
    其他
    I +=4;
    
    I /= 4;
    j +=(i + pui32Data[0])-1;
    }
    
    其他
    {
    if (i ==0)
    I = 4;
    
    其他
    I +=4;
    
    I /= 4;
    j += i;
    }
    
    UARTprintf ("看门狗复位(WDOG_0)")。\n"
    "重置:%u\n\n"j);
    
    ROM_SysCtlResetCauseClear (SYSCTL_CAUSE_WDOG0);
    
    ROM_SysCtlPeripheralDisable (SYSCTL_Periph_EEPROM0);
    ROM_SysCtlPeripheralReset (SYSCTL_Periph_EEPROM0);
    } 

    有时候我会感觉很愚蠢,就像现在一样。 用一个词你可以解决所有问题(如果不是这个问题的话->";")。 从未考虑过优化是问题、而易失性可以解决这一问题。 感谢大家! 对于想  知道的人、优化级别设置为-opt_level=2 -opt_for_speed=5、代码是上面的代码。

    最初我使用 goto,但他们说 goto 是邪恶的:p,所以我将代码更改为用于循环。  

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

    [引用用户="Helder Sales"]最初我使用 goto,但他们说 goto 是邪恶的:p ...[/quot]

    de Omnibus Dibitidoid.

    如果没有公司编码准则(如 MISRA)禁止您进行某些构造、请随意使用。 a goto >> can <<使代码更短并提高可读性。

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

    [引用用户="f m"]a goto >> can <<使代码更短并提高可读性。

    您刚才提到过、我意识到在这种情况下使用 goto 会使代码更小。 因为它易于实现、所以我通常会使用它。

    也许他们说这是邪恶的,因为人们往往过度使用 gotos,这会使代码难以理解,或者只是为了找到更好的方法而懒惰。

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

    [引用 user="Helder Sales)]您刚才提到过,我意识到在这种情况下使用 goto 会使代码变小一些。 我通常使用、因为它易于实施。[/quot]

    较短的源代码不一定意味着较短的目标代码。 现代编译器相当不错、因此不必再复杂。 清晰的结构化、自文档化代码不是编程指南的产物、而是负责的编码器的产物。

    “goto”语句源于基本语言,最初允许“jump”到任何地方。 也许您可以挖掘一个旧的基本意大利面代码示例、了解它现在被冻结的原因。 但您也可以在 MISRA-C 中编写卷积和不可维护的代码。