разработка и программирование электронных устройств

Chromebook для программирования на C/C++

Мое знакомство с этим устройством началось с его приобретения. Я соблазнился очень хорошей ценой за такую вычислительную мощность и приобрел модель HP Chromebook x360 14 где-то за 300 баксов, что было ровно вдвое дешевле аналогичных по характеристикам моделей ноутбуков.

Вот основные характеристики ноутбука-трансформера HP Chromebook x360 14:

  • Предустановленная операционная система Google Chrome OS
  • Процессор Intel Core i3 восьмого поколения
  • Объем DDR4 памяти 8 Гбайт
  • Объем SSD накопителя 64 Гбайт
  • IPS экран 14” с сенсорной панелью
  • Алюминиевый корпус хорошего качества
  • Встроенный WIFI/Bluetooth модуль
  • Порты:
    • USB-C 2шт
    • USB 3.1
    • microSD считыватель
    • 3.5” Audio Jack

Изначально планировалось удалить Chrome OS и установить вместо него мой любимый Fedora Linux. Способ как это сделать я узнал из видеоролика на Youtube.
Но для начала мне было интересно “пощупать” Chrome OS, узнать больше о возможностях этой операционной системы. Сформулировав основные требований к ноутбуку мне стало ясно, что Chromebook им вполне себе соответствует.

После первого знакомства Chrome OS мне показалась аналогом Android , только для ноутбуков. Эта операционная система также базируется на ядре Linux. Основной акцент разработчики из Google сделали на безопасности. Внутри каждого Chromebook установлена криптографическая микросхема, которая шифрует данные и не позволяет так просто переустановить систему (это даже не UEFI). Активно используется технология виртуализации , все приложения запускаются в собственных виртуальных контейнерах.

Концепция Chromebook очень похожа на концепцию нетбука. Основная работа сосредоточена в браузере Chrome. Пользователь может работать с облачными сервисами, сохраняя результаты своей работы в удаленном хранилище . Но это еще не весь список возможностей Chromebook.
Chrome OS предоставляет магазин приложений Play Market, хорошо знакомый каждому пользователю смартфона на основе ОС Android. А с недавнего времени в Chrome OS стала доступна среда выполнения Linux, запускаемая в отдельном виртуальном контейнере.

В данной публикации я опишу настройку chromebook для разработки программного обеспечения на языках С/С++.

Для начала установим редактор кода или полноценную IDE.
Если вы привыкли работать в редакторе vim , то ничего дополнительно делать не нужно , vim уже установлен .
Для начала в меню поиска программ наберите terminal и если он не был установлен ранее , то как раз сейчас он установится. Запустите командную строку и введите там vim. Должен открыться редактор vim (если вдруг вы не знаете как из него выйти, то нажмите ‘ESC’ ‘:’ ‘q!’ ). Для установки полноценной IDE необходимо проделать все те же шаги, что и при установке аналогичной программы в Linux. В моей версии Chrome OS используется Debian Linux 9, поэтому возможно установить любую IDE, доступную для Debian Linux 9.

На просторах интернета я находил информацию о том, что редактор Sublime Text 3 на Chromebook установить нельзя. Это неправда, сделать это достаточно просто.
Необходимо выполнить те же действия, что и при установке под Debian 9:


username@penguin:~$ sudo apt update
username@penguin:~$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
username@penguin:~$ curl -fsSL https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
username@penguin:~$ sudo add-apt-repository "deb https://download.sublimetext.com/ apt/stable/"
username@penguin:~$ sudo apt update
username@penguin:~$ sudo apt install sublime-text

Теперь в списке установленных приложений вы сможете увидеть пиктограмму Sublime Text.

Для создания нового окна терминала нужно сделать правый клик мышкой на пиктограмме терминала и выбрать из контекстного меню New Window.
Я не нашел способа создавать новые закладки в окне терминала Linux, поэтому установил мультиплексор терминала tmux :


username@penguin:~$ sudo apt install tmux -y

