1. 簡介
1.1 nuttx介紹
NuttX是一個成熟的實時操作系統,于07年由Gregory Nutt先生正式開源,2016年被三星選為TizenRT操作系統的內核,2019年在小米的推動下正式進入Apache基金會,經過開源社區多年的不懈努力,NuttX功能豐富,性能穩定,商業化成熟度高,Fitbit最近兩代的手環產品和索尼多款消費級產品都是基于NuttX開發的。
NuttX 是一個實時操作系統 (RTOS),強調標準合規性和占用空間小。NuttX 中的主要管理標準是 Posix 和 ANSI 標準,可從 8 位微控制器環境擴展到 64 位微控制器環境。來自 Unix 和其他常見 RTOS(例如 VxWorks)的附加標準 API 被用于這些標準下不可用的功能,或者不適合深度嵌入環境的功能(例如 fork())。
NuttX可運行于各種處理器架構和硬件平臺上,包括ARM、MIPS、AVR等其重點遵從特定的標準并且盡量 可伸縮良好且可適應從8位到32位單片機環境
NuttX遵循POSIX標準,在Linux中廣泛應用的API接口,并且具有實時操作系統(RTOS)的特性。它采用模塊化設計,將內核空間和用戶空間分離,并提供了豐富的驅動程序和服務程序,包括文件系統、網絡協議棧、USB主機/設備支持等。同時,它還支持多任務、多線程、信號量、消息隊列、事件驅動等特性,方便用戶進行開發和調試。
NuttX特點:
開源免費:NuttX是一款完全開源、免費的操作系統,可以自由下載和使用。
可移植性:支持各種處理器架構和硬件平臺,具有良好的可移植性和通用性。
穩定可靠:經過長時間的使用和測試,已經成熟穩定,能夠滿足各種嵌入式應用的需求。
易用性高:具有簡單易學的API和文檔,便于開發者學習和使用。
NuttX應用場景:
工控系統:可以將NuttX應用于各種工業自動化、機器人控制、智能電網等工控領域。
消費電子:可以將NuttX應用于各種消費電子產品,例如:移動設備、家庭娛樂系統、數字相框等。
智能家居:可以將NuttX應用于智能家居領域,例如:溫度控制、燈光控制、安全監測等。
主要特點分析:
物聯網領域應用廣泛
對系統資源的要求遠小于Linux,但是可以提供和Linux系統相近的功能和性能,可以被看作很多低端Linux系統的替代方案。
功能高度可裁剪,可以支持系統資源使用跨度極大的各種產品形態,開發者可根據實際需求對系統進行定制。
由于它對POSIX接口的兼容,Linux平臺上現有的開源庫和組件都可以很方便的移植,另外由于軟件平臺對硬件平臺作出了隔離和統一,因此廠商的上層應用代碼在移植到不同硬件平臺時也可以更好的復用。
NuttX本身提供了豐富的OS組件,所以應用開發者可以利用豐富的OS組件和應用框架,快速的完成系統的定制和應用的開發,減少開發成本,讓產品更快的投放市場。
實時性:Nuttx是一個實時操作系統,可以提供精確的時間管理和響應。這對于需要嚴格時間控制的嵌入式應用非常重要。Linux系統雖然可以提供實時性,但通常需要額外的配置和補丁。
可移植性:Nuttx被設計為高度可移植的,可以在多種硬件平臺上運行。它支持許多不同的處理器架構和設備。Linux系統也具有很高的可移植性,但在某些嵌入式設備上可能需要更多的定制和適配工作。
市場上開源或商業的RTOS非常多,為什么我們選擇NuttX?主要有以下幾個原因:
NuttX對POSIX標準有原生兼容:NuttX是可商用化RTOS中唯一一個對POSIX API有原生支持的實時操作系統,所以很多Linux社區的開源軟件可以很方便的移植到NuttX上,這樣可以極大的簡化開源軟件移植,方便代碼復用,降低學習曲線,其它RTOS需要適配層把POSIX API轉成內部API,而且通常只兼容一小部分的POSIX接口。
完成度高:NuttX集成了文件系統、網絡協議棧、圖形庫和驅動框架,減少開發成本。
模塊化設計:所有組件甚至組件內部特性,都可以通過配置Kconfig來調整或關閉,可按需對系統進行裁剪,適用于不同產品形態。
代碼精簡:所有組件都是從頭編碼,專門對代碼和數據做了優化設計。
輕量級:雖然NuttX實現了傳統操作系統的所有功能,但是最終生成的代碼尺寸還是可以很小(最小配置不到32KB,最大配置不超過256KB)。
和Linux系統的兼容性:因為NuttX整體設計、代碼組織,編譯過程和Linux非常接近,將會極大地降低Android/Linux開發者的遷移成本。
活躍開放的社區:很多廠商(比如小米、Sony,樂鑫、NXP等)和開源愛好者都在積極回饋社區。
1.2 NuttX的系統架構
上圖從縱向看,NuttX和傳統操作系統一樣由調度子系統、文件子系統、網絡子系統、圖形子系統和驅動子系統組成。
從橫向看,NuttX向上給應用程序提供了POSIX和ANSI定義的標準C/C++接口。對于沒有標準化的組件(比如各種外設),NuttX通常會提供兼容Linux的API。向下NuttX定義了Arch API、塊設備驅動接口、網卡驅動接口、display驅動接口,以及各種總線和外設的lower half驅動接口,使得芯片廠商能夠規范、快速地完成移植工作。下圖中數量眾多的藍色模塊就是NuttX實現的各種功能。
子系統介紹:
調度子系統:NuttX支持大多數RTOS都沒有實現的進程概念,并提供完整的POSIX API,比如pthread、信號量、消息隊列、時鐘/定時器、信號、環境變量等。同時,也支持RTOS上常見的優先級翻轉和tickless模式。NuttX支持對稱多處理(SMP)和非對稱多處理(AMP)兩種多核編程模式,開發者可以根據芯片設計的特點和應用場景的需求,選擇使用SMP或AMP,甚至同時使用SMP和AMP。NuttX支持所有常見CPU架構,比如Cortex-A/Cortex-R/Cortex-M、AVR、MIPS、32位/64位 RISC-V,X86/X64,Z80,以及Tensilica和CEVA的DSP,并有超過150款芯片成功移植到NuttX上。
文件系統:NuttX設計了一套完整而小巧的虛擬文件系統,除了支持統一的目錄和文件操作外,還支持掛載點、字符設備,塊設備等高級概念。直接支持10多種常用的文件系統。比如FAT、LittleFS、SmartFS、NFS、ROMFS、TMPFS等。另外,NuttX內置根文件系統,無需掛載即可啟動,極大的簡化了開發和部署流程。
網絡子系統:NuttX實現了完整的網絡協議棧,支持以太網、WiFi、802.15.4、藍牙、CAN等數據鏈路層協議,支持IPv4、IPv6以及相關的ARP、ICMP、IGMP、MLD等傳輸層協議,實現了BSD兼容套接字API,除了常見的TCP、UDP協議外,還支持raw packet、unix domain、netlink套接字類型。另外,NuttX還提供了大量的應用層協議實現,比如DHCP、DNS、NTP、Telnet、FTP、SMTP、HTTP等。
驅動子系統:除了接入到文件系統的塊設備驅動和接入到TCP/IP協議棧的網絡設備驅動外,NuttX還為各種常見總線和外設定義了類似Linux的字符設備驅動。一方面通過NuttX為每類設備定義的標準IOCTL接口,應用程序可以用統一的API訪問不同廠商的硬件驅動,另一方面NuttX驅動框架實現了和硬件無關的操作(比如權限控制、buffer管理,睡眠/喚醒等),降低驅動程序的開發難度。最后,NuttX提供了一套基于activity統計的低功耗管理框架,使得驅動程序可以方便地實現低功耗控制。
1.3 Xiaomi Vela 介紹
Xiaomi Vela 項目,是小米基于開源實時操作系統NuttX打造的嵌入式物聯網軟件平臺。小米基于 Apache NuttX 開發了為解決物聯網碎片化而生的,物聯網領域自研的嵌入式軟件平臺——Xiaomi Vela。
在各種不同的物聯網硬件上提供統一的軟件平臺,支持高性價比的MCU設備,為IoT的繁榮構建基礎設施。Xiaomi Vela 通過組件化能力,做到高度可伸縮、可裁剪,支持豐富的組件和易用的框架。同時,可以很方便的去支持功能差異跨度極大的各種物聯網設備。還與 Linux 保持高度兼容性,適合做 Linux 的平替,幫助硬件實現降本。并基于物聯網的特性,在多核異構、安全、超低功耗渲染和連接方面都建設了獨有的能力。
IoT領域跟傳統的PC和手機行業相比,最大的差異點就是IoT設備極其碎片化,這個碎片化給小米自身以及整個行業帶來了效率低下的問題(代碼的不可復用、軟件的重復建設)。隨著IoT行業的高速發展,到2030年全球還會新增150億IoT設備,所帶來的碎片化問題只會是越來越嚴重。因此,迫切的需要一個統一的軟件平臺來打通碎片化的IoT應用,讓其能夠和諧共通。
Xiaomi Vela 可以通過豐富的組件和標準化的軟件框架,打通碎片化的物聯網應用場景;可以確保信息在設備間高效無縫的流轉;能夠做到更多物聯網產品的互聯隨心配,為用戶帶去更趣味、多樣性的搭配選擇。目前 Xiaomi Vela 已經裝載在含智能家居、穿戴、智能音箱等品類的數百款、千萬級的智能設備上。能夠聯動構建更多豐富且實用的智能場景,擁有更極致的設備互聯的體驗,讓全球每個人都能享受科技帶來的美好生活,這是Xiaomi Vela的目標,同時也是小米公司的愿景。
Xiaomi Vela 主要特性:
高效性能:Vela 基于 NuttX 內核,具有高實時性、低功耗、低延遲等特點,適用于各種資源受限的嵌入式設備。
豐富組件:Vela 提供了多種常用的組件,如網絡、音頻、視頻、圖形、安全等,方便開發者快速構建應用。
易用框架:Vela 提供了一套統一的應用框架,支持 Lua、JavaScript 等腳本語言開發應用,并提供了豐富的 API 和文檔。
萬物互聯:Vela 支持多種通信協議和標準,如 WiFi、BLE、Zigbee、MQTT 等,并提供了小米妙享技術,實現設備之間的無縫連接和協同。
底層 NuttX 內核:提供最基本的任務調度、跨進程間通信、文件系統等基礎 OS 功能,同時也提供簡潔高效的設備驅動、輕量級的 TCP/IP 協議棧和電源管理等組件。
應用框架:分為上下兩層,下層是為擴展系統服務而提供的通用應用框架,上層是針對不同的物聯網應用而開發的定制應用框架,例如多媒體應用框架和傳感應用框架,提供 Cloud SDK 可以方便開發者更快速的接入小米云服務。
開發者工具:除了常見的 Logger 和 Debugger 工具,Xiaomi Vela 還提供 Emulator 工具來幫助開發者提升調試效率,使用 Emulator,開發者可以利用 PC 端豐富的調試工具和調試信息,降低嵌入式系統開發和調試的難度。
1.3.1 小米澎湃OS
看架構圖,澎湃OS是一個大OS的概念,涵蓋硬件上的所有軟件。
小米澎湃OS的底層核心系統由Linux和自研Xiaomi Vela融合而成,異構兼容性與系統資源管理能力可以讓每一臺設備都能發揮最佳性能。
小米Vela是基于開源嵌入式操作系統 NuttX 打造的物聯網軟件系統平臺,目前已運作于小米多款智能家居產品之上。也就是說,小米澎湃OS搭建于安卓開源與小米物聯網平臺基礎之上,保留安卓生態與海外市場,同時爭取留存盡可能多的小米生態用戶群體。
小米將安卓的服務框架和自研Vela系統的服務框架都作為“中間件”納入其中。同時全新打造八大子系統,其中全新的AI子系統融合大模型能力成為整個系統的“智能大腦”,不僅可以讓單設備實現極強的端側AI能力,同時賦予整個生態智能能力。
最上層HyperConnect 跨端層打破了硬件設備的隔閡,讓所有設備可以統一連接協議,并且實時通信,最終構建“人車家全生態”的智能世界。另外,此次小米打造了貫穿內核層、服務框架層、跨端層的全端安全系統, 尤其在內核層啟用了完全獨立的“自研微內核安全系統”,保障了安全從最底層實現。
澎湃 OS 最重要的五大特性:
澎湃OS以底層重構覆蓋人車加全生態豐富多樣的硬件設備;
基于自研的先進跨端互聯框架,讓設備高效連接;
擁有AI 框架,在AI大模型的全面加持下,給系統應用帶來了更好的表現,
同時搭載 Hyperman 的這個設備互聯的思考中樞,
邁向主動智能時代。
用小米澎湃OS去對標華為鴻蒙系統,兩個系統目的類似,但做法不一樣。小米主要基于安卓系統基礎上重寫底層,再加入嵌入式系統的兼容,其本質內核沒有變,但由于重寫了底層,在以后其他產品進行系統配對或系統間互動的時候,會更加平滑。
因此,小米要建一個小米生態世界,這個OS勢在必行。而小米下一個要開發的場景就是車,車機交互、人機交互、人才交互,緊密關系到用戶的實際體驗,所以重構的操作系統對于未來小米提升自身產品使用體驗具有重大意義。
國內其他廠商也在做同樣類似的事情,在硬件同質化越來越嚴重的情況下,需要通過做好軟件去提升人際交互和用戶體驗。一個能擁有自主開發的操作系統更便于做深度定制或者差異化定制,也可以為未來導入人工智能相關打開更好的通道。
小米汽車有兩個獨特的競爭優勢:第一是與既有生態整合,包括操作系統、應用程式、手機與IoT等硬件;第二是銷售渠道遍及海外市場。
1.3.2 鴻蒙與Vela的異同
IoT領域迫切需要一個統一的物聯網操作系統,比ucosIII、freeRTOS更高級,比linux更輕量級。能提提供豐富組件,豐富的生態,便捷的使用,解決碎片化問題。在這方面 Xiaomi Vela和開源鴻蒙系統都在發力,比如OpenHarmony。OpenHarmony LiteOS-A內核是基于Huawei LiteOS內核演進發展的新一代內核,Huawei LiteOS是面向IoT領域構建的輕量級物聯網操作系統。在IoT產業高速發展的潮流中,OpenHarmony LiteOS-A內核能夠帶給用戶小體積、低功耗、高性能的體驗以及統一開放的生態系統能力,新增了豐富的內核機制、更加全面的POSIX標準接口以及統一驅動框架HDF(OpenHarmony Driver Foundation)等,為設備廠商提供了更統一的接入方式,為OpenHarmony的應用開發者提供了更友好的開發體驗。
在物聯網時代,操作系統是最底層基礎的系統架構,很多上層應用都基于操作系統才能布局生態。就在小米對外正式發布自家物聯網操作系統Xiaomi Vela同一天,華為也舉辦了一場新品發布會,發布了15款智選新品,這是華為的物聯網操作系統鴻蒙OS首次應用在華為智選生態產品上。而在小米官方對Vela介紹中,Xiaomi Vela對標的其實是華為LiteOS。然而,隨著LiteOS融入鴻蒙OS,Xiaomi Vela終將要面對的仍然是鴻蒙OS。無論是鴻蒙還是Xiaomi Vela,都是為了打通物聯網最基礎的聯通、協同相關功能。
但兩者仍然略有差異:在戰略層面:鴻蒙OS發布之初,華為官方對標的是安卓系統比;Xiaomi Vela則更傾向于認為是與Linux、安卓等高價操作系統是互補共生關系。在應用層面:鴻蒙搭載的范圍更廣,覆蓋到了內存配置比較大的領域,搭載華為鴻蒙OS的第一款產品是榮耀智慧屏;Xiaomi Vela更注重低功耗和輕量級的應用場景,其目標應用是智能家居、可穿戴設備等算力受限設備,而非手機、智能電視等。逐步完善的物聯網生態版圖
2. 代碼下載編譯運行
2.1 代碼運行
環境搭建:
sudo apt install bison flex gettext texinfo libncurses5-dev libncursesw5-dev gperf automake libtool pkg-config build-essential gperf genromfs libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux apt install kconfig-frontends apt install gcc-arm-none-eabi binutils-arm-none-eabi
代碼下載:
mkdir nuttx_project cd nuttx_project git clone https://github.com/apache/nuttx.git nuttx git clone https://github.com/apache/nuttx-apps apps
代碼編譯:
cd nuttx ./tools/configure.sh -L | less 查看支持板卡 ./tools/configure.sh -l sim:nsh 選擇一個板卡,例如sim:nsh make menuconfig 配置Kconfig文件 make
編譯后代碼根目錄有nuttx目標文件,執行后自動運行
./nuttx
nut shell 終端如下:
退出shell輸入poweroff,或者另一個終端輸入pkill nuttx
默認用戶名:admin
默認密碼:Administrator
或者使用make menuconfig去掉登錄密碼
2.2 目錄結構:
nuttx/arch:該目錄包含多個子目錄,每個子目錄包含特定于體系結構的邏輯。將 NuttX 移植到新處理器的任務包括在arch/ 包含特定于新架構的邏輯下添加一個新的子目錄。
nuttx/binfmt:binfmt/子目錄包含將文件系統中的二進制文件以可用于執行它們的形式加載到內存中的邏輯。
nuttx/audio:audio/子目錄包含 NuttX 音頻子系統
nuttx/boards:boards/子目錄包含每個板的自定義邏輯和板配置數據。board板特定配置子目錄 < boards/arch-name> / //configs 如:boards/arm/stm32/nucleo-f103rb/configs
nuttx/crypto:crypto子目錄包含 NuttX 加密子系統。
nuttx/drivers:crypto子目錄包含與體系結構無關的設備驅動程序。
nuttx/fs:fs子該目錄包含 NuttX 文件系統。
nuttx/graphics:graphics子目錄包含 NuttX 下的圖形/視頻支持文件。
nuttx/include:目錄包含 NuttX 頭文件。
nuttx:這幾乎是一個空的目錄,用于存放生成的靜態庫。
nuttx/libs/libc:目錄包含一組標準的類 libc 函數,帶有 NuttX 的自定義接口。
nuttx/mm:這是 NuttX 內存管理器。
nuttx/net:該目錄包含 NuttX 網絡層的實現,包括內部套接字 API。
nuttx/sched:構成 NuttX RTOS 核心的文件位于此處。
nuttx/syscall:該目錄包含一個系統調用接口,可用于用戶模式應用程序和內核模式 RTOS 之間的通信。
nuttx/tools:該目錄包含一組工具和腳本,用于簡化配置、構建和維護 NuttX。
nuttx/wireless:該目錄包含對獨立于硬件的無線支持的支持。
nuttx/Makefile:Makefile目錄中的頂層$(TOPDIR)包含構建 NuttX 的所有頂層控制邏輯。
3. 啟動流程分析
在NuttX內存布局中,KROM和UROM分別存放著內核啟動和NSH啟動的程序,啟動流程如下圖所示,下面對啟動流程進行簡要介紹。
在KROM中內核啟動流程是:
硬件初始化
_start是內核啟動的入口點,處理器將從這里開始執行內核啟動的第一條指令
初始化棧指針和中斷向量表,將中斷模式設置為CLIC Direct模式。在Direct中斷模式下,BASE被要求必須是64字節對齊,且所有的異常和中斷將會跳轉trap中斷處理函數進行中斷處理,中斷處理函數地址保存在mtvec寄存器中,中斷處理流程如下圖6-3所示:
搬移data段,清空BSS段,進行clock配置;完成uart的前期初始化,這里只進行了uart設備初始化,沒有做驅動初始化,目的是實現控制臺信息打印功能。
系統級初始化
根據用戶鏡像中的信息進行應用程序空間中data和BSS段的搬移和初始化工作,使用PMP設置地址空間訪問權限
NuttX系統的初始化,主要有內核list初始化、idle tcb初始化、信號量初始化、內存堆初始化、task子系統初始化、fs子系統初始化、watchdog初始化、clock子系統初始化等
堆地址初始化:用戶空間堆初始化和內核空間堆初始化
設置初始環境變量并啟動init程序
根據系統配置找到應用程序入口點,并啟動應用程序。
經過上面步驟已實現硬件環境初始化和NuttX系統初始化,下面將啟動應用程序。應用程序放置在UROM地址空間中,總的來說獲取應用程序入口點有三種方式:第一種通過宏直接設置入口點地址;第二種從用戶空間結構體中獲取入口點;最后一種則從文件系統中獲取init程序并動態載入后跳轉。獲取應用程序入口通過menuconfig進行配置。三種方式都可實現應用程序的加載,但第二種實現方式還具有其他優點,它可將用戶空間結構體以符號的形式傳遞給拓展ELF固件,因此我們選擇第二種應用程序加載方式。這里簡要介紹如何選擇第二種加載方式即如何加載應用程序:
在menuconfig中選擇CONFIG_INIT_ENTRYPOINT(應用程序入口點配置項) 和 CONFIG_BUILD_PROTECTED(指定從用戶空間結構體中獲取應用程序入口點)這兩個宏,可以指定以第二種方式加載應用程序。
用戶空間結構體在鏈接時會被工具鏈放在用戶鏡像的text段首地址
NuttX啟動應用程序過程中,將用戶空間結構體作為參數傳遞給任務創建函數,如此可根據應用程序入口點創建應用程序任務
上面提到用戶鏡像中包含NSH和內嵌的應用。NSH是NuttX提供一個小型的、可伸縮的、類似bash的shell命令解析器,具有命令行解析、實時串口輸出、系統掛載等功能,具有豐富的特性集和較小的占用空間,支持腳本啟動、拓展程序動態加載,因此考慮將NSH作為第一個用戶程序。
enum nx_initstate_e { OSINIT_POWERUP = 0, /*上電。尚未執行初始化,取決于.bss的初始化邏輯值。* / OSINIT_BOOT = 1, /*基本啟動初始化完成。操作系統服務和硬件資源還沒有可用。* / OSINIT_TASKLISTS = 2, /*準備運行/分配的任務列表頭有效*/ OSINIT_MEMORY = 3, /*內存管理器已經初始化*/ OSINIT_HARDWARE = 4, /* mcu專用硬件初始化。硬件資源,如定時器和設備驅動程序現已提供。 足夠的底層操作系統服務支持的硬件也有但是操作系統尚未完成其全部初始化。* / OSINIT_OSREADY = 5, /*操作系統已經完全初始化,多任務正在進行活動。* / osinit_idlelloop = 6 /*操作系統進入空閑循環*/ };
可以代碼中添加打印,自己上手調試下:
#include_info("ssss Entry ");
審核編輯:劉清
-
微控制器
+關注
關注
48文章
7542瀏覽量
151316 -
處理器
+關注
關注
68文章
19259瀏覽量
229653 -
USB主機
+關注
關注
0文章
22瀏覽量
9346 -
定時器
+關注
關注
23文章
3246瀏覽量
114720 -
RTOS
+關注
關注
22文章
811瀏覽量
119595
原文標題:Nuttx RTOS入門-簡介及開源代碼運行
文章出處:【微信號:OS與AUTOSAR研究,微信公眾號:OS與AUTOSAR研究】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論