vak: (Default)
Новый гаджет в моей коллекции: карманный компьютер ProCalc. Внутри процессор RP2040, 8 мегабайт дополнительной памяти, дисплей, клавиатура, карточка SD, спикеры, аудио выход, аккумуляторы 18650. Размером примерно с калькулятор TI 84. Предлагается за $75 с сайта производителя в Гонконге.



Девайс идёт с предустановленным бейсиком.



Исходники на Гитхабе: clockworkpi/PicoCalc

Имеется несколько альтернативных прошивок на выбор:
  • PicoMite - интерпретатор Бейсика на основе MMBasic
  • FUZIX - юниксоподобная операционка
  • NES emulator - эмулятор классической игровой приставки
  • uLisp - интерпретатор языка Лисп
  • MP3Player - аудиоплеер на базе YAHAL
Прикольно будет портонуть сюда FP/M. Можно было бы даже и симулятор PDP-11 с юниксом 2.11 BSD. А ещё в текстовые игрушки неплохо играть.
vak: (Знайка)
В операционку FP/M добавлена поддержка микроконтроллера RP2350. Пять новых платок в списке.

reddit.com/r/FP_M/comments/1inn7bi/release_02_now_with_rp2350/

RP2350 похож на RP2040. Тоже два процессорных ядра и такая же периферия. С четырьмя отличиями.
  • Была система команд armv6-m, стала armv8-m. Тоже 32-битный ARM, но Thumb1 заменился на Thumb2. Команды стали разнообразнее, есть улучшения.
  • В два раза больше памяти: было 256 кбайт, стало 512 кбайт RAM.
  • На 20% быстрее: было 125 МГц, стало 150 МГц.
  • Появилась система команд RISC-V. При старте процессора происходит выбор между arm32 и riscv32. То есть при компиляции вашей программы вы можете указать параметр PICO_PLATFORM=rp2350-riscv. Получите бинарник с системой команд RISC-V, прошьёте в девайс и процессор переключится автоматически. Этот режим я пока в FP/M не делал. 
vak: (Default)
Помните модемы, бибиэски, скачивание файлов, протокол Zmodem? Нынешнее поколение только в кино видело. А по тем временам был вполне практичный способ распространения софта.

Я подумал: почему бы не приспособить старые проверенные методы для встроенного программирования? Взял и перенес утилиту rz из проекта mbzm в FP/M. Теперь можно легко и просто загружать файлы с локального компьютера в файловую систему Flash на плате RP2040. Давайте покажу.

Для передачи файлов понадобится эмулятор терминала minicom и утилита sz. Чтобы установить sz, используйте "sudo apt install lrzsz" в Ubuntu и "brew install lrzsz" в MacOS.

Чтобы передать файл на устройство FP/M, сначала подключитесь к консоли через USB с помощью minicom. Вы должны увидеть приглашение:
flash:/ >
Теперь нажмите Meta-S — должно появиться меню Upload. Это может быть Alt-S или Esc-S, в зависимости от конфигурации вашего minicom. Меню Upload предлагает список протоколов:



Выберите zmodem и нажмите Enter. Появится список файлов в вашем домашнем каталоге.



Выберите файл для засылки и нажмите пробел. Затем нажмите Enter. Начнется передача данных.



После завершения загрузки вы увидите соответствующее сообщение и окажетесь снова в командной строке FP/M.

vak: (Default)
Завёл группу на реддите для FP/M: reddit.com/r/FP_M/
Присоединяйтесь, господа! 

Вот, к примеру, пост по максимальное количество программ, которые можно запустить на RP2040 друг из друга: reddit.com/r/FP_M/comments/1i8r50r/about_memory_and_nested_shells/
vak: (Default)
Прошу любить и жаловать: операционка FP/M для крошечных процессоров. Проект наконец дозрел до минимально законченного состояния. Есть файловая система во флеш-памяти и на SD-карточке, командная строка с возможностью редактирования, и главное - динамический загрузчик. То есть можно выполнять бинарники *.exe из файловой системы во флеше. Вот пример.



Исходники лежат на Гитхабе: github.com/fp-m/fpm-embedded

В разделе Release v0.1 можно скачать готовый бинарник fpm-rp2040-2mb.uf2 и сразу прошить его в плату с чипом RP2040 - если у вас имеется такая. После чего подключиться к консольному порту через USB (на скорости 115200) и играться с системой. Подробности смотрите на странице Getting Started.

