在國產(chǎn)嵌入式實(shí)時操作系統(tǒng)領(lǐng)域,RT-Thread無疑是當(dāng)下最活躍、應(yīng)用最廣泛的開源項(xiàng)目。從早期的個人項(xiàng)目發(fā)展到如今支持從8位微控制器到64位多核處理器,覆蓋物聯(lián)網(wǎng)、工業(yè)控制、消費(fèi)電子等多個領(lǐng)域,RT-Thread的成功離不開它簡潔優(yōu)雅的架構(gòu)設(shè)計。而對象容器作為RT-Thread內(nèi)核最基礎(chǔ)的核心設(shè)計,貫穿了整個系統(tǒng)的資源管理邏輯,把面向?qū)ο蟮脑O(shè)計思想完美融入到了C語言開發(fā)的嵌入式系統(tǒng)中,值得我們深入拆解分析。
在計算機(jī)處理器發(fā)展的歷史長河里,RISC架構(gòu)的興起徹底改變了整個行業(yè)的面貌,而說起RISC架構(gòu)的代表,很多人第一時間會想起ARM,卻常常忽略了SPARC——這個比ARM誕生更早、對現(xiàn)代RISC設(shè)計影響深遠(yuǎn)的架構(gòu)。從1987年太陽微系統(tǒng)(Sun Microsystems)推出第一款SPARC處理器,到如今甲骨文(Oracle)旗下的SPARC T系列、M系列服務(wù)器芯片,SPARC走過了近四十年的發(fā)展歷程,它既是RISC設(shè)計思想最早的踐行者,也在服務(wù)器領(lǐng)域留下了太多經(jīng)典設(shè)計。
當(dāng)我們今天談?wù)揜ISC-V在中國的發(fā)展,從服務(wù)器芯片到邊緣MCU,從開源社區(qū)到工業(yè)量產(chǎn),很難不提到一個名字——兆易創(chuàng)新GD32VF103。作為全球首款量產(chǎn)的基于RISC-V架構(gòu)的通用32位微控制器,它在2019年發(fā)布時就注定成為國產(chǎn)芯片發(fā)展史上的一個標(biāo)志性產(chǎn)品。走過近七年的市場驗(yàn)證,這款芯片的定位、價值和后續(xù)發(fā)展,依然值得我們沉下心來重新梳理和思考,它不僅僅是一款可供量產(chǎn)使用的MCU,更是國產(chǎn)芯片借著開源架構(gòu)實(shí)現(xiàn)彎道超車的一個縮影。
在嵌入式開發(fā)領(lǐng)域,數(shù)字信號處理(DSP)需求正在快速增長。從智能家居的語音交互到無線耳機(jī)的主動降噪,從工業(yè)電機(jī)控制到便攜式醫(yī)療設(shè)備的信號分析,越來越多的低功耗嵌入式設(shè)備需要高效完成信號運(yùn)算。傳統(tǒng)方案中,我們要么依賴昂貴的專用DSP芯片,要么忍受通用處理器處理復(fù)雜運(yùn)算時的低效率。隨著RISC-V架構(gòu)的興起,通過P擴(kuò)展DSP指令集,通用RISC-V內(nèi)核也能擁有比肩專用DSP的運(yùn)算能力,為成本敏感的嵌入式設(shè)計提供了全新方案。
當(dāng)我們談起C語言,很多人第一印象是面向底層、面向系統(tǒng)的編譯型語言,寫出來的程序一般都是從頭到尾跑一遍就結(jié)束,很少和用戶交互。但實(shí)際上,C語言從誕生開始就支持交互式的程序設(shè)計,通過標(biāo)準(zhǔn)輸入輸出和用戶實(shí)時交互,接收用戶輸入、處理并輸出結(jié)果,非常適合開發(fā)小工具、調(diào)試程序、做命令行交互程序。
在STM32嵌入式開發(fā)中,精確延時是非?;A(chǔ)但又極其關(guān)鍵的功能。無論是驅(qū)動單總線傳感器(比如DS18B20)、控制LCD屏幕時序、還是生成精確的脈沖信號,都需要用到微秒級甚至納秒級精度的延時。很多新手剛開始使用STM32,會直接用簡單的空循環(huán)延時,或者隨便用系統(tǒng)時鐘分頻做延時,結(jié)果實(shí)際使用中發(fā)現(xiàn)延時誤差很大,溫度傳感器讀不出數(shù)據(jù),屏幕驅(qū)動時序不對點(diǎn)不亮,遇到問題還不知道為什么不準(zhǔn)。
在嵌入式系統(tǒng)開發(fā)中,RAM(隨機(jī)存取存儲器)是決定系統(tǒng)性能、功能上限的核心資源。和通用PC不同,嵌入式系統(tǒng)的RAM資源往往非常緊張:從低端8位單片機(jī)的幾百字節(jié),到中高端MCU的幾十KB幾百KB,哪怕是高端嵌入式SOC也不過幾GB,如何合理規(guī)劃使用RAM,是每個嵌入式開發(fā)者必須掌握的核心能力。
AMS1117是電子設(shè)計領(lǐng)域最常用的線性穩(wěn)壓芯片之一,憑借低成本、低噪聲、電路簡單的優(yōu)勢,幾乎是所有低壓降壓場景的首選方案。尤其是AMS1117-3.3V版本,專門輸出穩(wěn)定的3.3V直流電壓,剛好匹配STM32、ESP8266、樹莓派Pico等常用單片機(jī)的工作電壓,從學(xué)生畢業(yè)設(shè)計到量產(chǎn)消費(fèi)電子,到處都能看到它的身影。
在C語言開發(fā)中,位操作符是最容易被新手忽略,卻能在嵌入式開發(fā)、底層驅(qū)動、算法優(yōu)化中發(fā)揮巨大作用的工具。和常規(guī)的算術(shù)操作、邏輯操作相比,位操作直接操作二進(jìn)制位,執(zhí)行效率更高,占用代碼空間更小,能輕松實(shí)現(xiàn)很多用常規(guī)方法很難實(shí)現(xiàn)的功能:比如狀態(tài)標(biāo)志位管理、寄存器配置、數(shù)據(jù)壓縮、奇偶校驗(yàn)等等。
在STM32嵌入式開發(fā)中,RAM(隨機(jī)存取存儲器)是程序運(yùn)行時存儲動態(tài)數(shù)據(jù)、堆棧、全局變量的核心資源,直接決定了程序能實(shí)現(xiàn)的功能復(fù)雜度。很多開發(fā)者都遇到過莫名的程序崩潰、硬件異常,追根溯源往往是RAM分配錯誤、占用溢出:堆棧溢出覆蓋了全局變量,全局變量過多超出芯片RAM容量,動態(tài)內(nèi)存分配碎片化導(dǎo)致分配失敗……這些問題排查難度大,往往需要對STM32的RAM分配規(guī)則有清晰的理解才能快速解決。
串口(UART/TTL/RS232/RS485)憑借接線簡單、兼容性強(qiáng)、調(diào)試成本低的優(yōu)勢,一直是嵌入式設(shè)備、工業(yè)控制、智能家居設(shè)備中最常用的短距離通信方式。但串口本身是基于字節(jié)流的底層通信協(xié)議,只保證單個字節(jié)的傳輸,不處理數(shù)據(jù)幀的分組、校驗(yàn)、錯誤處理,如果沒有一套合理的用戶層協(xié)議,很容易出現(xiàn)粘包、丟包、錯誤數(shù)據(jù)無法識別等問題,輕則功能異常,重則導(dǎo)致設(shè)備誤動作引發(fā)安全問題。
樹莓派3B憑借低成本、高性能、豐富的外設(shè)資源,一直是嵌入式愛好者和開發(fā)者學(xué)習(xí)RTOS的熱門平臺,而RT-Thread作為國內(nèi)生態(tài)最完善的開源實(shí)時操作系統(tǒng),對樹莓派3B有著完善的原生支持。但很多剛接觸的開發(fā)者,往往卡在環(huán)境搭建這一步:不知道該選什么編譯工具鏈、怎么配置內(nèi)核、怎么燒錄運(yùn)行,折騰好幾天都跑不起第一個示例程序。
在ARM平臺開發(fā),尤其是嵌入式系統(tǒng)開發(fā)中,程序崩潰、段錯誤等異常問題一直是開發(fā)者調(diào)試的難點(diǎn)。不同于x86平臺有豐富的調(diào)試工具,嵌入式ARM開發(fā)往往受限于硬件資源,難以在線實(shí)時調(diào)試。Backtrace技術(shù)作為程序崩潰后的“黑匣子”,能夠還原出從崩潰點(diǎn)到程序入口的完整函數(shù)調(diào)用鏈,幫助開發(fā)者快速定位出錯位置,是ARM平臺開發(fā)中必不可少的調(diào)試能力。
作為國內(nèi)應(yīng)用最廣泛的開源物聯(lián)網(wǎng)實(shí)時操作系統(tǒng),RT-Thread憑借體積小、實(shí)時性強(qiáng)、資源占用低的優(yōu)勢,已經(jīng)成為中小微嵌入式設(shè)備開發(fā)的首選RTOS。而線程作為RT-Thread中最基礎(chǔ)的調(diào)度單元,其調(diào)度與管理機(jī)制直接決定了系統(tǒng)的實(shí)時性與穩(wěn)定性,理解這套機(jī)制的核心原理,是開發(fā)出健壯嵌入式應(yīng)用的基礎(chǔ)。
在嵌入式STM32開發(fā)中,程序崩潰是開發(fā)者最常遇到也最頭疼的問題之一:程序運(yùn)行中突然跑飛、進(jìn)入HardFault中斷,開發(fā)者往往只能靠加打印猜位置,排查一個bug可能需要幾天時間。這時候,Backtrace功能就像是嵌入式開發(fā)的“黑匣子”,能夠在程序崩潰后打印出從崩潰點(diǎn)回溯到入口的完整函數(shù)調(diào)用棧,讓開發(fā)者一眼就能定位到出錯的代碼位置,極大縮短了bug排查時間。