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.
工具/软件:Code Composer Studio
您好!
我遇到 for 循环问题、代码编译正常、但程序似乎忽略 for 语句。 如果我将"for (for)"更改为"while (while)"、代码将按预期运行。 导致此行为的原因可能是什么? 我缺少一些启用循环的设置?
循环中的代码是什么?
如果代码没有副作用、例如、是为了尝试创建延迟、优化器可能会删除循环。
如果您提供了相关代码和构建设置、则会更容易。
请记住、C 语言编译器(即 C 语言)具有"全部为平面存储器"模型、该模型源自它来自(Unix)的环境。 C 中没有 I/O。如果在编译器范围之外发生了一些变化(即外设寄存器、中断例程)、则必须使用"volatile"告知编译器。 否则、他将在第一个优化级别将其删除。
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 中编写卷积和不可维护的代码。