Для защиты от бутлупов и зависов сразу после старта системы (а то не один раз из-за этого приходилось NodeMCU перепрошивать) я одно время использовал паузу в 5 секунд в init.lua перед стартом остального кода. Этого времени хватает, чтобы, если возникли проблемы, успеть грохнуть init.lua через терминал.
Сейчас сделал лучше. Система теперь после старта считывает файлик, инкрементирует число в нём и записывает. Если результат становится более трёх — вываливаемся, ничего не делая. Иначе ставим таймер, по которому через несколько секунд файл удаляем, а систему тем временем грузим дальше.
Получается, что при обычной загрузке задержки нет вообще, а для аварийного сброса нужно нажать трижды reset за короткий период времени.
local count = 0 local pin = 4 - D1-mini LED gpio.mode(pin, gpio.OUTPUT) gpio.write(pin, gpio.LOW) if file.open("fail-counter.txt") then count = tonumber(file.read()) if count == nil then count = 0 end file.close() end if count >= 2 then print("Emergency stop") file.remove("fail-counter.txt") return end print("Fail proof check: ", count) file.remove("fail-counter.txt") file.open("fail-counter.txt","w+") file.writeline(count+1) file.close(); if not tmr.create():alarm(3000, tmr.ALARM_SINGLE, function() file.remove("fail-counter.txt") print("Fail proof check passed") end) then print("Can't start timer") return end gpio.write(pin, gpio.HIGH) dofile('main.lua')
- Если всё нормально, то
init.lua
грузит
main.lua
, в котором уже и хранится основной инициализирующий код.
- Если трижды быстро (в течении трёх секунд после запуска) нажать reset, то ничего не делаем. Кстати, надо доделать, поставить опционально загрузку
ide.lua
и тогда можно будет контроллер и к компу не цеплять — трижды reset и грузится удалённый редактор.
- Важно не нажимать очень-очень быстро, а то дело даже не дойдёт до чтения кода. Скрипт на время готовность нажатия reset зажигает светодиод. Период нажатия — от ~0.5 до 3 секунд после старта.
… чтобы понять рекурсию, нужно сперва понять рекурсию …
![4](/_bors/images/browsers/opera.gif)