2

最近在我从事的一个项目中“修复”了一个错误,但到目前为止,没有人能够解释修复工作的原因。(那么它真的是一个修复吗?)代码是在实时系统下的内核空间中运行的,所以这个问题会导致系统完全锁定。这也使得调试比平常更难。

此版本使系统崩溃:

int  dups[EMCMOT_MAX_AXIS] = {0};
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};

这个版本不崩溃

int  dups[EMCMOT_MAX_AXIS];
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};
int  i;
for (i=0; i<EMCMOT_MAX_AXIS; i++) {dups[i] = 0;}

真正令人困惑的是,这个实验版本也崩溃了

int  dups[EMCMOT_MAX_AXIS] = {0};
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};
int  i;
for (i=0; i<EMCMOT_MAX_AXIS; i++) {dups[i] = 0;}

你可以在这里看到提交和周围的代码: https ://github.com/LinuxCNC/linuxcnc/commit/ef6f36a16c7789af258d34adf4840d965f4c0b10

4

1 回答 1

2

感谢Nate Eldredge设置 Compiler Explorer 和 0andriy%xmm0指针。这看起来确实像使用 register unsafe 内核代码的编译器的问题(或一些密切相关的问题)。在 Godbolt 网站上进行实验后,我发现-mno-sse2编译器标志与切换到 gcc-6 的效果类似,可以消除$xmm0该代码中对寄存器的使用。而且,当在实际应用程序编译中添加到编译器标志时,它似乎可以解决问题。可能需要做更多的工作才能找到正确解决方案的底部,但我们现在似乎有了一些好的指示。

于 2020-03-09T22:34:11.080 回答