您尚未登录。

楼主 # 2022-03-17 10:22:51

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

go语言裸机编程探索

go和c现在是我工作中的主力语言。go在很多领域发挥了强大作用,那go适合嵌入式吗?当前并不适合,但go具有控制硬件的能力,虽然有些繁琐。
本帖最终目的是在全志f1c100s/200s或者说是arm9系列芯片直接运行go程序,主要是把go runtime移植到arm9上。本帖主要是受github的开源项目https://github.com/icexin/eggos的启发,此项目已成功将go runtime移植到x86上。开篇先建立环境:
虚拟环境是qemu-system-arm
先在上面跑个gnu汇编热热身。
arm.zip
155152.png

最近编辑记录 kekemuyu (2022-03-17 15:52:33)

离线

#1 2022-03-21 09:35:04

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

之前研究过一段时间,基本有两种思路,一种是完全模拟linux上的go runtime,还有一种是go编译器增加NOOS之类的编译选项,改编译器最彻底,最通用,但官方不支持。比较遗憾!

离线

#2 2022-03-21 10:52:37

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 660
积分: 793
个人网站

Re: go语言裸机编程探索

已经有老外实现在MCU上用go语言开发啦:https://tinygo.org
实现方式似乎是对语言特性做了些修改。

PS:度娘很多时候真的搜索不到有用的东西

最近编辑记录 海石生风 (2022-03-21 10:57:11)

离线

#3 2022-03-21 11:39:42

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 463
积分: 330.5
个人网站

Re: go语言裸机编程探索

tinygo +1
zig +1

离线

#4 2022-03-21 12:59:02

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

还是不喜欢tinygo这种深度魔改型,最好的方式,还是原生go编译器,增加GOARCH GOOS这种选项,只要增加个BAREMETAL或在NOOS,不管叫什么,就超级感兴趣了。就是有点遗憾~!

离线

#5 2022-03-21 13:17:21

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 660
积分: 793
个人网站

Re: go语言裸机编程探索

tinygo也好原生go也好,裸机还搞GC本身就不实在,在这种平台用go无非是想编程舒服点,那还不如用nim之类的可以输出C源码的语言。

离线

楼主 #6 2022-03-21 13:49:02

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: go语言裸机编程探索

@xboot
同感,tinygo等于发明了另一种语言,还是跟随官方go比较好。TamaGo就是增加GOARCH GOOS的方案。但是我更倾向eggos的方案,不用修改官方编译器,他是模拟了linux的中断和系统调用。具体原理请参考这篇博文:https://zhuanlan.zhihu.com/p/265806072

离线

#7 2022-03-21 14:05:04

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

eggos本质是模拟各种linux的syscall吗?

离线

楼主 #8 2022-03-21 15:01:30

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: go语言裸机编程探索

xboot 说:

eggos本质是模拟各种linux的syscall吗?

应该是这样,没有详细看,你可以看看eggos的源码,由于go runtime自带内存管理和任务调度,干了很多操作系统的活。只要实现很少的系统调用和中断管理就能移植runtime,eggos的架构图:
145734.png
eggos的kernel目录是他的核心,可以看到代码量很小:
145931.png

最近编辑记录 kekemuyu (2022-03-21 15:02:07)

离线

楼主 #9 2022-03-21 15:05:11

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: go语言裸机编程探索

另外还可以参考https://git.sr.ht/~eliasnaur/unik/tree,eggos作者就是受这个项目启发做的。两者原理是一样的

离线

#10 2022-03-21 17:12:17

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

eggos这套机制值得研究,首先得用go搞出hello world,在F1C100S平台上,裸奔启动代码不缺,就缺go编译出来的elf,直接搞成bin文件,然后缺什么补什么

离线

#11 2022-03-21 19:27:16

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 660
积分: 793
个人网站

Re: go语言裸机编程探索

如果不改语言特性,把核心runtime都移植过来的话,会不会一个"hello world"程序就要一两MB大小甚至更大呢?

最近编辑记录 海石生风 (2022-03-21 19:29:53)

离线

#12 2022-03-21 20:30:48

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

就看连接的运行时的大小了,估计小不了,go的库都比较高级,功能强悍,不过tinygo都能在mcu跑,感觉还是绰绰有余的。

离线

楼主 #13 2022-03-21 22:29:34

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: go语言裸机编程探索

比c大个10几倍有怎样,一个程序自带了多线程和gc,基本上是跑了个操作系统了

离线

#14 2022-03-22 09:12:45

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 660
积分: 793
个人网站

Re: go语言裸机编程探索

tinygo是改了不少东西才能适用于MCU平台。一般的C裸机运行个printf也就十来KB,加个小RTOS也就几十KB。

