Перейти к содержимому
Doob

Упаковщик прошивок

Рекомендуемые сообщения

Иногда надо уместить программу на EEPROM, но она никак не хочет туда влезать.

Есть решение - карта данных любого уровня, может упаковывать и распаковывать программу, а код распаковки не занимает много места.

Благодаря алгоритму Deflate теперь есть где развернуться. Я наконец-то смог запрессовать свою копалку, даже без оптимизации кода, и еще свободное место осталось.

 

 

Требования:

  • Data-card любого уровня.
  • Интернет карта для установки программы.

 

 

Установка:

pastebin run KThbTuZr

или

wget https://raw.githubusercontent.com/zgyr/bpacker/master/installer.lua && installer && rm installer.lua

 

 

Использование:

bpacker [опции] <имя файла>

Опции:
  -q   тихий режим, не показываются статусные сообщения
  -m   минификация кода перед упаковкой (работает не всегда)
  -l   использовать алгоритм lzss (Data card не требуется)
  -h   справка

 

Программа сожмет указанный файл и запишет на EEPROM.

Код должен быть адаптирован для работы без OpenOS.

 

 

TODO:

  • Сделать упаковщик немного умнее. (сейчас код распаковки захардкожен, занимает лишние байты и может не работать в очень редких случаях)
  • Улучшить минификатор. (он лучший среди Lua-минификаторов, но иногда ломает код)

 

 

Ссылки:

Github программы.

Github минификатора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ого, стоило мне подумать про возможность упаковки программы и распаковки перед запуском, как тут-же нашелся человек, который это сделал.

Возможно так получится уместить мой кодовый замок, надо попробовать.

 

------

Да, с 15,2кб программу ужало до 3,4кб без использования минификации

Изменено пользователем Bs0Dd

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сделал тесты потребления памяти.

 

Тест1: ожидание высвобождения памяти и вывод результата.

ZH8sACj.png

 

Тест2: вывод потребляемой памяти без сборки мусора, в качестве нагрузки - несжимаемый комментарий.

XL3YnUv.png

 

Тест3: тоже, но со сборкой мусора.

kQrvD6V.png

 

Для высвобождения памяти можно использовать такой код

for i = 0, 9 do
  computer.pullSignal(2)
end

Но тут нужны сигналы, для микроконтроллеров такое не всегда подходит. Если программа работает с сигналами, то память высвободится в процессе работы.

 

Для пробного вывода потребления памяти можно делать так.

error('Memory used: ' .. computer.totalMemory()-computer.freeMemory(), 0)

 

Тесты показывают, что можно даже на одной памяти первого уровня (192 KiB) спокойно запускать очень сложные программы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добавил алгоритм LZSS. Используется код распаковщика от @BrightYC

Жмет намного хуже, но зато не требует карту данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Увы, инсталлер не проверяет наличие файлов на машине и при обновлении можно получить ахтунг в виде ругани и не обновившихся файлов

yAXIqmT.png

 

Поэтому лучше все же добавить проверки, дабы избежать неприятностей

fs = require('filesystem')

if not fs.exists('/usr/bin') then fs.makeDirectory('/usr/bin') end
if not fs.exists('/usr/lib') then fs.makeDirectory('/usr/lib') end
if fs.exists('/usr/lib/lzss.lua') then fs.remove('/usr/lib/lzss.lua') end
os.execute('wget https://raw.githubusercontent.com/BrightYC/Other/master/lzss.lua /usr/lib/lzss.lua')
if fs.exists('/usr/bin/bpacker.lua') then fs.remove('/usr/bin/bpacker.lua') end
os.execute('wget https://raw.githubusercontent.com/zgyr/bpacker/master/bpacker.lua /usr/bin/bpacker.lua')
if fs.exists('/usr/bin/minify.lua') then fs.remove('/usr/bin/minify.lua') end
os.execute('wget https://raw.githubusercontent.com/stravant/lua-minify/master/minify.lua /usr/bin/minify.lua')

 

Ну и я бы все же дописал, что метод с LZSS требует перевести процессор в режим Lua 5.3, иначе, ахтунг с подгрузкой библиотеки

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ок, сделано. Я думал, что давно уже процессоры по дефолту работают на 5.3.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...