PDA

Просмотреть полную версию : Альтернатива для C/C++ на Trim5/SMH4, язык Go


Gel
12.02.2018, 16:51
Не встречал на форуме упоминание альтернативы компилируемым языкам 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

Arsie
12.02.2018, 17:01
Для того, что бы собрать "Привет, мир" под Windows, который будет работать на Trim5/SMH4:


Вы это проверяли?

Gromov
12.02.2018, 17:06
Не встречал на форуме упоминание альтернативы компилируемым языкам C/C++ на Trim5/SMH4.


А я писал, что есть варианты, даже NodeJS сам запускал из любопытства. Даже кое-что на нём работает, правда, безбожное пожирание оперативной памяти непростительно.

Что же насчёт гоу - я лично приветствую пошаговое руководство, где что скачать, что где прописать и как что запускать, с комментариями и тому подобными вещами. Тогда я на досуге и сам потестирую, что там по производительности и ресурсам и так далее.

Без мануала я до этого доберусь никогда, скорее всего, так как некогда разбираться, что куда, и без этого хватает интересных задач на выходные =)

Gel
12.02.2018, 17:43
Вы это проверяли?
Да, проверял, запускал на 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 Мб.

Arsie
12.02.2018, 18:16
Да, проверял, запускал на SMH4.


:thumbsup:

"Hello" вывелось на экран?

Gel
12.02.2018, 20:10
"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 Кб

Gel
15.02.2018, 18:13
Кроме языка/платформы 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 сек.

Gromov
15.02.2018, 18:16
Одна только проблема - это доступ к шмемам, а значит и лоджику из всех этих структур. Выдернуть сторонней библиотекой шмем из структуры возможно, но это будет не просто... Я как-то пробовал, мне быстро надоело =)

Gel
15.02.2018, 18:26
Одна только проблема - это доступ к шмемам, а значит и лоджику из всех этих структур. Выдернуть сторонней библиотекой шмем из структуры возможно, но это будет не просто... Я как-то пробовал, мне быстро надоело =)
Я не думаю, что доступ к шмемам из Go или Rust будет какой-то особой проблемой, что тут есть какие-то принципиальные ограничения.

С другой стороны, использовать шмемы, как мне кажется, нужно в крайнем случае, когда по какой-то причине TCP и Modbus не подходят. Потому что при взаимодействии через Modbus/TCP заметно упрощается разработка и отладка приложения: это можно делать на другой платформе, подключаться по сети, а непосредственно на устройстве использовать уже готовый отлаженный результат.

edesign
26.02.2018, 09:46
Лучше Python, может быть только Си (для тех кто умеет конечно и готов тратить время). Почему питон, потому что большое кол-во библиотек с САМЫМ богатым функционалом. Думаю что все другие языки нервно курят в сторонке, не тратьте зря время.
Запускал, работает хорошо. Даже графику рисует. Жаль что только 2 Gb флэш памяти, все плотно получается если ставить много всего. Лучше 4 Gb. Одна боль - PyQt не получилось пока, ему иксы нужны похоже. Наверное можно просто Qt5? Напишите кто реально пробовал ...

Gromov
26.02.2018, 10:35
Я не думаю, что доступ к шмемам из Go или Rust будет какой-то особой проблемой, что тут есть какие-то принципиальные ограничения.

С другой стороны, использовать шмемы, как мне кажется, нужно в крайнем случае, когда по какой-то причине TCP и Modbus не подходят. Потому что при взаимодействии через Modbus/TCP заметно упрощается разработка и отладка приложения: это можно делать на другой платформе, подключаться по сети, а непосредственно на устройстве использовать уже готовый отлаженный результат.

Доступ к шмемам будет особой проблемой, поскольку юзеру придётся взять и распарсить карту шмемов из лоджика. О да, для меня тоже было новостью узнать, что шмемы не создаются каждый отдельно, как это обычно бывает. Они создаются в одном файле, и там адресация по указателям. Короче, можно взять библиотеку и перевести её на go, но это будет та ещё заморочка. Модбас и локалхост, в этом плане, выигрывают. Однако, в этом случае есть проблемы с производительностью и это нужно учитывать. модбас работает медленнее чем локалхост. Насколько - затрудняюсь ответить. Критических тестов не проводил.

Gel
11.09.2018, 19:22
Одна только проблема - это доступ к шмемам, а значит и лоджику из всех этих структур. Выдернуть сторонней библиотекой шмем из структуры возможно, но это будет не просто... Я как-то пробовал, мне быстро надоело =)
Руки дошли поробовать шмем. Как и предполагалось, никаких проблем не возникло (в Go), ничего сложного нет, все входит и выходит...

Gromov
12.09.2018, 09:39
Руки дошли поробовать шмем. Как и предполагалось, никаких проблем не возникло (в Go), ничего сложного нет, все входит и выходит...

Если не затруднит - дайте, пожалуйста, пример, как работаете со шмемами из go.

Gel
12.09.2018, 09:52
А я все выложил вчера на GitHub, в рамках проекта-шлюза MQTT для SMH4/Trim5.

Вот ссылка на конкретный файл:

https://github.com/gelsrc/shm2mqtt/blob/master/shm_linux.go