Старая нить, но я столкнулся с той же проблемой. В моем случае это связано с тем, что последовательный порт консоли 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, чтобы посмотреть, что происходит.
Звучит скорее как проблема с оборудованием - входные контакты действительно не должны оставаться плавающими, так что «данные» могут волшебным образом появляться из воздуха. Я бы дважды проверить правильность настройки pull-up/pull-down. – Notlikethat
Здесь, кажется, есть два вопроса: где вы получаете персонажей и почему * что-либо * работает, а не только ctrl-C. Последнее звучит как несоответствие между сообщением команды и фактическим кодом ... –
@ChrisStratton: символы «на« свободном подвесе »RS232« просто происходят », в настоящее время сотни развернутых устройств, и проблема возникает только как 2 -3 раза в последние годы. Устройство довольно хорошо экранировано от EMI, но вы просто не можете избежать всего этого. Теперь, почему RedBoot работает так, это выходит за рамки моей ... –