來源:量子位
CEO 親自寫的代碼是啥樣?
來自 RealVNC 公司的 CEO 說,自己長年當管理者,代碼生疏了,所以決定重拾一下程序員工作,寫一點樹莓派的代碼。
結果,一不小心就上了技術論壇 Hacker News 熱門。
這串代碼究竟是什么?打開這位 CEO 的 Twitter 一看,是一段小游戲。
花了一年時間就寫了個這?當然不是,這位 CEO 可是從零開始打造的這款游戲,連系統啟動文件都是自己寫的。
通常我們使用樹莓派都會在 SD 卡上刷寫好操作系統,其實樹莓派還能從零開始打造成一款 " 裸金屬 "(Bare Metal)計算機。
所謂 " 裸金屬 " 就是沒有操作系統的計算機,直接在邏輯硬件上執行指令。這位 CEO 說,打造一個裸金屬系統是他兒時的志向。
所以就有了這串,從零開始到成功運行 Hello World,再到運行小游戲的程序。
從啟動硬件到 Hello World
目前,該項目已經完成了 12 章,仍在 GitHub 上繼續更新中,截至今天已經收獲了 1.6k 星。
項目內容有:啟動、構建基本代碼、運行 HelloWorld、調用藍牙聲音硬件等。
在編寫代碼之前先要準備樹莓派 4 的周邊硬件:HDMI 線、micro-SD 卡以及USB 轉 TTL 線。
由于編譯過程是在電腦上進行,而程序是在樹莓派上運行,因此還要在電腦上安裝交叉編譯器。
接下來開始引導樹莓派啟動:
樹莓派 4 運行的第一個代碼需要用匯編語言編寫,之后由 C 語言來編寫內核。
寫好啟動代碼后,再制作 makefile 文件進行交叉編譯。
CFILES = $ ( wildcard *.c ) OFILES = $ ( CFILES:.c=.o ) GCCFLAGS = -Wall -O2 -ffreestanding -nostdinc -nostdlib -nostartfilesGCCPATH = ../../gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/binall: clean kernel8.imgboot.o: boot.S$ ( GCCPATH ) /aarch64-none-elf-gcc $ ( GCCFLAGS ) -c boot.S -o boot.o%.o: %.c$ ( GCCPATH ) /aarch64-none-elf-gcc $ ( GCCFLAGS ) -c $< -o [email protected]: boot.o $ ( OFILES ) $ ( GCCPATH ) /aarch64-none-elf-ld -nostdlib boot.o $ ( OFILES ) -T link.ld -o kernel8.elf$ ( GCCPATH ) /aarch64-none-elf-objcopy -O binary kernel8.elf kernel8.imgclean:/bin/rm kernel8.elf .o .img > /dev/null 2> /dev/null || true
運行 make 后構建內核映像 kernel8.img,將鏡像文件復制到 SD 卡中,這樣就可以啟動樹莓派了。
不過樹莓派在這一通操作后只能運行啟動畫面,之后只剩下一個空的黑屏。
然后就是讓樹莓派程序員熟悉的 "Hello World" 程序,但是在一臺黑屏的機器上如何運行呢?這就需要用到 UART 串行通信。
剛剛準備的 USB 轉 TTL 線這時候就派上了用場。
將 TTL 的 RX 引線(白色)鏈接到 GPIO 的 TXD 引腳上,TX 引線(綠色)鏈接到 GPIO 的 RXD 引腳上,地線(黑線)連接到 Ground 引腳上。
電腦上還要安裝 PuTTY,將鏈接方式選擇為 "Serial",Speed 設置為 115200
#include "io.h"voidmain ( ) {uart_init ( ) ;uart_writeText ( "Hello world!n" ) ;while ( 1 ) ;}
這里的頭文件 io.h 也不存在,需要自己定義。
但是此時的樹莓派還有沒字體文件,也就是屏幕無法正常顯示英文字母,也需要自定義。經過一系列操作后,這位 CEO 終于在屏幕上成功顯示了 "Hello world!" 和幾個幾何圖形。
編程并沒有到此截止,這位 CEO 后面又實現了對藍牙互傳信息、播放音頻文件等操作。他還表示,項目還在持續更新中。
關于作者
" 裸金屬 " 樹莓派的作者 Adam Greenwood-Byrne 畢業于牛津大學,2009 年加入 RealVNC 擔任銷售經理,2018 年成為這家公司 CEO。
他的 GitHub 主頁上目前只有一個項目,第一章內容是他在疫情隔離期間完成的,之后項目就處于休眠狀態。
不過從今年的活躍度來看,他從今年開始又重拾了該項目,開始認真寫代碼了。