我的嵌入式主板的bootloader存在问题。有时它在重启后无法启动。
问题已被追溯到RedBoot,等待(0.1s)“ctrl-C”中止启动并进入交互模式,您可以在其中进行编辑。问题是,虽然在未连接的串行控制台上随机出现的“ctrl-C”字符极不可能,但任何随机字符有时会被“空中”引起,然后RedBoot会在提示符处停止“ ==在0.100秒内执行启动脚本 - 输入^ C中止“直到任何一个按Enter键,删除有问题的字符(带退格键)或使用ctrl-C进入RedBoot。
是否有某种方法可以在不禁用“RedBoot>”功能的情况下禁用此“功能”完全提示?
答案 0 :(得分:2)
旧线程,但我刚遇到完全相同的问题。在我的情况下,这是因为Redboot控制台串行端口与另一个同时启动的嵌入式Windows系统相关联。在这种情况下,串行端口上的短暂噪声始终得到保证,并且Redboot总是会像原始问题所描述的那样卡住!
我的修复很简单 - 在main.c
中,函数cyg_start()
:
diff --git a/packages/redboot/current/src/main.c b/packages/redboot/current/src/main.c
index 0531dcc..9b1ce97 100644
--- a/packages/redboot/current/src/main.c
+++ b/packages/redboot/current/src/main.c
@@ -356,26 +356,11 @@ cyg_start(void)
# endif
if (script) {
// Give the guy a chance to abort any boot script
- char *hold_script = script;
int script_timeout_ms = script_timeout * CYGNUM_REDBOOT_BOOT_SCRIPT_TIMEOUT_RESOLUTION;
diag_printf("== Executing boot script in %d.%03d seconds - enter ^C to abort\n",
script_timeout_ms/1000, script_timeout_ms%1000);
- script = NULL;
- res = _GETS_CTRLC; // Treat 0 timeout as ^C
- while (script_timeout_ms >= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT) {
- res = _rb_gets(line, sizeof(line), CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT);
- if (res >= _GETS_OK) {
- diag_printf("== Executing boot script in %d.%03d seconds - enter ^C to abort\n",
- script_timeout_ms/1000, script_timeout_ms%1000);
- continue; // Ignore anything but ^C
- }
- if (res != _GETS_TIMEOUT) break;
- script_timeout_ms -= CYGNUM_REDBOOT_CLI_IDLE_TIMEOUT;
- }
- if (res == _GETS_CTRLC) {
+ if (_rb_break(script_timeout_ms)) {
script = NULL; // Disable script
- } else {
- script = hold_script; // Re-enable script
}
}
#endif
如果需要,CTRL-C仍可用于中止引导脚本,但任何其他字符(包括由噪声创建的虚假字符)将立即解释为超时。在我的场景中,这是完美的,因为您希望能够键入CTRL-C的唯一时间是手动重置Redboot板并在嵌入式Windows系统上打开串行控制台以观察发生的情况。