Пока всё это работает только на процессоре RP2040. Список поддерживаемых плат смотрите на странице Supported Platforms.

Всё это доступно по лицензии MIT. Собрать из исходных текстов можно по инструкции: Build From Sources.

Проект открытый: присоединяйтесь, господа. Это только начало. Идею можно доразвить в самые разные интересные стороны.
vak: (Default)
Глянем размер простейшей программы для FP/M. Вот исходный код упомянутой hello.exe.
#include <fpm/api.h>

int main()
{
fpm_puts("Hello, World!\r\n");
}
Построим бинарник.
$ arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -fPIC -O -Ifpm-base/include -c hello.c
$ arm-fpm-ld -shared -fPIC -e main hello.o -o hello.exe
$ arm-none-eabi-size hello.exe
text data bss dec hex filename
194 144 0 338 152 hello.exe
Вот результат дизассемблирования посредством arm-none-eabi-objdump.
hello.exe:     file format elf32-littlearm

Disassembly of section .plt:

0000011c <.plt>:
11c: b407 push {r0, r1, r2}
11e: 4803 ldr r0, [pc, #12] @ (12c <.plt+0x10>)
120: 6800 ldr r0, [r0, #0]
122: 4903 ldr r1, [pc, #12] @ (130 <.plt+0x14>)
124: 5840 ldr r0, [r0, r1]
126: 9002 str r0, [sp, #8]
128: bd03 pop {r0, r0, pc}
12a: 46c0 nop
12c: 20000010 .word 0x20000010
130: 00000000 .word 0

Disassembly of section .text:

00000134 <main>:
134: b510 push {r4, lr}
136: 4803 ldr r0, [pc, #12] @ (144 <main+0x10>)
138: 4478 add r0, pc
13a: f7ff ffef bl 11c <.plt>
13e: 2000 movs r0, #0
140: bd10 pop {r4, pc}
142: 46c0 nop
144: 0000000c .word 0xc

Disassembly of section .rodata:

00000148 <.rodata>:
148: 6c6c6548
14c: 57202c6f
150: 646c726f
154: 000a0d21
Размер главной функции main() составляет 16 байт комманд и 4 байта константы. Присоединим сюда также 16 байт текста сообщения в секции .rodata. В сумме 36 байт.

Заметьте: системный вызов fpm_puts() выглядит как простой вызов функции с параметрами.

Для каждого такого системного вызова линкер создаёт в секции .plt код размером 24 байта. Его задача - вытащить из глобальной таблицы смещений (GOT, или Global Offset Table) адрес процедуры, реализующей вызов, и туда перейти. Таблицу GOT формирует системный вызов rpm_execv() на стеке при запуске программы на выполнение. И заносит её адрес в таблицу векторов по адресу 20000010. Это для архитектуры ARMv6-M.

То есть весь hello.exe это 36+24 = 60 байт кода программы. Всё остальное в бинарном файле - накладные расходы на формат ELF.

Код здесь позиционно-независимый. На каком адресе файл окажется в файловой Flash-памяти, там и будет выполняться. Лишь бы лежал одним фрагментом.
vak: (Аристипп)
У меня сегодня огромная радость. Заработала ключевая фича в проекте, который я с переменным успехом двигал последние два года. В операционке FP/M успешно выполняются ELF-бинарники из файловой системы.

Я когда-то упоминал проект RP/M, за это время он переименовался в FP/M. Расшифровывается как Flash Program for Microcontrollers. Должно получиться похоже на CP/M или MS-DOS, но вместо флопика будет Flash-память.

Вот как это нынче выглядит. Подсоединяемся через USB-порт к виртуальной консоли через minicom и пробуем команду 'hello'.



Программа выполняется из файла /bin/hello.exe в файловой системе flash:. Это вместо диска C:. Вместо флопика A: работает файловая система sd: на SD-карточке. Сама программа выглядит так:
#include <fpm/api.h>

int main()
{
fpm_puts("Hello, World!\r\n");
}
Теперь начну готовить первый релиз. Займёт пару недель, я думаю. Нужно сварганить утилитку, создающую исходный образ файловой системы в Flash-памяти.