让我们通过tinyGo变得渺小 - Go语言中文社区

让我们通过tinyGo变得渺小


Go于2007年在Google设计,该语言的发展是巨大的。 如今,我们几乎可以使用Go从API,工具,游戏,库等创建任何类型的应用程序。 那么,对于嵌入式系统或当今热门的物联网,我们可以将Golang用于此类应用程序吗? 答案是肯定的,我们可以。

我们从未期望Go是一种嵌入式语言,因此它遇到了严重的问题……

— Rob Pike, GopherCon 2014开幕主题演讲

我们可以使用Go作为嵌入式语言来为嵌入式系统创建应用程序,嵌入式应用程序与非嵌入式应用程序之间的区别是:

  • 在嵌入式板上运行,例如Arduino Nano33 IoTAdafruit Feather M0等。
  • 具有非常小的二进制大小。 因此,不要为不使用的东西付费。
  • 使用外围设备(I2C,UART,模拟量I / O)
  • 一些功能特定于微控制器板

有一个工具TinyGohttps://github.com/tinygo-org/tinygo ),本文将使用该工具将Go代码编译并闪存到微控制器中。

让我们开始使用Go创建第一个应用程序。 在所有编程书籍中,首次创建或使用编程语言的最常见做法是创建“ Hello World”程序。

Hello world ”程序被认为是可以编写的最简单的程序。 目的是验证您完全可以编写任何类型的程序。 让我们开始吧...

在本文中,我们假设:

Go已安装和配置,如果未安装,则可以按照https://golang.org/doc/install中的说明在操作系统上安装和配置Go.TinyGo已安装(如果未安装),则可以按照https中的说明进行操作: //tinygo.org/getting-started/关于如何在操作系统上安装tinygo。

在Go工作区的“示例”命名空间中创建一个项目名称“ hello”。 项目结构将如下所示

[src]
  |-- [examples]
        |-- [hello]
             |--- main.go

Go中的第一个“ Hello World”程序。

package main

import "fmt"

func main() {
     fmt.Println( "Hello tiny world" )
}

让我们逐行解释代码,

package main

Go编程语言中的程序包是组织代码的方式,旨在保持在一起并用作单个单元。 我们还告诉Go该文件中其余代码所属的包的名称。 在这种情况下,为“主”包装。

func main()

在Go语言中,关键字func表示程序正在定义一个函数,该函数由一行或多行代码组成,这些代码行将在调用该函数时按顺序依次执行。 我们将函数命名为“ main”,以告诉编译器在运行该程序时首先要做什么。

fmt.Println( "Hello tiny world" )

我们使用Println()函数输出一条消息,在Go语言上它将被打印或输出到控制台。 但是由于我们将其编译为可在没有微控制器的微控制器上使用,因此输出将发送到微控制器的串行端口或UART。

编译“ Hello World”程序

编译“ Hello World”程序与编译另一个Go代码相同,不同之处在于,我们使用tinygo工具而不是使用go工具来编译代码

要编译代码,只需在命令下面运行

$ tinygo build -o main.go

命令构建告诉工具我们要编译Go代码,-o标志定义要编译的Go代码的输出文件(如果有)和输入文件。 如果未定义输出文件,则将使用与Go代码相同的名称创建输出文件,在本例中为main.go。

编译过程成功后,将创建一个可执行文件

$ ls
main main.go

如果我们想使用其他名称来编译代码,我们可以简单地在命令下面运行

$ tinygo build -o hello main.go

上面的命令将创建一个文件hello,它是main.go的可执行文件。

在上面的代码中,我们仅使用“ fmt” Go标准库,因此这意味着我们可以编译代码并在终端下运行。 但是,如果我们在tinyGo中使用特定的API,则无法使用以上命令进行编译,我们必须在compile命令中添加指定的目标板。

创建另一个文件名“ LED.go​​”

package main 

import ( 
   "machine" 
   "time"
) 

// start here at main function
func main() { 
   go blink(machine.LED1, 1000 * time.Millisecond) 
   go blink(machine.LED2, 750 * time.Millisecond)
} 

// blink the LED with given duration
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) 
    }
}

只需设置正确的TinyGo编译器目标,即可在Arduino Uno,Adafruit ItsyBitsy M0或任何具有内置LED的受支持板上对以上程序进行编译和运行,而无需进行修改。 我们还可以在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: 16 px; color: rgba(0, 0 , 0 , 0.84 ); letter-spacing: -0.022 em; line-height: 1.18 ; font-family: Menlo, Monaco, &quot;Courier New&quot;, Courier, monospace; margin-top: -0.09 em; margin-bottom: -0.09 em; white-space: pre-wrap;">tinygo flash -target arduino-nano33 ./examples/hello/LED.go</span>

命令tinygo flash首先使用编译器构建一个临时二进制文件,该文件是该程序的可执行版本,然后再上传到指定为目标的任何微控制器。 微控制器必须连接到计算机,编译后的程序才能传输到微控制器板上。

但是,闪存特定种类的微控制器板可能会有细微差别。 请参阅TinyGo网站上的https://tinygo.org/microcontrollers/页面,以获取有关如何刷新当前支持的其他任何类型板卡的详细信息。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/dfsgwe1231/article/details/105994076
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-27 19:48:40
  • 阅读 ( 1967 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