嵌入式技术william hill官网
直播中

最强海贼王

9年用户 1408经验值
擅长:MEMS/传感技术
私信 关注
[问答]

使用gcc O2编译后以太网无法正常工作求助

william hill官网 里有使用过gcc O2编译后以太网无法正常工作的吗。目前的现象是使用debug O0编译,以太网是正常使用的;使用O2编译后遇到上电有时正常,有时不正常,不正常的情况下drv_eth下的中断函数都不再触发了,lwip那边DHCP一直获取不到。

回帖(5)

mintsy

2023-4-14 09:53:52
代码有bug, gcc开-Wall拉满警告,把所有警告解决就行
举报

mintsy

2023-4-14 09:54:04
GCC提供的优化选项,包括-O2,通常能够显著地提高程序性能,但这种优化也可能导致程序运行时偶发的bug。
原因在于优化选项往往会改变代码的执行顺序和内存布局,有时候甚至会导致未定义的行为。这些问题在O0优化选项下不会出现,因为这个选项不对代码进行任何优化,使代码执行顺序和内存布局都保持原样。
可能的具体原因包括:
优化时可能会改变控制流程,例如删除一些看似无用的代码,但实际上是程序正确性的必要条件。这种情况下,可能导致函数调用栈的异常、指针操作错误等问题。
编译器可能使用寄存器以及各种寄存器优化技巧,导致程序状态与内存中的状态不一致。这种情况下,可能导致读写内存或寄存器的错误。
对于某些编译器等工具本身存在的bug,某些优化选项可能会使这些bug更容易被激发。
综上所述,虽然优化选项可以加速程序的执行,但会导致更多的风险和困难。在出现偶发的bug时,建议尝试使用O0选项重新编译,并仔细分析、定位问题,找到根本原因并解决它


举报

最强海贼王

2023-4-14 09:54:15
把告警全部消除也还是不行
举报

mintsy

2023-4-14 09:54:31
好像 -Wall并不是所有警告都开,还有很多其他警告,另外编译前先clean一下,否则缓存,警告就没了
举报

mintsy

2023-4-14 09:54:38
如果您的代码在使用-O2优化时出现了bug,那么建议您使用以下警告选项进行编译:

-Wall -Wextra -Wpedantic -Wconversion -Wsign-conversion -Wformat -Wstrict-aliasing -Wstrict-overflow

这些选项将启用许多警告,并帮助您找到一些常见的编程错误。下面是每个选项的含义:

-Wall:启用所有警告选项。

-Wextra:启用额外的警告。

-Wpedantic:启用严格的ISO C标准警告。

-Wconversion:启用类型转换警告。

-Wsign-conversion:启用signed/unsigned类型之间的转换警告。

-Wformat:启用格式字符串警告。

-Wstrict-aliasing:启用别名声明严格实施警告。

-Wstrict-overflow:启用严格的算术溢出警告。

建议您在开发过程中使用这些警告选项,以帮助找到潜在的编程错误。如果您遇到警告,请仔细检查代码,并修复潜在问题,以确保代码质量和安全性。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分