Golang开发嵌入式软件可行性
TODO:
Golang适合快速开发,有GC不用自己管理内存,能优雅地和C/C++混编。但它的runtime似乎没实时性保证,因为垃圾回收机制可能会Stop The World,这里研究一下可行性。
https://github.com/rakyll/go-hardware
https://qiita.com/tetsu_koba/items/7435ef8d0c77844d751e
https://studygolang.com/articles/11904
https://blog.csdn.net/qq_15427331/article/details/54613635
https://www.zhihu.com/question/21615032/answers/created
https://blog.cloudflare.com/recycling-memory-buffers-in-go/
https://postd.cc/why-go-is-not-good/
http://blog.kmckk.com/archives/2712814.html
https://mender.io/blog/why-did-we-choose-golang-over-c
golang问题最大还是GC,即使不断优化,但还是用着老旧的算法,我们只能减少频繁创建对象,减轻GC的负担。
选用这种语言,很多时候是想利用他现成的库,如果那些库在设计的时候没这方面考量,那在嵌入式场合可能就不能直接拿来用(如果有go的嵌入式社区,可能又是另外一番景象了)
golang交叉编译测试¶
helloworld
$ cat helloworld.go
package main
import (
  "fmt"
  "time"
)
func main() {
    fmt.Println("hello world")
    time.Sleep(200 * 1000 * time.Millisecond)
}
$ env GOOS=linux GOARCH=arm go build -a -gcflags=all="-B" -ldflags="-w -s" helloworld.go
$ ls -lah helloworld
-rwxr-xr-x 1 r r 1.3M 12月 7日 10:16 helloworld
板上运行
# cat /proc/4261/status
Name:   helloworld
State:  S (sleeping)
Tgid:   4261
Ngid:   0
Pid:    4261
PPid:   4254
TracerPid:  0
Uid:    0   0   0   0
Gid:    0   0   0   0
FDSize: 256
Groups: 0
VmPeak:   794956 kB
VmSize:   794956 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:      1292 kB
VmRSS:      1292 kB
VmData:   793660 kB
VmStk:       136 kB
VmExe:       560 kB
VmLib:         0 kB
VmPTE:        12 kB
VmPMD:         0 kB
VmSwap:        0 kB
Threads:    4
simple-rtsp-server(https://github.com/aler9/rtsp-simple-server/tree/v0.20.2)
$ env GOOS=linux GOARCH=arm go build -ldflags="-extldflags=-static -s" -gcflags=all=-l -o rtsp-simple-server_arm
$ ls -lah rtsp-simple-server_arm
-rwxr-xr-x 1 r r 12M 12月 7日 11:16 rtsp-simple-server_arm
$ upx ./rtsp-simple-server_arm
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2022
UPX git-fdec47  Markus Oberhumer, Laszlo Molnar & John Reiser   Nov 16th 2022
        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
  11796480 ->   4100684   34.76%    linux/arm    rtsp-simple-server_arm
Packed 1 file.
WARNING: this is an unstable beta version - use for testing only! Really.
编译后12M,upx后4M。板上运行:
# cat /proc/4395/status
Name:   rtsp-simple-ser
State:  S (sleeping)
Tgid:   4395
Ngid:   0
Pid:    4395
PPid:   615
TracerPid:  0
Uid:    0   0   0   0
Gid:    0   0   0   0
FDSize: 256
Groups: 0
VmPeak:   806444 kB
VmSize:   806444 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     15780 kB
VmRSS:     15780 kB
VmData:   806176 kB
VmStk:       264 kB
VmExe:     15656 kB
VmLib:  4294951640 kB
VmPTE:        30 kB
VmPMD:         0 kB
VmSwap:        0 kB
Threads:    8
VmSize莫名地大,可能是runtime开了一大片heap区域。