Михаил Л. aka dx3mod
44 subscribers
85 photos
11 videos
10 files
238 links
my tiny tech blog
Download Telegram
Вот и думайте
🤔2
Оказывается можно локально определять эксепшены....
# let exception Stop_loop in
while 1 > 0 do
raise Stop_loop
done;;

См. https://ocaml.org/manual/5.4/patterns.html#pattern

#ocaml
🤯2👏1
Я бы сказал, что ни говна ни ложки, но в эмбеддеде так много говна, что даже ложки из него.

Херня, нужна херня для херни, херня для херни лежала на форуме 2003 года, форум сдох пару месяцев назад, есть новая херня для херни на Гите, она не запускается, разраб херни для херни умер ушел в банкинг 6 лет назад, 3 ищуи (вкл закрытые), кто то решал твою проблему 23 года назад, решение не отписал, спасибо, вдупляешь в код херни для херни, оказывается она не для твоей херни, пишешь свою херню для херни, она не работает, читаешь даташит херни, первый раз прочитал криво и херня для херни не нужна.

Кратко про эмбедед
😁3
Думайте
😁3
Михаил Л. aka dx3mod
Released v0.1 https://discuss.ocaml.org/t/ann-serialport-new-serial-communication-library/17594
Написал давеча утилиту для загрузки прошивки на Ардуино борду используя свою же либу (как обычно), что потребовал некоторый ресерч и изучение других проектов. В итоге получился stk500.ml. смотрите комментарии

Вам бы был бы интересен разбор того как работает загрузка прошивки на Ардуино борду под капотом, изучение того как работает загрузчик, устройство протокола? Я в принципе и так сделаю, но насколько есть интерес у местной публики :<
4
Вот в OPAM залетела и ещё одна мая библиотечка, на этот раз это frontmatter_extractor. 🫂

Вообще он требуется мне в бирблоге, где он изначально и был реализован с использования Ангстрома, но использовать Ангстром для этих задач это из пушки по воробьям.

Поэтому в этой реализации исключительно захаркоженный цикл (всё как мы любим), ну и теперь он доступен всем желающим...

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
🔥32🤯2😱1🍾1💘1
Немного про AI
👍4
Могу всех поздравить с наступившим 2026 годом — это уже второй год, который встречает этот канал и, надеюсь, не последний! 🥳

Как и в прошлом году, могу пожелать своим подписчикам здоровья и успеха в своих начинаниях. И могу только мечтать, чтобы в новом году кто-то заинтересуется или углубился в изучение и использования языка программирования OCaml, связывающий этот канал.

А я продолжу делать для вас новый контент...

С новым годом! ❤️
5
Типичный пример двойной аллокации, которую можно встретить — преобразования между bytes и string.

Это в принципе встречается и не только в Окамле, а везде где строки стали неизменяемыми и разделились на иммутабл и мутабл интерфейс как в случае Окамла.

В таком случае при образовании одного в другого требуется в memory safety, достигаемая в самом простом способе — копировании объекта, в том же Расте мы можем описать в рамках передачи владения без необходимости лишних аллокаций. Но чтобы в Окамле обойтись без этой лишней аллокации, нам надо в ручную пропедалировать этот moving посредством unsafe трансформации: использовать Bytes.unsafe_to_string, ибо мы уверены, что выделенная память не будет использована для изменения.

Этому, к слову, посвящена секция на странице про unsafe на ocamlportal.ru.
3
Михаил Л. aka dx3mod
Типичный пример двойной аллокации, которую можно встретить — преобразования между bytes и string. Это в принципе встречается и не только в Окамле, а везде где строки стали неизменяемыми и разделились на иммутабл и мутабл интерфейс как в случае Окамла. …
Intel_hex

К слову, очередной преждевременный анонс моей еще одной лучшей библиотеки для Окамла — на этот раз 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
🚬
😭3
ООО

LWT 6

ЖДЕМ-С
🔥2
Ух! OCaml Platforms все хорошеет и хорошеет 🐫
🔥3