Просмотреть полную версию : Альтернатива для C/C++ на Trim5/SMH4, язык Go
Не встречал на форуме упоминание альтернативы компилируемым языкам C/C++ на Trim5/SMH4.
Хотя "золото" лежит под ногами в виде языка (платформы) Go (https://ru.wikipedia.org/wiki/Go).
Особенностью Go является хорошая кросс-платформенность из коробки.
Для того, что бы собрать "Привет, мир" под Windows, который будет работать на Trim5/SMH4:
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
нужно всего лишь запустить сборку в Windows в таком виде:
set GOOS=linux
set GOARCH=arm
set GOARM=7
go build hello
Для того, что бы собрать "Привет, мир" под Windows, который будет работать на Trim5/SMH4:
Вы это проверяли?
Не встречал на форуме упоминание альтернативы компилируемым языкам C/C++ на Trim5/SMH4.
А я писал, что есть варианты, даже NodeJS сам запускал из любопытства. Даже кое-что на нём работает, правда, безбожное пожирание оперативной памяти непростительно.
Что же насчёт гоу - я лично приветствую пошаговое руководство, где что скачать, что где прописать и как что запускать, с комментариями и тому подобными вещами. Тогда я на досуге и сам потестирую, что там по производительности и ресурсам и так далее.
Без мануала я до этого доберусь никогда, скорее всего, так как некогда разбираться, что куда, и без этого хватает интересных задач на выходные =)
Вы это проверяли?
Да, проверял, запускал на SMH4.
Без мануала я до этого доберусь никогда, скорее всего, так как некогда разбираться
Самая соль в том, что мануал минимальный.
Если для Windows:
1. Скачиваем дистрибутив со страницы https://golang.org/dl/, сейчас для Windows msi-дистрибутив занимает 91 Мб.
2. Устанавливаем, можно все по-умолчанию.
3. Создаем рабочий каталог:
mkdir "%USERPROFILE%\go\src\hello"
То, что создаем в %USERPROFILE%\go\src\ -- критично, нужно именно здесь.
4. Создаем в этом каталоге "привет мир", файл hello.go:
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
5. Если сейчас из рабочего каталога (%USERPROFILE%\go\src\hello) выполнить:
go build
то соберется версия для Windows, файл hello.exe, время сборки где-то в районе секунды, размер выходного файла 1,9 Мб, в импортах только winmm.dll, ws2_32.dll, kernel32.dll.
6. Если выполнить:
set GOOS=linux
set GOARCH=arm
set GOARM=7
go build
то соберется версия, которая запустится на девайсах, время сборки где-то в районе пяти секунд, размер выходного файла 1,6 Мб. Без debug-информации на выходе будет файл около 1,2 Мб.
Да, проверял, запускал на SMH4.
:thumbsup:
"Hello" вывелось на экран?
"Hello" вывелось на экран?
Hello вывелось, математика работает, сеть работает, многопоточность работает...
https://habrastorage.org/webt/f4/9h/nt/f49hntr3omk-2ee92qabjyma4ro.png
Это был результат работы примера:
package main
import (
"fmt"
"math"
"math/rand"
"net"
"time"
)
func main() {
fmt.Println("hello, world!")
for i := 0; i < 3; i++ {
r := rand.Float64()
fmt.Printf("cycle=%v r=%v sin(r)=%v\n", i, r, math.Sin(r))
}
sock, err := net.Listen("tcp", "localhost:7777")
if err != nil {
fmt.Println("Error accepting: ", err.Error())
return
}
go server(sock)
time.Sleep(time.Second)
c, err := net.Dial("tcp", "localhost:7777")
c.Write([]byte("hello, localhost!"))
c.Close()
time.Sleep(time.Second)
fmt.Println("exit")
}
func server(s net.Listener) {
defer s.Close()
c, err := s.Accept()
if err != nil {
return
}
b := make([]byte, 4)
for {
n, err := c.Read(b)
if err != nil {
break
}
fmt.Println("server:", string(b[:n]))
}
fmt.Println("server complete!")
}
Размер запускаемого файла (сборка с параметрами по-умолчанию): 2462 Кб
Кроме языка/платформы Go (https://ru.wikipedia.org/wiki/Go), так же неплохо с кросс-компиляцией обстоит дело и с языком/платформой Rust (https://ru.wikipedia.org/wiki/Rust_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE% D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0 %B2%D0%B0%D0%BD%D0%B8%D1%8F)).
Rust -- не такой попсовый и популярный, как Go, но он более "мощный", c использованием Markdown (https://ru.wikipedia.org/wiki/Markdown) для комментариев в коде, с лучшей продуманной системой сборки и пакетным менеджером Cargo (https://rurust.github.io/cargo-docs-ru/).
За большую функциональность приходится платить большей сложностью языка, одни только макросы на основе AST (Абстрактное синтаксическое дерево (https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D 0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0 %BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B 5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE)) чего стоят...
Для Windows, кратко инструкция по установке выглядит следующим образом.
1. Что бы проекты собирались для Windows, необходимо проинсталлировать средства сборки C/C++, установить "Build Tools for Visual Studio 2017" со страницы https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2017, при этом отметить инструменты C++ при установке.
2. Что бы проекты собирались для ARMv7, необходимо проинсталлировать средства сборки C/C++, установить gcc-linaro-7.2.1-2017.11-i686-mingw32_arm-linux-gnueabihf.tar.xz со страницы https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/
3. Загружаем дистрибутив Rust: https://www.rust-lang.org/ru-RU/install.html и устанавливаем его.
4. Устанавливаем библиотеки исполнения для ARMv7 со статической линковкой, выполняем команду:
rustup target install armv7-unknown-linux-musleabihf
5. Создаем файл конфигурации сборщика, файл %USERPROFILE%\.cargo\config с содержимым:
[target.armv7-unknown-linux-musleabihf]
linker = "....../bin/arm-linux-gnueabihf-gcc.exe"
где .... заменяем на каталог, в который установили gcc-linaro в пункте 2.
6. Создаем шаблон проекта "hello" командой:
cargo new hello --bin
7. Собираем версию под Windows командой:
cargo build
Результат будет в файле target/debug/hello.exe, размер ~140 Кб, слинкован с VCRUNTIMExxx.dll.
8. Собираем версию под ARM командой:
cargo build --target=armv7-unknown-linux-musleabihf
Результат будет в файле target/armv7-unknown-linux-musleabihf/debug/hello (размер ~1.9 Мб), время сборки ~1 сек.
Одна только проблема - это доступ к шмемам, а значит и лоджику из всех этих структур. Выдернуть сторонней библиотекой шмем из структуры возможно, но это будет не просто... Я как-то пробовал, мне быстро надоело =)
Одна только проблема - это доступ к шмемам, а значит и лоджику из всех этих структур. Выдернуть сторонней библиотекой шмем из структуры возможно, но это будет не просто... Я как-то пробовал, мне быстро надоело =)
Я не думаю, что доступ к шмемам из Go или Rust будет какой-то особой проблемой, что тут есть какие-то принципиальные ограничения.
С другой стороны, использовать шмемы, как мне кажется, нужно в крайнем случае, когда по какой-то причине TCP и Modbus не подходят. Потому что при взаимодействии через Modbus/TCP заметно упрощается разработка и отладка приложения: это можно делать на другой платформе, подключаться по сети, а непосредственно на устройстве использовать уже готовый отлаженный результат.
Лучше Python, может быть только Си (для тех кто умеет конечно и готов тратить время). Почему питон, потому что большое кол-во библиотек с САМЫМ богатым функционалом. Думаю что все другие языки нервно курят в сторонке, не тратьте зря время.
Запускал, работает хорошо. Даже графику рисует. Жаль что только 2 Gb флэш памяти, все плотно получается если ставить много всего. Лучше 4 Gb. Одна боль - PyQt не получилось пока, ему иксы нужны похоже. Наверное можно просто Qt5? Напишите кто реально пробовал ...
Я не думаю, что доступ к шмемам из Go или Rust будет какой-то особой проблемой, что тут есть какие-то принципиальные ограничения.
С другой стороны, использовать шмемы, как мне кажется, нужно в крайнем случае, когда по какой-то причине TCP и Modbus не подходят. Потому что при взаимодействии через Modbus/TCP заметно упрощается разработка и отладка приложения: это можно делать на другой платформе, подключаться по сети, а непосредственно на устройстве использовать уже готовый отлаженный результат.
Доступ к шмемам будет особой проблемой, поскольку юзеру придётся взять и распарсить карту шмемов из лоджика. О да, для меня тоже было новостью узнать, что шмемы не создаются каждый отдельно, как это обычно бывает. Они создаются в одном файле, и там адресация по указателям. Короче, можно взять библиотеку и перевести её на go, но это будет та ещё заморочка. Модбас и локалхост, в этом плане, выигрывают. Однако, в этом случае есть проблемы с производительностью и это нужно учитывать. модбас работает медленнее чем локалхост. Насколько - затрудняюсь ответить. Критических тестов не проводил.
Одна только проблема - это доступ к шмемам, а значит и лоджику из всех этих структур. Выдернуть сторонней библиотекой шмем из структуры возможно, но это будет не просто... Я как-то пробовал, мне быстро надоело =)
Руки дошли поробовать шмем. Как и предполагалось, никаких проблем не возникло (в Go), ничего сложного нет, все входит и выходит...
Руки дошли поробовать шмем. Как и предполагалось, никаких проблем не возникло (в Go), ничего сложного нет, все входит и выходит...
Если не затруднит - дайте, пожалуйста, пример, как работаете со шмемами из go.
А я все выложил вчера на GitHub, в рамках проекта-шлюза MQTT для SMH4/Trim5.
Вот ссылка на конкретный файл:
https://github.com/gelsrc/shm2mqtt/blob/master/shm_linux.go
vBulletin v3.8.3 (Russian), Copyright ©2000-2024, Jelsoft Enterprises Ltd.