Михаил Л. aka dx3mod
Released v0.1 https://discuss.ocaml.org/t/ann-serialport-new-serial-communication-library/17594
Написал давеча утилиту для загрузки прошивки на Ардуино борду используя свою же либу (как обычно), что потребовал некоторый ресерч и изучение других проектов. В итоге получился stk500.ml. смотрите комментарии
Вам бы был бы интересен разбор того как работает загрузка прошивки на Ардуино борду под капотом, изучение того как работает загрузчик, устройство протокола? Я в принципе и так сделаю, но насколько есть интерес у местной публики :<
Вам бы был бы интересен разбор того как работает загрузка прошивки на Ардуино борду под капотом, изучение того как работает загрузчик, устройство протокола? Я в принципе и так сделаю, но насколько есть интерес у местной публики :<
❤4
Most functional code in OCaml go brrr
https://github.com/dx3mod/frontmatter_extractor/blob/master/lib/frontmatter_extractor.ml
https://github.com/dx3mod/frontmatter_extractor/blob/master/lib/frontmatter_extractor.ml
Вот в OPAM залетела и ещё одна мая библиотечка, на этот раз это frontmatter_extractor. 🫂
Вообще он требуется мне в бирблоге, где он изначально и был реализован с использования Ангстрома, но использовать Ангстром для этих задач это из пушки по воробьям.
Поэтому в этой реализации исключительно захаркоженный цикл (всё как мы любим), ну и теперь он доступен всем желающим...
P.S.
https://discuss.ocaml.org/t/ann-frontmatter-extractor-0-1/17634
#ocaml #ann
Вообще он требуется мне в бирблоге, где он изначально и был реализован с использования Ангстрома, но использовать Ангстром для этих задач это из пушки по воробьям.
Поэтому в этой реализации исключительно захаркоженный цикл (всё как мы любим), ну и теперь он доступен всем желающим...
P.S.
https://discuss.ocaml.org/t/ann-frontmatter-extractor-0-1/17634
#ocaml #ann
❤1🔥1
Михаил Л. aka dx3mod
Написал давеча утилиту для загрузки прошивки на Ардуино борду используя свою же либу (как обычно), что потребовал некоторый ресерч и изучение других проектов. В итоге получился stk500.ml. смотрите комментарии Вам бы был бы интересен разбор того как работает…
Прошивка Arduino под капотом
Кто меня давно читает, может знать, что я периодически вспоминаю про такую штуку Arduino и вообще про программирование под МК AVR, ибо это мой бэкграунд со времен шараги, который я с интересом вспоминаю.
Так вот, всегда было интересно как работает механизм прошивки МК. Вообще для тех, кто не в теме, то обычно существует два способа прошить микруху. Первый это использовать программатор, внешнее физическое устройство для прошивки по хардверному интерфейсу ISP (in-system programming). Второй способ программный, это использовать всевозможные загрузчики (они же бутлоудоры).
Сегодня поговорим про последнее, так как в Ардуино оно как раз и используется. Бутлоудер это такая часть прошивки, которая нужна чтобы загрузить основную часть прошивки (т.е. пользовательскую программу). Плюсы в удобстве, не требуются сторонние инструменты. Минусы в занимаемом месте и скорости старта.
Технически это работает так, в более старших моделях 8-битных авэрок есть поддержка bootloader section, включается определенным фьюзом. Таким образом после включения МК исполнение инструкций начнется не с 0x0000, а со секции загрузчика.
В Ардуино используют загрузчик Optiboot, умещающийся вроде как в 512 байт и имеющий разные фичи, вроде программного загрузчика (на моделях без bootloader section), ну и другие. Может техническая реализация и не тривиальная, но сама логика, алгоритм работы вполне очевидный - после запуска МК загрузчик пытается считать команды по UART интерфейсу, что подключен к чипу-конвертору для работы с USB, таким образом получаем последовательную связь к ПК или иным устройством.
Общение с Optiboot происходит на подмножестве протокола stk500v1. Про него я тоже недавно упоминал, когда реализовывал библиотеку.
Если вы прогали UART, то в принципе понимаете как это будет выглядеть. Теперь получив команды (опустим это), надо исполнить их. Для этого потребуются специальные инструкции для программной записи данных - SPM (self programming).
И... на этом все?
Ну... да. Вся сложность заключается в аппаратно-зависимых штуках. Тут могу посоветовать только пойти читать исходники. Я думал, смогу даже видео на тему сделать, но в итоге я осознал топик и теперь не знаю, о чем рассказывать. Кек. А я этим постом, надеюсь, закрыл свой гештальт.
P.S.
https://github.com/m3y54m/simple-avr-bootloader
https://github.com/dx3mod/toy-atmega328p-bootloader
#embedded #arduino
Кто меня давно читает, может знать, что я периодически вспоминаю про такую штуку Arduino и вообще про программирование под МК AVR, ибо это мой бэкграунд со времен шараги, который я с интересом вспоминаю.
Так вот, всегда было интересно как работает механизм прошивки МК. Вообще для тех, кто не в теме, то обычно существует два способа прошить микруху. Первый это использовать программатор, внешнее физическое устройство для прошивки по хардверному интерфейсу ISP (in-system programming). Второй способ программный, это использовать всевозможные загрузчики (они же бутлоудоры).
Сегодня поговорим про последнее, так как в Ардуино оно как раз и используется. Бутлоудер это такая часть прошивки, которая нужна чтобы загрузить основную часть прошивки (т.е. пользовательскую программу). Плюсы в удобстве, не требуются сторонние инструменты. Минусы в занимаемом месте и скорости старта.
Технически это работает так, в более старших моделях 8-битных авэрок есть поддержка bootloader section, включается определенным фьюзом. Таким образом после включения МК исполнение инструкций начнется не с 0x0000, а со секции загрузчика.
В Ардуино используют загрузчик Optiboot, умещающийся вроде как в 512 байт и имеющий разные фичи, вроде программного загрузчика (на моделях без bootloader section), ну и другие. Может техническая реализация и не тривиальная, но сама логика, алгоритм работы вполне очевидный - после запуска МК загрузчик пытается считать команды по UART интерфейсу, что подключен к чипу-конвертору для работы с USB, таким образом получаем последовательную связь к ПК или иным устройством.
Общение с Optiboot происходит на подмножестве протокола stk500v1. Про него я тоже недавно упоминал, когда реализовывал библиотеку.
Если вы прогали UART, то в принципе понимаете как это будет выглядеть. Теперь получив команды (опустим это), надо исполнить их. Для этого потребуются специальные инструкции для программной записи данных - SPM (self programming).
И... на этом все?
Ну... да. Вся сложность заключается в аппаратно-зависимых штуках. Тут могу посоветовать только пойти читать исходники. Я думал, смогу даже видео на тему сделать, но в итоге я осознал топик и теперь не знаю, о чем рассказывать. Кек. А я этим постом, надеюсь, закрыл свой гештальт.
P.S.
https://github.com/m3y54m/simple-avr-bootloader
https://github.com/dx3mod/toy-atmega328p-bootloader
#embedded #arduino
🔥3❤2🤯2😱1🍾1💘1
Могу всех поздравить с наступившим 2026 годом — это уже второй год, который встречает этот канал и, надеюсь, не последний! 🥳
Как и в прошлом году, могу пожелать своим подписчикам здоровья и успеха в своих начинаниях. И могу только мечтать, чтобы в новом году кто-то заинтересуется или углубился в изучение и использования языка программирования OCaml, связывающий этот канал.
А я продолжу делать для вас новый контент...
С новым годом! ❤️
Как и в прошлом году, могу пожелать своим подписчикам здоровья и успеха в своих начинаниях. И могу только мечтать, чтобы в новом году кто-то заинтересуется или углубился в изучение и использования языка программирования OCaml, связывающий этот канал.
А я продолжу делать для вас новый контент...
С новым годом! ❤️
❤5
Типичный пример двойной аллокации, которую можно встретить — преобразования между bytes и string.
Это в принципе встречается и не только в Окамле, а везде где строки стали неизменяемыми и разделились на иммутабл и мутабл интерфейс как в случае Окамла.
В таком случае при образовании одного в другого требуется в memory safety, достигаемая в самом простом способе — копировании объекта, в том же Расте мы можем описать в рамках передачи владения без необходимости лишних аллокаций. Но чтобы в Окамле обойтись без этой лишней аллокации, нам надо в ручную пропедалировать этот moving посредством unsafe трансформации: использовать Bytes.unsafe_to_string, ибо мы уверены, что выделенная память не будет использована для изменения.
Этому, к слову, посвящена секция на странице про unsafe на ocamlportal.ru.
Это в принципе встречается и не только в Окамле, а везде где строки стали неизменяемыми и разделились на иммутабл и мутабл интерфейс как в случае Окамла.
В таком случае при образовании одного в другого требуется в memory safety, достигаемая в самом простом способе — копировании объекта, в том же Расте мы можем описать в рамках передачи владения без необходимости лишних аллокаций. Но чтобы в Окамле обойтись без этой лишней аллокации, нам надо в ручную пропедалировать этот moving посредством unsafe трансформации: использовать Bytes.unsafe_to_string, ибо мы уверены, что выделенная память не будет использована для изменения.
Этому, к слову, посвящена секция на странице про unsafe на ocamlportal.ru.
❤3
Михаил Л. aka dx3mod
Типичный пример двойной аллокации, которую можно встретить — преобразования между bytes и string. Это в принципе встречается и не только в Окамле, а везде где строки стали неизменяемыми и разделились на иммутабл и мутабл интерфейс как в случае Окамла. …
Intel_hex
К слову, очередной преждевременный анонс моей еще одной лучшей библиотеки для Окамла — на этот раз intel_hex для манипуляции над Intel HEX форматом, который особо распространен в эмбдеде системс.
На данный момент библиотека в принципе позволяет все что от нее требуется, а именно читать и писать IHEX объекты:
#ocaml #ann
К слову, очередной преждевременный анонс моей еще одной лучшей библиотеки для Окамла — на этот раз intel_hex для манипуляции над Intel HEX форматом, который особо распространен в эмбдеде системс.
На данный момент библиотека в принципе позволяет все что от нее требуется, а именно читать и писать IHEX объекты:
let ihex =
Intel_hex.Record.
[
Data { offset = 0; payload = "hello " };
Data { offset = 7; payload = "world" };
]
let () = ihex |> Intel_hex.to_string |> print_endline
In_channel.with_open_text "firmware.hex" Intel_hex.of_channel
#ocaml #ann
❤2
Михаил Л. aka dx3mod
Intel_hex К слову, очередной преждевременный анонс моей еще одной лучшей библиотеки для Окамла — на этот раз intel_hex для манипуляции над Intel HEX форматом, который особо распространен в эмбдеде системс. На данный момент библиотека в принципе позволяет…
Intel HEX разбор формата.pdf
113.9 KB
Состряпал вот такую презентацию.. Если будет интерес, то можно будет записать очередной крутой скринкаст🚬
Михаил Л. aka dx3mod
ООО LWT 6 ЖДЕМ-С
Опа, он вышел в релиз!
https://github.com/ocsigen/lwt/releases/tag/6.0.0
https://github.com/ocsigen/lwt/releases/tag/6.0.0
Михаил Л. aka dx3mod
Intel_hex К слову, очередной преждевременный анонс моей еще одной лучшей библиотеки для Окамла — на этот раз intel_hex для манипуляции над Intel HEX форматом, который особо распространен в эмбдеде системс. На данный момент библиотека в принципе позволяет…
К слову, оно (
intel_hex) теперь доступно для установки через OPAM... Там много, что не сделано, не знаю, когда найду время, желание и силы на все это :<OCaml tips. Работа с байтовыми данными на OCaml
https://ocamlportal.ru/recipes/working-with-bytes.html
Смотреть на ВК видео.
Смотреть на Ютабе.
#ocaml #video #ocamltips #ocamlportal
https://ocamlportal.ru/recipes/working-with-bytes.html
Смотреть на ВК видео.
Смотреть на Ютабе.
#ocaml #video #ocamltips #ocamlportal
❤2🔥1
Внес несколько изменений на ocamlportal.ru: добавил рецепт про ведения пакетa в OPAM, актулизировал инфу про lwt 6, добавил ссылки на коммуните на главную страницу
🔥3
К слову, от меня снова начали отписываться.... По моему это заговор против моей евангелисткой деятельности за Окамл в массы 👀
😭4😢1