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
最近编辑记录 kekemuyu (2022-03-17 15:52:33)
离线
@xboot
同感,tinygo等于发明了另一种语言,还是跟随官方go比较好。TamaGo就是增加GOARCH GOOS的方案。但是我更倾向eggos的方案,不用修改官方编译器,他是模拟了linux的中断和系统调用。具体原理请参考这篇博文:https://zhuanlan.zhihu.com/p/265806072
离线
eggos本质是模拟各种linux的syscall吗?
应该是这样,没有详细看,你可以看看eggos的源码,由于go runtime自带内存管理和任务调度,干了很多操作系统的活。只要实现很少的系统调用和中断管理就能移植runtime,eggos的架构图:
eggos的kernel目录是他的核心,可以看到代码量很小:
最近编辑记录 kekemuyu (2022-03-21 15:02:07)
离线
另外还可以参考https://git.sr.ht/~eliasnaur/unik/tree,eggos作者就是受这个项目启发做的。两者原理是一样的
离线
比c大个10几倍有怎样,一个程序自带了多线程和gc,基本上是跑了个操作系统了
离线
go官方的issue中很多人提出希望添加嵌入式支持,官方没答应,理由是硬件太多,工作量巨大,因为官方需要保证go的一致性和稳定性,可以理解,而且go的应用场景重点不在这方面。其实早期go的版本是支持裸机的,goos=tinygo,后来给删除了。
离线
go语言裸机最小生成elf工程:
add_20220409-1201.zip
离线