And that's great! But I want to know how things actually work, and those tools
put a lot of code between me and the machine.
In this post, I'll show how to create a simple web graphics demo using none of
no libraries between our code and the platform. It's the web equivalent of bare
The resulting WebAssembly module will be less than 300 bytes. That's about
the same size as the previous paragraph.
Over the past few months, I've been rewriting it — in Rust.
This is an interesting test case for Rust, because we're very much in C/C++'s
home court here: the demo runs on the bare metal, without an operating system,
and is very sensitive to both CPU timing and memory usage.
The results so far? The Rust implementation is simpler, shorter (in lines of
code), faster, and smaller (in bytes of Flash) than my heavily-optimized C++
version — and because it's almost entirely safe code, several types of
bugs that I fought regularly, such as race conditions and dangling pointers, are
now caught by the compiler.
It's fantastic. Read on for my notes on the process.
This post is the third in a series looking at the
design and implementation of my Glitch demo and the
m4vgalib code that powers it.
In part two, I showed a fast way to push pixels out of an STM32F407 by getting
the DMA controller to run at top speed. I described the mode as follows:
It just runs full-tilt, restricted only by the speed of the "memory" [or
memory-mapped peripheral] at either side...
But there's a weakness in this approach, which can introduce jitter and hurt your video quality. I hinted at it in a footnote:
...and traffic on the AHB matrix, which is very important — I’ll come back
Quite a bit of m4vgalib's design is dedicated to coordinating matrix traffic,
while imposing few restrictions on the application. In this article, with a
minimum of movie puns, I'll explain what that that means and how I achieved it.