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