WSL: программирование AVR в виртуальной машине Linux
Добавил(а) microsin
Здесь мы рассмотрим программирование микроконтроллеров AVR на примере популярной платки Arduino Nano. И будем это делать в виртуальной машине Linux, работающей в среде WSL [1]. Вы можете спросить: зачем такие заморочки, когда под Windows есть куча готовых удобных инструментов для программирования AVR и любых микроконтроллеров? Да, конечно, это так, но вероятно рано или поздно все-таки придется переехать на Linux, и поэтому есть некий смысл выделить время на изучение нового инструментария.
Установка WSL хорошо описана как на сайте Microsoft, так и на других ресурсах сети [1]. Однако для доступа из виртуальной машины WSL к последовательным портам tty есть некоторая тонкость.
Проблема в том, что WSL существует в двух версиях: WSL1 и WSL2, и команда wsl --install по умолчанию устанавливает WSL2. И эта версия WSL2 по какой-то непонятной причине не позволяет работать с последовательными портами. А как известно, платки Arduino программируются через последовательный порт. Поэтому необходимо установить WSL1 вместо WSL2.
[Установка WSL1]
Запустите PowerShell с правами администратора. Выполните следующие команды:
>wsl--set-default-version1
Этой командой мы задаем по умолчанию устанавливать WSL1. Далее установите виртуальную машину Ubuntu следующей командой:
>wsl--install-dUbuntu-20.04
Проверьте, что Ubuntu установлена именно под версией WSL1:
>wsl--list--verboseNAMESTATEVERSION
*Ubuntu-20.04Running1
Примечание: если у вас уже по какой-то причине установлена виртуальная машина под управлением WSL2, то её нужно сначала удалить командами wsl --shutdown и wsl --unregister имядистрибутива, например wsl --unregister Ubuntu-20.04.
>wsl --list --verbose
NAME STATE VERSION
* Ubuntu Running 2
Ubuntu-20.04 Stopped 1
>wsl --unregister Ubuntu
>wsl --list --verbose
NAME STATE VERSION
* Ubuntu-20.04 Running 1
[Подготовка среды разработки в виртуальной машине Linux]
Далее все шаги выполняются в командной строке установленной виртуальной машины Ubuntu, если не указано что-то иное (на одном из шагов нам придется перезапустить виртуальную машину командами PowerShell).
1. Обновите пакеты для нашей виртуальной Ubuntu:
$ sudo apt-get update
$ sudo apt-get dist-upgrade
Команда sudo apt-get dist-upgrade займет довольно много времени, и будут периодически выдаваться сообщения о необходимости перезагрузки системы. Поэтому после завершения этой команды надо перезагрузить wsl из командной строки PowerShell (с правами администратора).
Для этого сначала выйдите из виртуальной машины:
$ logout
После этого в командной строке PowerShell выполните команды:
>wsl--shutdown
>wsl
Эти команды перезапустят виртуальную машину.
2. Установите cu, это программа для подключения к последовательным портам. Её можно использовать как монитор последовательного порта.
$ sudo apt install cu
3. Теперь нужно установить необходимые для программирования утилиты [2].
4. Подключите платку Arduino Nano к компьютеру через USB. Предположим, Windows обнаружила её как COM4:
Тогда этот COM-порт будет виден в WSL как устройство /dev/ttyS4.
Примечание: в WSL2 по какой-то причине нумерация несколько другая, это устройство будет видно как /dev/tty4. И, повторюсь, на момент написания статьи (август 2023 года) WSL2 не позволяла получить доступ к этим последовательным портам. Возможно когда-нибудь Microsoft это исправит.
[Как программировать]
$ mkdir myprojects
$ sudo mount -t drvfs M:/work myprojects/
Примечание: команда sudo mount -t drvfs M:/work myprojects/ необязательна. Она выполнена для того, чтобы не загромождать системный диск C:. Этой командой произведено монтирование папки m:\work на другом диске, где у меня размещены проекты, с которыми я работаю.
$ mkdir helloworld
$ cd helloworld
$ nano main.c
Введите в редакторе nano текст программы, мигающей светодиодом, из статьи [2].
Примечание: WSL отлично работает с буфером обмена. Поэтому можно просто скопировать текст из статьи [2], и затем вставить его в nano путем нажатия Ctrl+V.
Важный момент для запуска make: в строках после целей "%.o:", "clean:", "help:", "flash:" и "disasm": символы пробелов нужно заменить на табуляцию. Ниже в тексте символы табуляции показаны символом стрелочки →.
Теперь у нас в рабочем каталоге ~/myprojects/helloworld два файла: Makefile и main.c.
$ ls
Makefile main.c
Команда make help выведет подсказку о том, как компилировать:
$ makehelp
Usage: make create main.hex
make help show help
make clean remove redundant data
make disasm disasm main
make flash upload main.hex into flash
Current values:
TARGET=main
DEVICE=atmega328p
CLOCK=16000000UL
LFUSE=
HFUSE=
[Прошивка микроконтроллера]
Если ваша платка обнаружилась как COM4, то к ней надо будет обращаться через имя /dev/ttyS4. Для начала надо разрешить права доступа к устройству /dev/ttyS4: