当前位置:   article > 正文

Go 在STM32MP157C 上跑起来!_golang stm32

golang stm32

现代嵌入式系统中免不了需要网络功能,因此,开发诸如web server,websocket ,json 等网络程序是必不可少的。虽然C/C++是开发嵌入式程序主要的程序设计语言,不过C/C++ 开发现代网络应用程序显得有点老态龙钟,力不从心。被Go ,java,python 甩几条大街。2019年,我们花费了整整一年的时间,将嵌入式网络软件的开发工具从C++ 迁移到了Go,软件开发的效率大幅度提升,我们的做法是在目标计算机(比如全志H6,瑞芯微RK3399 上安装Go 编译器。直接在目标机上开发程序。对于STM32MP157 而言,其硬件资源相对有限,我们采取了交叉编译的方式开发应用程序。C/C++ 当然没有任何问题。厂商提供了完整的交叉编译工具链。Go 怎么办? 我们确实回不去了,爱上Go 了。周末看了网络上一些文章介绍,Go 的交叉编译非常简单,只要设置一些环境变量,原来的X86 ubuntu 上的Go 可以直接编译出Arm 的目标代码。于是,迫不急待地测试了一下。

测试程序

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. fmt.Println("Hello,Arm!")
  7. return
  8. }

编译

(base) yao@yao-dc:~/yao2020/go2020$ GOOS=linux GOARCH=arm  GOARM=7 go build -o helloarm test.go  

下载

  1. (base) yao@yao-dc:~/yao2020/go2020$ scp helloarm root@192.168.31.194://home/root/workspace
  2. helloarm 100% 1835KB 1.8MB/s 00:00
  3. (base) yao@yao-dc:~/yao2020/go2020$ ssh root@192.168.31.194
  4. myir
  5. root@myir:~# cd workspace
  6. root@myir:~/workspace# ./helloarm
  7. Hello,Arm!

居然成功了,好神奇。整整一个周末都在努力地交叉编译C++的网络库restbed,ASIO。。。巴拉巴拉。。 没有一个成功了。没想到非常顺利地编译了Go,顺便说一句,在Win wsl ubuntu 上,我并没有试成功。而在X86 ubuntu 电脑上非常顺利。

 兴奋之余,先发出本博文。下面要做两件事情:

编译一个STM32MP157C 上运行的完整的web 应用程序

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. )
  6. func main(){
  7. fmt.Println("Simply webserver\n")
  8. fs := http.FileServer(http.Dir("./www"))
  9. http.Handle("/", fs)
  10. http.ListenAndServe(":3210", nil)
  11. }

在STM32MP157C上,开发一个Go 程序库,让C++调用

这个问题貌似容易,却花费了我许多时间。如果不了解,请参考我的博文:

ubuntu 下搭建STM32MP157的交叉编译环境

GO 程序:

  1. package main
  2. import "C"
  3. import (
  4. "fmt"
  5. "net/http"
  6. )
  7. //export webserver
  8. func webserver(){
  9. fmt.Println("Simply webserver\n")
  10. fs := http.FileServer(http.Dir("./www"))
  11. http.Handle("/", fs)
  12. http.ListenAndServe(":3210", nil)
  13. }
  14. func main(){
  15. }

1 .首先,要切换到STM32MP157 SDK  的环境, 

source /home/yao/develop/stm32mp157c/Develop-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

2 . 交叉编译Go 为C的库。

设置编译模式(buildmode=c-archive 为静态库,c-shared 为共享库

3 设置Go环境变量

      CGO_ENABLED=1

      GOOS=linux  

     GOARCH=arm

     GOARM=7  

CGO_ENABLED=1 GOOS=linux  GOARCH=arm GOARM=7    go build -o libwebserver.a -buildmode=c-archive webserver.go

这是发现netdb.h 找不到的现象:于是,设置CGO_LDFLAGS 和CGO_CPPFLAGS

  1. export CGO_CPPFLAGS="-I /home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/include -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -fPIC"
  2. export CGO_LDFLAGS="-L/home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/lib -L/home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/lib -L /home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/lib/arm-ostl-linux-gnueabi/9.3.0"

你可以使用go env 查看相关的设备

  1. yao@minipc:~/develop/go/webServer$ go env
  2. GO111MODULE=""
  3. GOARCH="amd64"
  4. GOBIN=""
  5. GOCACHE="/home/yao/.cache/go-build"
  6. GOENV="/home/yao/.config/go/env"
  7. GOEXE=""
  8. GOFLAGS=""
  9. GOHOSTARCH="amd64"
  10. GOHOSTOS="linux"
  11. GOINSECURE=""
  12. GONOPROXY=""
  13. GONOSUMDB=""
  14. GOOS="linux"
  15. GOPATH="/home/yao/go_dev"
  16. GOPRIVATE=""
  17. GOPROXY="https://proxy.golang.org,direct"
  18. GOROOT="/usr/local/go"
  19. GOSUMDB="sum.golang.org"
  20. GOTMPDIR=""
  21. GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
  22. GCCGO="gccgo"
  23. AR="arm-ostl-linux-gnueabi-ar"
  24. CC="arm-ostl-linux-gnueabi-gcc"
  25. CXX="arm-ostl-linux-gnueabi-g++"
  26. CGO_ENABLED="1"
  27. GOMOD=""
  28. CGO_CFLAGS="-O2 -pipe -g -feliminate-unused-debug-types"
  29. CGO_CPPFLAGS="-I /home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/include -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -fPIC"
  30. CGO_CXXFLAGS="-O2 -pipe -g -feliminate-unused-debug-types"
  31. CGO_FFLAGS="-g -O2"
  32. CGO_LDFLAGS="-L/home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/lib -L/home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/lib -L/home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/lib/arm-ostl-linux-gnueabi/9.3.0"
  33. PKG_CONFIG="pkg-config"
  34. GOGCCFLAGS="-mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi -fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build134359271=/tmp/go-build -gno-record-gcc-switches"

    在这里搞了很长的时间,老时发现“Scrt1.o“ 无法找到的问题。后来无意中发现 在命令行去掉CC=arm-ostl-linux-gnueabi-gcc 反而好了,其实通过个go env 看到CC 已经设了。到底毛病在那里我也不清楚。

 C 程序

  1. #include <libwebserver.h>
  2. void main(){
  3. webserver();
  4. }
$CC -I. -lpthread callweb.c libwebserver.a -o callweb

最后,小结命令行

  1. source /home/yao/develop/stm32mp157c/Develop-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
  2. export CGO_CPPFLAGS="-I /home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/include -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 -fPIC"
  3. export CGO_LDFLAGS="-L/home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/lib -L/home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/lib -L /home/yao/develop/stm32mp157c/Develop-Package/SDK/sysroots/cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi/usr/lib/arm-ostl-linux-gnueabi/9.3.0"
  4. CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 go build -o libwebserver.a -buildmode=c-archive webserver.go
  5. $CC -I. -lpthread callweb.c libwebserver.a -o callweb

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/433255
推荐阅读
相关标签
  

闽ICP备14008679号