这篇文章主要介绍“怎么在极小硬件中运用Go语言”,在日常操作中,相信很多人在怎么在极小硬件中运用Go语言问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在极小硬件中运用Go语言”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!STM32F030F4P6 给人留下了很深的印象:CPU: Cortex M0 48 MHz(最低配置,只有 12000 个逻辑门电路)RAM: 4 KB,Flash: 16 KB,ADC、SPI、I2C、USART 和几个定时器以上这些采用了 TSSOP20 封装。正如你所见,这是一个很小的 32 位系统。如果你想知道如何在这块开发板上使用 Go 编程,你需要反复阅读硬件规范手册。你必须面对这样的真实情况:在 Go 编译器中给 Cortex-M0 提供支持的可能性很小。而且,这还仅仅只是第一个要解决的问题。我会使用 Emgo,但别担心,之后你会看到,它如何让 Go 在如此小的系统上尽可能发挥作用。在我拿到这块开发板之前,对 stm32/hal 系列下的 F0 MCU 没有任何支持。在简单研究参考手册后,我发现 STM32F0 系列是 STM32F3 削减版,这让在新端口上开发的工作变得容易了一些。如果你想接着本文的步骤做下去,需要先安装 Emgo然后设置一下环境变量更详细的说明可以在 Emgo 官网上找到。要确保egc
在你的PATH
中。 你可以使用go build
来代替go install
,然后把egc
复制到你的$HOME/bin
或/usr/local/bin
中。现在,为你的第一个 Emgo 程序创建一个新文件夹,随后把示例中链接器脚本复制过来:在main.go
文件中创建一个最基本的程序:文件编译没有出现任何问题:第一次编译可能会花点时间。编译后产生的二进制占用了 7624 个字节的 Flash 空间(文本 + 数据)。对于一个什么都没做的程序来说,占用的空间有些大。还剩下 8760 字节,可以用来做些有用的事。不妨试试传统的 “Hello, World!” 程序:不幸的是,这次结果有些糟糕:“Hello, World!” 需要 STM32F030x6 上至少 32KB 的 Flash 空间。fmt
包强制包含整个strconv
和reflect
包。这三个包,即使在精简版本中的 Emgo 中,占用空间也很大。我们不能使用这个例子了。有很多的应用不需要好看的文本输出。通常,一个或多个 LED,或者七段数码管显示就足够了。不过,在第二部分,我会尝试使用strconv
包来格式化,并在 UART 上显示一些数字和文本。我们的开发板上有一个与 PA4 引脚和 VCC 相连的 LED。这次我们的代码稍稍长了一些:按照惯例,init
函数用来初始化和配置外设。system.SetupPLL(8, 1, 48/8)
用来配置 RCC,将外部的 8 MHz 振荡器的 PLL 作为系统时钟源免费云主机域名。PLL 分频器设置为 1,倍频数设置为 48/8 =6,这样系统时钟频率为 48MHz。systick.Setup(2e6)
将 Cortex-M SYSTICK 时钟作为系统时钟,每隔 2e6 次纳秒运行一次(每秒钟 500 次)。gpio.A.EnableClock(false)
开启了 GPIO A 口的时钟。False
意味着这一时钟在低功耗模式下会被禁用,但在 STM32F0 系列中并未实现这一功能。led.Setup(cfg)
设置 PA4 引脚为开漏输出。led.Clear()
将 PA4 引脚设为低,在开漏设置中,打开 LED。led.Set()
将 PA4 设为高电平状态,关掉LED。编译这个代码:正如你所看到的,这个闪烁程序占用了 2320 字节,比最基本程序占用空间要大。还有 6440 字节的剩余空间。看看代码是否能运行:如果你不是一个 Go 程序员,但你已经听说过一些关于 Go 语言的事情,你可能会说:“Go 语法很好,但跟 C 比起来,并没有明显的提升。让我看看 Go 语言的通道和协程!”接下来我会一一展示:代码改动很小: 添加了第二个 LED,上一个例子中的main
函数被重命名为blinky
并且需要提供两个参数。main
在新的协程中先调用blinky
,所以两个 LED 灯在并行使用。值得一提的是,gpio.Pin
可以同时访问同一 GPIO 口的不同引脚。Emgo 还有很多不足。其中之一就是你需要提前规定goroutines(tasks)
的最大执行数量。是时候修改script.ld
了:栈的大小需要靠猜,现在还不用关心这一点。另一个 LED 和协程一共占用了 248 字节的 Flash 空间。通道是 Go 语言中协程之间相互通信的一种推荐方式。Emgo 甚至能允许通过中断处理来使用缓冲通道。下一个例子就展示了这种情况。与之前例子相比较下的不同:鸿蒙官方战略合作共建——HarmonyOS技术社区添加了第三个 LED,并连接到 PA9 引脚(UART 头的 TXD 引脚)。时钟(TIM3
)作为中断源。新函数timerISR
用来处理irq.TIM3
的中断。新增容量为 1 的缓冲通道是为了timerISR
和blinky
协程之间的通信。ISRs
数组作为中断向量表,是更大的异常向量表的一部分。blinky
中的for
语句被替换成range
语句。为了方便起见,所有的 LED,或者说它们的引脚,都被放在leds
这个数组里。另外,所有引脚在被配置为输出之前,都设置为一种已知的初始状态(高电平状态)。在这个例子里,我们想让时钟以 1 kHz 的频率运行。为了配置 TIM3 预分频器,我们需要知道它的输入时钟频率。通过参考手册我们知道,输入时钟频率在APBCLK = AHBCLK
时,与APBCLK
相同,反之等于 2 倍的APBCLK
。如果 CNT 寄存器增加 1 kHz,那么 ARR 寄存器的值等于更新事件(重载事件)在毫秒中的计数周期。 为了让更新事件产生中断,必须要设置 DIER 寄存器中的 UIE 位。CEN 位能启动时钟。时钟外设在低功耗模式下必须启用,为了自身能在 CPU 处于休眠时保持运行:timer.EnableClock(true)
。这在 STM32F0 中无关紧要,但对代码可移植性却十分重要。timerISR
函数处理irq.TIM3
的中断请求。timer.SR.Store(0)
会清除 SR 寄存器里的所有事件标志,无效化向 NVIC 发出的所有中断请求。凭借经验,由于中断请求无效的延时性,需要在程序一开始马上清除所有的中断标志。这避免了无意间再次调用处理。为了确保万无一失,需要先清除标志,再读取,但是在我们的例子中,清除标志就已经足够了。下面的这几行代码:是 Go 语言中,如何在通道上非阻塞地发送消息的方法。中断处理程序无法一直等待通道中的空余空间。如果通道已满,则执行default
,开发板上的LED就会开启,直到下一次中断。ISRs
数组包含了中断向量表。//c:__attribute__((section(".ISRs")))
会导致链接器将数组插入到.ISRs
节中。blinky
的for
循环的新写法:等价于:注意,在这个例子中,我们不在意通道中收到的值,我们只对其接受到的消息感兴趣。我们可以在声明时,将通道元素类型中的int
用空结构体struct{}
来代替,发送消息时,用struct{}{}
结构体的值代替 0,但这部分对新手来说可能会有些陌生。让我们来编译一下代码:新的例子占用了 11324 字节的 Flash 空间,比上一个例子多占用了 1132 字节。采用现在的时序,两个闪烁协程从通道中获取数据的速度,比timerISR
发送数据的速度要快。所以它们在同时等待新数据,你还能观察到select
的随机性,这也是 Go 规范所要求的。STM32F030F4P6开发板上的 LED 一直没有亮起,说明通道从未出现过溢出。我们可以加快消息发送的速度,将timer.ARR.Store(700)
改为timer.ARR.Store(200)
。 现在timerISR
每秒钟发送 5 条消息,但是两个接收者加起来,每秒也只能接受 4 条消息。到此,关于“怎么在极小硬件中运用Go语言”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!
这篇文章主要介绍“CentOS桌面环境中网卡启动失败如何解决”,在日常操作中,相信很多人在CentOS桌面环境中网卡启动失败如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CentOS桌面环境中网卡启动失败如何解决”的疑惑…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。