Язык программирования Go был разработан в Google в 2007 году, и эволюционный путь этого языка с тех пор значителен. В настоящее время мы почти можем создавать любые приложения, используя Go – API, инструменты, игры, библиотеки и так далее. Так как насчет встраиваемой системы или сегодняшней концепции Интернета вещей (IoT), можем ли мы использовать Golang для такого рода приложений? Ответ – да, мы можем.

Мы можем использовать Go в качестве языка для создания приложения для встраиваемой системы, но для этого язык должен удовлетворять следующим условиям: запускаться на микроконтроллерах и соответствующих платах, например, Arduino Nano33 IoT, Adafruit Feather M0 и т. д., иметь очень малые размеры кода для встраивания в малые объемы памяти, иметь возможность использовать периферийные устройства (I2C, UART и т.п.) и другие функции, относящиеся к микроконтроллеру. И вот недавно появился инструмент TinyGo (https://github.com/tinygo-org/tinygo), который удовлетворяет всем этим условиям.
Для демонстрации некоторых возможностей языка давайте попробуем создавать наше первое приложение с помощью Go. Наиболее распространенной практикой создания или использования языка программирования впервые и во всех книгах по программированию является создание программы типа «Hello World». Программа «Hello world» считается самой простой программой, которую можно написать. Цель состоит в том, чтобы убедиться, что в дальнейшем вы можете написать любую программу. Итак, начнем.
Этот пример предполагает, что Go уже установлен и настроен. Создайте проект с именем «hello» в пространстве имён «examples» нашего рабочего пространства Go. Структура проекта будет такой:
[src]
|-- [examples]
|-- [hello]
|--- main.go
Наша первая программа «Hello World» на Go:
package main
import "fmt"
func main() {
fmt.Println("Hello tiny world")
}
Давайте объясним код построчно. Для начала «package main». Пакет (package) на языке программирования Go – это способ организации кода, который должен храниться вместе и использоваться как единое целое. Мы также сообщаем Go имя пакета, к которому принадлежит остальная часть нашего кода в этом файле. В этом случае имеем основной (main) пакет.
Далее идет строка func main().В языке Go ключевое слово func означает, что программа определяет функцию, которая состоит из одной или нескольких строк кода, которые будут выполняться одна за другой по порядку при вызове функции. Мы назвали нашу функцию «main», чтобы сообщить компилятору, что делать в первую очередь при запуске этой программы.
Затем мы видим строку «fmt.Println("Hello tiny world")». Мы используем функцию Println() для вывода сообщения, на языке Go оно будет напечатано или выведено на консоль. Но поскольку мы компилируем его для использования на микроконтроллере, которого у него нет, выходной сигнал будет отправлен на последовательный порт или UART микроконтроллера.
Теперь приступим к компиляции нашей первой программы на языке Go для микроконтроллеров. Компиляция программы «Hello World» аналогична компиляции другого кода Go, разница здесь в том, что мы компилируем код, используя инструмент tinygo, а не инструменты Go. Чтобы скомпилировать код, просто запустите такую команду:
$ tinygo build -o main.goКоманда build сообщает инструментам, что мы хотим скомпилировать код Go, флаг -o определяет выходной файл (если есть) и входной файл кода Go, который требуется скомпилировать. Если мы не определим выходной файл, он будет создан с тем же именем, что и код Go, в данном случае main.go. После успешного завершения процесса компиляции будет создан исполняемый файл.
$ ls
main main.go
Если мы хотим скомпилировать наш код под другим именем, мы можем просто запустить такую команду:
$ tinygo build -o hello main.goКоманда выше создаст файл hello, который является исполняемым файлом main.go. В приведенном выше коде мы используем только стандартную библиотеку «fmt» Go, так что это означает, что мы можем скомпилировать код и запустить под терминалом. Но если мы используем конкретный API в tinyGo, то мы не сможем скомпилировать с помощью приведенной выше команды, мы должны добавить указанную целевую плату в нашу команду компиляции. Создайте другой файл с именем «LED.go».
package main
import (
"machine"
"time"
)
// начинаем здесь с главной функции
func main() {
go blink(machine.LED1, 1000 * time.Millisecond)
go blink(machine.LED2, 750 * time.Millisecond)
}
// мигать светодиодом с заданной продолжительностью
func blink(led machine.Pin, delay time.Duration) {
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
for {
led.Low()
time.Sleep(delay)
led.High()
time.Sleep(delay)
}
}
Вышеприведенную программу можно скомпилировать и запустить без изменений на Arduino Uno, Adafruit ItsyBitsy M0 или любой из поддерживаемых плат, имеющих встроенный светодиод, просто установив правильную цель компилятора TinyGo. Мы также можем запустить код на площадке tinyGo, как показано ниже.

Компилятор tinyGo выдаст ошибку, если мы не установили указанную целевую плату при компиляции кода.

Таким образом, чтобы скомпилировать «LED.go», мы должны добавить целевую плату при выполнении команды сборки.

Но поскольку мы указали целевую плату для скомпилированной программы, мы больше не можем запускать программу под терминалом, поскольку исполняемый файл имеет заданную целевую архитектуру (например, Linux, Darwin, Windows, ARM и т. д.).

Чтобы запустить исполняемый файл, мы должны «прошить» его на плату микроконтроллера. Для запуска программы на микроконтроллере, вам нужно скомпилировать программу для платы такого типа в двоичный файл, а затем перенести этот двоичный файл на микроконтроллер. Перед запуском программы мы должны убедиться, что плата подключена к USB-порту вашего компьютера, и, если мы используем, например, Arduino Nano33, дважды нажмите кнопку «Сброс» на плате и, наконец, выполните следующую команду:
<span id="dd68" class="jf hs ee bd pg b bv ph pi s pj" data-selectable-paragraph="" style="box-sizing: inherit; font-weight: 400; display: block; font-style: normal; font-size: 16px; color: rgba(0, 0, 0, 0.84); letter-spacing: -0.022em; line-height: 1.18; font-family: Menlo, Monaco, "Courier New", Courier, monospace; margin-top: -0.09em; margin-bottom: -0.09em; white-space: pre-wrap;">tinygo flash -target arduino-nano33 ./examples/hello/LED.go</span>Команда tinygo flash сначала использует компилятор для создания временного двоичного файла, который является исполняемой версией этой программы, прежде чем она загружается в тот микроконтроллер, который указан в качестве цели. Микроконтроллер должен быть подключен к компьютеру для переноса скомпилированной программы на плату микроконтроллера. Учтите, что могут быть небольшие отличия при прошивке микроконтроллера определенного типа.
© digitrode.ru