Разочарование меня постигло, когда я попробовал подключить к своему Chromebook адаптер USB-UART и не увидел ни одного нового устройства в /dev .
Не знаю с чем точно это связано, с концепцией безопасности или разработчики Google еще не добавили в ядро поддержку драйверов. Установить драйвер виртуального COM порта для микросхем серии CP210x у меня также не получилось. С этим недоразумением я справился благодаря использованию платы Raspberry Pi 3 и установленного по ssh соединения.

Поскольку мой текущий проект использовал стек протоколов TCP/IP , то я также решил установить сниффер сетевого трафика с графическим интерфейсом Wireshark для отладки своих программ:


username@penguin:~$ sudo apt install wireshark -y

Достаточно странное сочетание помешанной на безопасности операционной системы Chrome OS и сниффера сетевого трафика Wireshark. Но это сочетание вполне рабочее.

Итак, после установки текстового редактора или полноценной IDE необходимо установить инструменты командной строки, такие как компилятор и дополнительные утилиты:


username@penguin:~$ sudo apt install cmake git build-essential valgrind -y
username@penguin:~$ cmake --version
cmake version 3.7.2

username@penguin:~$ make --version
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

username@penguin:~$ g++ --version
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Из недостатков сразу можно отметить не самые свежие версии пакетов, входящие в дистрибутив Debian Linux 9.

Toolchain для кросс-компиляции программ под ARM микроконтроллеры устанавливается одной командой :


username@penguin:~$ sudo apt install gcc-arm-none-eabi -y
username@penguin:~$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (15:5.4.1+svn241155-1) 5.4.1 20160919
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Возможно также установить ARDUINO-IDE на Chromebook с тем лишь ограничением, что невозможно будет загрузить прошивку (скетч) внутрь платы, поскольку не будет доступа к последовательным портам. Для этих целей можно использовать плату Raspberry Pi с установленным SSH сервером и необходимыми для прошивки устройств утилитами.

Это один из самых неудобных моментов при Embedded программировании на Chromebook.
Поэтому на этом моменте я остановлюсь более подробно.
Загружаем и записываем на micro SD карту памяти образ Raspbian Linux. Все действия я буду выполнять на своем Chromebook.
Скачиваем образ Raspbian Buster Lite по ссылке Raspbian Buster Lite

Для записи скачанного образа на карту памяти можно воспользоваться командой dd :


username@penguin:~$ sudo dd if=./2019-09-26-raspbian-buster-lite.img of=/media/removable bs=1024
2195456+0 records in
2195456+0 records out
2248146944 bytes (2.2 GB, 2.1 GiB) copied, 27.4871 s, 81.8 MB/s

Вставляем подготовленную micro SD карту памяти в плату Raspberry Pi 3.
Скорее всего SSH сервер уже установлен на плату Raspberry Pi 3. Если же нет, то необходимо подключить к плате монитор и клавиатуру.
Узнать IP адрес можно с помощью команды ifconfig :


