mcmega
Member
Всем привет!
Столкнулся с проблемой...
Сделал так сказать WiFi программатор, который прошивает AVR микроконтроллеры. Загрузчик в AVR записан тоже свой. К загрузчику вопросов нет вообще, шьёт хоть из терминала, работает четко, написан на асме.
Работа загрузчика и процесс прошивки MCU
Параметры UART: 115200 / 8 / 1 / None
Управляющие символы:
0x3E - загрузчик запущен (">")
0x13 - необходимо приостановить передачу ("xOff")
0x11 - необходимо возобновить передачи ("xOn")
0x3C - загрузчик успешно завершил работу ("<")
0x21 - ошибка контрольной суммы, загрузчик ожидает прием HEX с самого начала ("!")
Передача НЕХ-файла:
1. Сбросить MCU (использована нога ESP через конденсатор)
2. Дождаться символа xOn, начать посимвольную передачу (буфера MCU - 128 Байт)
3. После заполнения буфера MCU выдаст символ xOff (необходимо приостановить передачу, идет запись Flash)
4. После записи 128 Байт во Flash MCU выдаст символ xOn (необходимо возобновить передачу)
5. После полной записи прошивки MCU выдаст символ "<"
В терминале это будет выглядеть примерно так:
> 0x11 0x13 ... 0x11 0x13 0x11 <
mcuHex - файл прошивки mcu.hex в FS
Теперь немного кода Arduino:
Собственно проблема в 25 строке кода.
Я не могу позволить тупить в цикле целых 3мс потому что работает асинхронный сервер и периодически слетает из-за этого. Почему не работает управление потоком передачи?
Ради эксперимента устанавливал значение 100 и вручную посылал символы управления потоком, все работало отлично, сбоев не было, но если убрать задержку вообще, все ломается и видно что прошивка передается, а на управляющие символы никакой реакции.
Я подозреваю, что Serial.available() дает данные с запаздыванием...
Как можно решить такую проблему?
Столкнулся с проблемой...
Сделал так сказать WiFi программатор, который прошивает AVR микроконтроллеры. Загрузчик в AVR записан тоже свой. К загрузчику вопросов нет вообще, шьёт хоть из терминала, работает четко, написан на асме.
Работа загрузчика и процесс прошивки MCU
Параметры UART: 115200 / 8 / 1 / None
Управляющие символы:
0x3E - загрузчик запущен (">")
0x13 - необходимо приостановить передачу ("xOff")
0x11 - необходимо возобновить передачи ("xOn")
0x3C - загрузчик успешно завершил работу ("<")
0x21 - ошибка контрольной суммы, загрузчик ожидает прием HEX с самого начала ("!")
Передача НЕХ-файла:
1. Сбросить MCU (использована нога ESP через конденсатор)
2. Дождаться символа xOn, начать посимвольную передачу (буфера MCU - 128 Байт)
3. После заполнения буфера MCU выдаст символ xOff (необходимо приостановить передачу, идет запись Flash)
4. После записи 128 Байт во Flash MCU выдаст символ xOn (необходимо возобновить передачу)
5. После полной записи прошивки MCU выдаст символ "<"
В терминале это будет выглядеть примерно так:
> 0x11 0x13 ... 0x11 0x13 0x11 <
mcuHex - файл прошивки mcu.hex в FS
Теперь немного кода Arduino:
Код:
bool uartFlowCtrl = false;
// Программирование MCU, работает в главном цикле loop
void mcuProg() {
if (mcuHex.available()) {
if (Serial.available()) {
inChar = (char)Serial.read();
switch (inChar) {
case '>':
case 0x11: // XON (шлем данные)
uartFlowCtrl = true;
break;
case 0x13: // XOFF (ждем)
uartFlowCtrl = false;
break;
case '!': // Ошибка контрольной суммы
mcuFlashTries++; // Увеличиваем счетчик попыток
uartInitMcuUpdate(); // Заново инициализируем режима прошивки MCU
break;
case '<': // Запись успешно завершена
uartFinishMcuUpdate(); // Удаляем mcu.hex, перезагружаем MCU
break;
}
}
if (uart_flow_control) {
Serial.write(mcuHex.read()); // Передаем очередной байт из файла прошивки в UART
delay(3); // Если убрать задержку, контроль потока не работает!!!
}
}
}
Я не могу позволить тупить в цикле целых 3мс потому что работает асинхронный сервер и периодически слетает из-за этого. Почему не работает управление потоком передачи?
Ради эксперимента устанавливал значение 100 и вручную посылал символы управления потоком, все работало отлично, сбоев не было, но если убрать задержку вообще, все ломается и видно что прошивка передается, а на управляющие символы никакой реакции.
Я подозреваю, что Serial.available() дает данные с запаздыванием...
Как можно решить такую проблему?
Последнее редактирование: