2016-01-04 2 views
0

Проблема с загрузчиком моей встроенной платы. Иногда после перезагрузки он не загружается.RedBoot останавливает загрузку на любом входе

Проблема устранена до RedBoot, которая ждет (0.1s) для «ctrl-C», чтобы отменить загрузку и войти в интерактивный режим, где вы можете его редактировать. Проблема в том, что, хотя случайный «ctrl-C» символ на несвязанной последовательной консоли крайне маловероятен, любой случайный символ иногда вызывается «из воздуха», а затем RedBoot останавливается в строке «== Выполнение сценария загрузки в 0.100 секунд - введите^C, чтобы прервать ", пока один из них не нажимает, удаляет оскорбительный символ (с обратным пространством) или вводит RedBoot с помощью ctrl-C.

Есть ли способ отключить эту «функцию», не отключая возможности полностью выполнить приглашение «RedBoot»?

+2

Звучит скорее как проблема с оборудованием - входные контакты действительно не должны оставаться плавающими, так что «данные» могут волшебным образом появляться из воздуха. Я бы дважды проверить правильность настройки pull-up/pull-down. – Notlikethat

+0

Здесь, кажется, есть два вопроса: где вы получаете персонажей и почему * что-либо * работает, а не только ctrl-C. Последнее звучит как несоответствие между сообщением команды и фактическим кодом ... –

+0

@ChrisStratton: символы «на« свободном подвесе »RS232« просто происходят », в настоящее время сотни развернутых устройств, и проблема возникает только как 2 -3 раза в последние годы. Устройство довольно хорошо экранировано от EMI, но вы просто не можете избежать всего этого. Теперь, почему RedBoot работает так, это выходит за рамки моей ... –

ответ

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, чтобы посмотреть, что происходит.