pi@raspberrypi:~ $ ifconfig
eth0: flags=4163 mtu 1500
inet 192.168.0.110 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::5919:e91:1889:20de prefixlen 64 scopeid 0x20 ether b8:27:eb:5f:95:43 txqueuelen 1000 (Ethernet)
RX packets 998 bytes 58309 (56.9 KiB)
RX errors 0 dropped 2 overruns 0 frame 0
TX packets 125 bytes 14928 (14.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

wlan0: flags=4163 mtu 1500
inet 192.168.0.111 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::4f85:e896:6e7b:4cbd prefixlen 64 scopeid 0x20 ether b8:27:eb:0a:c0:16 txqueuelen 1000 (Ethernet)
RX packets 125 bytes 14237 (13.9 KiB)
RX errors 0 dropped 2 overruns 0 frame 0
TX packets 35 bytes 5344 (5.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Подсоединяемся к плате Raspberry Pi 3 через ssh интерфейс:


username@penguin:~$ ssh pi@192.168.0.110

The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established.
ECDSA key fingerprint is SHA256:ZBJEiRZzlzYIbbjPn/YUKlKF2AlPLv9Ndt0bKxIFUiU.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.0.110' (ECDSA) to the list of known hosts.
pi@192.168.0.110's password:
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Jan 29 18:31:12 2020

SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.

pi@raspberrypi:~ $

Теперь у нас есть прямой доступ к консоли Raspberry Pi 3.
Сначала установим в USB порт платы преобразователь USB-UART.
Для логирования работы любого Embedded устройства достаточно подключить TX вывод UART интерфейса устройства к преобразователю USB-UART, а сам преобразователь в USB порт Raspberry Pi 3 :


pi@raspberrypi:~ $ ls /dev/ttyUSB*
/dev/ttyUSB0

Можно обойтись и без преобразователя USB-UART, если задействовать встроенный в Raspberry Pi интерфейс UART :


pi@raspberrypi:~ $ ls /dev/ttyS*
/dev/ttyS0

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


pi@raspberrypi:~ $ sudo apt install minicom -y

Потом запускаем :


pi@raspberrypi:~ $ minicom -D /dev/ttyUSB0 -b 115200

Welcome to minicom 2.7

OPTIONS: I18n
Compiled on Apr 22 2017, 09:14:19.
Port /dev/ttyUSB0, 18:17:02

Press CTRL-A Z for help on special keys

Настройку Raspberry Pi 3 в качестве GDB-сервера для программирования IOT модулей ESP32 я описал в одной из своих предыдущих публикаций Отладка программ для ESP32 через JTAG адаптер на Raspberry Pi 3.

Таким же образом можно настроить процесс отладки программ для ARM микроконтроллеров с помощью GDB сервера OpenOCD и платы Raspberry Pi 3.
Может возникнуть вполне логичный вопрос “А зачем же так заморачиваться, используя два отдельных устройства : хромбук и Raspberry Pi?”. На это есть как минимум три причины:

  • Стоимость хромбука вместе с Raspberry Pi значительно дешевле стоимости ноутбука.
  • В случае проблем с электропитанием сгорит только плата Raspberry Pi, хромбук остается полностью гальванически развязанным от всех подключаемых устройств.
  • В Raspberry Pi присутствует тот же набор периферийных модулей (UART, SPI, I2C, GPIO), что и в большинстве Embedded устройств. Это позволяет использовать данные интерфейсы для загрузки прошивки и отладки кода.

И напоследок рассмотрим разработку программ под ARM mbed-os. Разработка в онлайн-IDE от ARM вполне соответствует концепции хромбука.

С другой стороны вы также можете установить инструментарий командной строки mbed-cli:


username@penguin:~$ sudo apt install python2.7 python-pip git mercurial -y
username@penguin:~$ sudo pip install mbed-cli
username@penguin:~$ sudo pip install -U mbed-cli
username@penguin:~$ sudo dpkg --add-architecture i386
username@penguin:~$ sudo apt update
username@penguin:~$ sudo apt install libc6:i386 libncurses5:i386 libstdc++6:i386 -y
username@penguin:~$ mbed config -G GCC_ARM_PATH /usr/bin/
[mbed] /usr/bin/ now set as global GCC_ARM_PATH
username@penguin:~$ mbed --version
1.10.2

Создать новый проект можно прямо из командной строки:


username@penguin:~$ mbed new mbed-os-program
username@penguin:~$ cd mbed-os-program
username@penguin:~/mbed-os-program$ mbed ls -a

Можно добавить один из самых простых примеров в файл main.cpp:


username@penguin:~/mbed-os-program$ mbed compile -t GCC_ARM -m NUCLEO_F429ZI --source mbed-os --source ./ --build BUILD/mbed-os-program

Существует как минимум два способа загрузить прошивку внутрь платы NUCLEO-F429ZI :

  • Непосредственно скопировать бинарный файл (одна из функций в последних версиях отладчика ST-Link)
  • Загрузить прошивку через внутрисхемный отладчик OpenOCD. В этом случае также есть возможность прогнать вашу программу пошагово в отладочном режиме прямо внутри устройства.

Расмотрим первый способ. Достаточно просто скопировать бинарный файл в плату NUCLEO-F429ZI:


username@penguin:~/mbed-os-program$ sudo scp BUILD/mbed-os-program/mbed-os.bin pi@192.168.0.110:/mnt/nucleo
pi@192.168.0.110's password:
scp: /mnt/nucleo/mbed-os.bin: Permission denied

К сожалению у меня нет прав доступа для копирования в /mnt/nucleo.
Кроме того вам необходимо предварительно примонтировать диск NUCLEO-F429ZI к файловой системе Raspberry Pi 3:


pi@raspberrypi:~ $ sudo mkdir /mnt/nucleo
pi@raspberrypi:~ $ sudo mount /dev/sda /mnt/nucleo
pi@raspberrypi:~ $ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 2M 0 disk /mnt/nucleo
mmcblk0 179:0 0 7.5G 0 disk
├─mmcblk0p1 179:1 0 43.8M 0 part /boot
└─mmcblk0p2 179:2 0 7.4G 0 part /

Поэтому мы сначала скопируем бинарный файл в другое место, например в домашнюю директорию /home/pi:


username@penguin:~/mbed-os-program$ sudo scp BUILD/mbed-os-program/mbed-os.bin pi@192.168.0.110:/home/pi
pi@192.168.0.110's password:
mbed-os.bin

Затем скопируем файл непосредственно в устройство:

pi@raspberrypi:~ $ sudo cp mbed-os.bin /mnt/nucleo/

После этого последнего шага светодиод на плате NUCLEO-F429ZI должен заморгать с частотой 2 Гц.

Теперь рассмотрим второй способ. Для него нам нужно предварительно установить на Raspberry Pi 3 утилиту openocd:


pi@raspberrypi:~ $ sudo apt install openocd -y

Теперь запускаем GDB сервер , к которому затем можно подключиться для загрузки прошивки или внутрисхемной отладки:


pi@raspberrypi:~ $ openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg
Open On-Chip Debugger v0.10.0-esp32-20190313-2-g4a4e0076 (2019-04-10-14:40)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
WARNING: interface/stlink-v2.cfg is deprecated, please switch to interface/stlink.cfg
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 2000 kHz
adapter_nsrst_delay: 100
none separate
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 2000 kHz
Info : STLINK V2J28M18 (API v2) VID:PID 0483:374B
Info : Target voltage: 3.248645
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections

Как я упоминал в своей статье «Отладка программ для ESP32 через JTAG адаптер на Raspberry Pi 3», для того , чтобы можно было подсоединиться к GDB серверу Openocd с другого компьютера в сети, необходимо добавить опцию bindto 0.0.0.0 в файл interface/stlink-v2.cfg . Запускаем openocd еще раз и подсоединяемся по telnet:


username@penguin:~/mbed-os-program$ telnet 192.168.0.110 4444
Trying 192.168.0.110...
Connected to 192.168.0.110.
Escape character is '^]'.
Open On-Chip Debugger
>

Загружаем прошивку, сохраненную ранее в /home/pi:


> load_image mbed-os.bin 0x0 bin
75588 bytes written at address 0x00000000
downloaded 75588 bytes in 1.634515s (45.161 KiB/s)
>

Еще хотелось написать несколько слов об полезных программах из Play Market, однако в контексте программмирования на C/C++ ничего полезного я не нашел. Однако если установить видеоплеер KODI (который также можно установить как Debian Linux приложение) и настроить список каналов для просмотра IPTV, то в перерывах между программированием на C/C++ можно также просматривать свои любимые телепрограммы. Я также установил себе приложение из Play Market для прослушивания интернет-радио.

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

Viewed 3894 times by 982 viewers

Leave a Reply

You must be logged in to post a comment.