离线

#15 2022-03-22 10:01:07

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

是的,大一点,无所谓,基本代替操作系统了,毕竟OS的体积也要算上。

离线

#16 2022-03-22 10:02:17

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

多多研究,如果跑出helloworld了,也许我会入坑

离线

#17 2022-03-22 10:08:09

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

对于大家玩的这些芯片,程序体积不是问题,我个人觉得反而特别合适发挥跨界MCU的优点。32MB的rom,ram,心无杂念的跑一个功能强悍的裸奔程序。系统不稳定都难。

离线

楼主 #18 2022-03-22 10:39:37

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: go语言裸机编程探索

go官方的issue中很多人提出希望添加嵌入式支持,官方没答应,理由是硬件太多,工作量巨大,因为官方需要保证go的一致性和稳定性,可以理解,而且go的应用场景重点不在这方面。其实早期go的版本是支持裸机的,goos=tinygo,后来给删除了。

离线

#19 2022-03-22 11:02:39

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

是的,我也期望go官方能支持裸奔,这样go编译器就不要去操心了,只要专心做好runtime就行了,其实我觉得官方觉得工作量巨大,是因为没有抽象出一个统一的runtime接口,少了一个抽象层,我觉得,随着go的发展,这个抽象层是必须的,不但有一定的扩展能力,还能降低系统耦合度,代码可读性,可维护性。当然这个抽象层是否能设计的好,是否影响效率,就看官方的架构水平了。

离线

#20 2022-03-23 13:42:18

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 660
积分: 793
个人网站

Re: go语言裸机编程探索

我没有研究过go runtime,如果直接把官方runtime移植到支持POSIX标准的RTOS或像vsf大侠的VSF平台的话,工作量是否比在裸机上从零开始移植要少点?

在裸机上,即使是使用现成的协议栈源码,从零开始去搞以太网或USB还是挺麻烦的。

最近编辑记录 海石生风 (2022-03-23 13:49:38)

离线

#21 2022-03-23 20:07:34

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

看了下eggos,里面实现如下syscall,不是全部linux syscall, 这些syscall,绝大部分还是用go写的。

	kernelCalls = [...]uintptr{
		syscall.SYS_ARCH_PRCTL,
		syscall.SYS_MMAP,
		syscall.SYS_MUNMAP,
		syscall.SYS_CLOCK_GETTIME,
		syscall.SYS_RT_SIGPROCMASK,
		syscall.SYS_SIGALTSTACK,
		syscall.SYS_RT_SIGACTION,
		syscall.SYS_GETTID,
		syscall.SYS_CLONE,
		syscall.SYS_FUTEX,
		syscall.SYS_NANOSLEEP,
		syscall.SYS_SCHED_YIELD,
		syscall.SYS_MADVISE,
		syscall.SYS_EXIT_GROUP,

		// TODO: real random
		unix.SYS_GETRANDOM,

		// may removed in the future
		syscall.SYS_EPOLL_CREATE1,
		syscall.SYS_EPOLL_CTL,
		syscall.SYS_EPOLL_WAIT,
		syscall.SYS_EPOLL_PWAIT,
		syscall.SYS_PIPE2,

		SYS_WAIT_IRQ,
		SYS_WAIT_SYSCALL,
		SYS_FIXED_MMAP,
		SYS_EPOLL_NOTIFY,
	}

离线

#22 2022-03-23 20:08:44

xboot
会员
注册时间: 2019-10-15
已发帖子: 692
积分: 434

Re: go语言裸机编程探索

感觉比较好的思路就是用c完整实现一个类linux的各种系统调用。然后直接用go去编译链接

最近编辑记录 xboot (2022-03-23 20:09:18)

离线

楼主 #23 2022-04-09 12:01:07

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 849
积分: 710

Re: go语言裸机编程探索

go语言裸机最小生成elf工程:
add_20220409-1201.zip

离线

#24 2022-04-11 22:38:43

aozima
会员
所在地: 深圳
注册时间: 2019-05-25
已发帖子: 463
积分: 330.5
个人网站

Re: go语言裸机编程探索

@kekemuyu
生成 .a 并与C这边相互调用的方式有没?
想在RTOS环境下,把部分应用逻辑代码用go编译成.a,并与原来的RTOS相结合。

最近编辑记录 aozima (2022-04-11 22:41:09)

离线

#25 2022-10-18 23:12:52

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 660
积分: 793
个人网站

Re: go语言裸机编程探索

半年多过去了,这个项目还在搞么?看了下tinygo现在已经支持4种架构并适配了90多块开发板了。比较好奇,专为速度而设计的编译器在裸机平台下占用的ROM跟RAM会有多少。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn