Plaza 新闻汇总

任天堂DS上的Advent of Code

本文讲述了作者在任天堂DS(原版)上使用Rust语言运行Advent of Code挑战的故事。

Advent of Code是一个年度编程挑战,但作者认为它浪费时间,于是决定以此为契机,尝试在没有运行时环境、内存有限、生态系统不完善的嵌入式系统上运行Rust代码,并选择Nintendo DS作为目标平台。

首先,作者对Nintendo DS(代号Nitro)的系统架构进行了简要概述,包括其使用了两个处理器:一个ARM946E-S和一个ARM7TDMI,以及它们各自的角色和功能。

随后,作者准备了开发环境,包括GBATEK、Infinite Space游戏等资料,并使用Crossdev搭建了一个ARM交叉编译器。

接下来,作者编写了一个简单的Rust程序,并在Nitro上成功运行,但随后发现程序加载地址和运行地址不一致,以及堆栈指针设置不正确的问题。

为了解决这些问题,作者编写了一个链接脚本,并修改了Cargo配置文件,使得编译器能够正确地将代码加载到指定的内存区域并设置堆栈指针。

在此基础上,作者又编写了一个C Runtime,包括初始化堆栈指针、设置Coprocessor 15、清空BSS段等功能,最终实现了程序的正常运行。

为了支持多线程,作者使用了portable-atomic库,并为其提供了临界区处理函数,实现了原子操作。

然后,作者为程序创建了一个堆空间,并解决了Advent of Code挑战的第一天的第一个问题。

为了将结果显示在屏幕上,作者使用了Display Mode 2,将VRAM Bank A作为帧缓冲区,并使用embedded_graphics库实现了图形绘制功能。

最后,作者将Advent of Code的解决方案绘制到屏幕上,并总结了整个项目的经验和教训。

总的来说,这是一个有趣的尝试,作者成功地在Nintendo DS上运行了Rust程序,并解决了Advent of Code挑战的一部分问题。尽管还有很多可以改进的地方,但这个项目已经证明了Rust语言在嵌入式系统中的应用潜力。

原文地址
2024-12-16 23:42:12