0 引言
傳統(tǒng)的無(wú)人機(jī)數(shù)據(jù)記錄儀僅僅是記錄無(wú)人機(jī)在整個(gè)飛行過(guò)程中各狀態(tài)參數(shù)的機(jī)載電子設(shè)備,大多采用FPGA作為控制器,NAND Flash作為存儲(chǔ)單元,SRAM作為數(shù)據(jù)緩存,以并行的方式完成數(shù)據(jù)的緩存和處理[1-2],雖然也能實(shí)現(xiàn)飛行數(shù)據(jù)的有效存儲(chǔ),但又產(chǎn)生了功耗大和體積大的問(wèn)題。而且FPGA需要外部存儲(chǔ)模塊(如EEPROM或Flash)來(lái)存儲(chǔ)編程文件[2-3],相比于ARM內(nèi)置SRAM和Flash運(yùn)行和存儲(chǔ)編程文件,這無(wú)疑增加了外圍電路的復(fù)雜性。此外,以NAND Flash作為大容量存儲(chǔ)設(shè)備,就必須設(shè)計(jì)相應(yīng)的壞塊管理算法和擦寫(xiě)平衡算法,在實(shí)際存儲(chǔ)過(guò)程中進(jìn)行實(shí)時(shí)ECC校驗(yàn),并實(shí)時(shí)維護(hù)一個(gè)NAND Flash壞塊表,以防把數(shù)據(jù)寫(xiě)入壞塊造成無(wú)法讀出[4-5],大大降低了系統(tǒng)的存儲(chǔ)效率。
日新月異的無(wú)人機(jī)應(yīng)用場(chǎng)合要求數(shù)據(jù)記錄儀不僅要記錄飛行器的飛行狀態(tài),還要記錄各種任務(wù)設(shè)備的指令、數(shù)據(jù)和工作信息以便離線使用,功能舉例如下:
(1)存儲(chǔ)差分GPS基站和移動(dòng)站的原始星歷數(shù)據(jù)做后差分解算,提高航測(cè)作業(yè)的位置解算精度;
(2)在靜止時(shí)和飛行時(shí)存儲(chǔ)導(dǎo)航傳感器的所有高頻原始數(shù)據(jù),進(jìn)行離線噪聲建模,優(yōu)化濾波模型;
(3)在地面和機(jī)上分別記錄數(shù)據(jù)鏈上行和下行的指令和數(shù)據(jù),離線分析鏈路可靠性。
除此之外還有諸多功能等待開(kāi)發(fā)和挖掘,但這些功能都要求數(shù)據(jù)的存儲(chǔ)必須滿(mǎn)足實(shí)時(shí)、可靠、低功耗、小型化和易存取等特點(diǎn)。本文結(jié)合無(wú)人機(jī)領(lǐng)域的實(shí)際應(yīng)用需求,設(shè)計(jì)了一種基于嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread的數(shù)據(jù)記錄儀。
1 功能模塊選型
為滿(mǎn)足實(shí)時(shí)、可靠、低功耗、小型化、低成本和易存取的無(wú)人機(jī)數(shù)據(jù)記錄儀設(shè)計(jì)需求,從低功耗、小型化和低成本的角度考慮,ARM微處理器必然是最優(yōu)選擇;從滿(mǎn)足實(shí)時(shí)性和高可靠的角度考慮,在硬件平臺(tái)上移植嵌入式實(shí)時(shí)操作系統(tǒng),通過(guò)線程的時(shí)間片輪轉(zhuǎn)來(lái)保證無(wú)疑是最優(yōu)選擇;從易存取的角度考慮,使用SD卡作為存儲(chǔ)介質(zhì)能夠避免系統(tǒng)將CPU資源浪費(fèi)在擦寫(xiě)平衡和ECC校驗(yàn)等環(huán)節(jié),使用USB進(jìn)行數(shù)據(jù)讀取能提高數(shù)據(jù)讀取效率。
本文所設(shè)計(jì)的無(wú)人機(jī)數(shù)據(jù)記錄儀使用的硬件嵌入式平臺(tái)為STM32F4系列微處理器,使用該微處理器的SDIO模塊讀寫(xiě)SD卡,接收、緩沖并存儲(chǔ)多路串口的輸入數(shù)據(jù),USB模塊讀取存儲(chǔ)的數(shù)據(jù),并移植了嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread進(jìn)行線程調(diào)度和文件系統(tǒng)支持,主體架構(gòu)如圖1所示。
RT-Thread相較于?滋C/OS-III和FreeRTOS等嵌入式實(shí)時(shí)操作系統(tǒng)有很多優(yōu)點(diǎn):首先是開(kāi)源的,且符合POSIX規(guī)范,穩(wěn)定性高;支持Fatfs文件系統(tǒng),采用多級(jí)目錄結(jié)構(gòu),能夠?qū)Σ煌?lèi)型、不同來(lái)源和不同用途的無(wú)人機(jī)數(shù)據(jù)進(jìn)行更科學(xué)化的文件管理,且能夠與PC端實(shí)現(xiàn)文件互傳,便于數(shù)據(jù)導(dǎo)出;采用基于優(yōu)先級(jí)的全搶占式多線程調(diào)度算法和基于時(shí)間片的輪轉(zhuǎn)調(diào)度算法,使用內(nèi)核對(duì)象(包括信號(hào)量、互斥量等)進(jìn)行線程同步,極大地優(yōu)化了線程的執(zhí)行和調(diào)度效率,提升了微處理器的數(shù)據(jù)存取性能,在此基礎(chǔ)上進(jìn)行有效的硬件驅(qū)動(dòng)開(kāi)發(fā)和應(yīng)用程序開(kāi)發(fā)就能夠滿(mǎn)足無(wú)人機(jī)行業(yè)對(duì)數(shù)據(jù)存取的要求。
2 硬件驅(qū)動(dòng)開(kāi)發(fā)
硬件驅(qū)動(dòng)的開(kāi)發(fā)主要為3部分,包括在嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread的架構(gòu)上進(jìn)行串口模塊、SDIO模塊和USB模塊的驅(qū)動(dòng)開(kāi)發(fā)。RT-Thread為這些模塊定義了中間層框架,這個(gè)框架向上和向下各提供一個(gè)接口,向下是底層驅(qū)動(dòng)對(duì)硬件的接口,這個(gè)接口完成對(duì)硬件模塊的控制并從硬件獲得數(shù)據(jù),向上是與應(yīng)用程序交互的接口,通過(guò)這個(gè)中間層框架,應(yīng)用程序就可以通過(guò)統(tǒng)一的接口訪問(wèn)底層硬件,即使硬件有所改動(dòng)上層代碼幾乎不用改動(dòng),提高了系統(tǒng)的移植性[6]。
串口驅(qū)動(dòng)主要包括串口的初始化程序以及中斷接收程序,以實(shí)現(xiàn)對(duì)外部輸入數(shù)據(jù)的快速響應(yīng)。SDIO驅(qū)動(dòng)主要包括SD卡的初始化程序、SD卡的產(chǎn)品信息讀取函數(shù)和SD卡讀寫(xiě)函數(shù),用來(lái)實(shí)現(xiàn)對(duì)SD卡的功能配置,還需要在SD卡上運(yùn)行Fatfs文件系統(tǒng),以文件系統(tǒng)的組織形式進(jìn)行串口數(shù)據(jù)的快速存儲(chǔ)。USB驅(qū)動(dòng)用于實(shí)現(xiàn)PC對(duì)SD卡中存儲(chǔ)數(shù)據(jù)的拷貝,以便在PC上進(jìn)行處理和分析,這就需要開(kāi)發(fā)USB的大容量存儲(chǔ)設(shè)備驅(qū)動(dòng)[7],而USB主要通過(guò)描述符(descriptor)進(jìn)行接口描述,本文按照如下結(jié)構(gòu)配置描述符[8]:一個(gè)設(shè)備描述符,采用USB2.0協(xié)議,并支持一個(gè)配置描述符;一個(gè)配置描述符,包含一個(gè)接口描述符;一個(gè)接口描述符,接口設(shè)備類(lèi)為Mass Storage類(lèi),下設(shè)兩個(gè)端點(diǎn);兩個(gè)端點(diǎn)描述符,一個(gè)IN端點(diǎn)和一個(gè)OUT端點(diǎn)負(fù)責(zé)數(shù)據(jù)接收和發(fā)送,并都采用塊傳輸形式,最大傳輸數(shù)據(jù)包長(zhǎng)度為64 B。描述符配置完畢后,USB就可以響應(yīng)大容量存儲(chǔ)的各類(lèi)設(shè)備請(qǐng)求并按照標(biāo)準(zhǔn)的USB2.0協(xié)議進(jìn)行數(shù)據(jù)傳輸了。
最后將這3個(gè)模塊的底層驅(qū)動(dòng)與RT-Thread中間層框架實(shí)現(xiàn)對(duì)接,就可以通過(guò)調(diào)用RT-Thread應(yīng)用層的標(biāo)準(zhǔn)設(shè)備接口進(jìn)行應(yīng)用程序開(kāi)發(fā)了。
3 多線程數(shù)據(jù)緩沖存儲(chǔ)策略
在多通道數(shù)據(jù)量大且復(fù)雜度高的應(yīng)用場(chǎng)合,如果把非周期字節(jié)流的接收和存儲(chǔ)放在一個(gè)線程里去執(zhí)行,難免會(huì)引發(fā)存儲(chǔ)設(shè)備的頻繁寫(xiě)入,大容量存儲(chǔ)設(shè)備大多以塊而非字節(jié)為最小寫(xiě)入單位,一次只寫(xiě)入幾個(gè)字節(jié)與寫(xiě)入整塊的時(shí)間相同,一次只寫(xiě)入幾個(gè)字節(jié)必然造成CPU資源的浪費(fèi),而存儲(chǔ)設(shè)備的讀取和寫(xiě)入往往是線程中最耗時(shí)的環(huán)節(jié),這樣勢(shì)必會(huì)降低整體系統(tǒng)的存儲(chǔ)效率。如果恰巧在線程執(zhí)行過(guò)程中有新的數(shù)據(jù)到來(lái),CPU就無(wú)法及時(shí)響應(yīng),勢(shì)必會(huì)影響實(shí)時(shí)性,造成數(shù)據(jù)損失。
為保證數(shù)據(jù)存儲(chǔ)的完整和可靠,且不過(guò)多占用CPU資源影響其他線程調(diào)度,本文創(chuàng)新地提出了多線程數(shù)據(jù)緩沖技術(shù),遵循“先接收后緩沖再存儲(chǔ)”的原則,即設(shè)計(jì)3個(gè)線程分別接收數(shù)據(jù)、緩沖數(shù)據(jù)和存儲(chǔ)數(shù)據(jù),并合理分配CPU資源,讓接收線程處理的數(shù)據(jù)最少,緩沖線程處理的數(shù)據(jù)適中,存儲(chǔ)線程處理的數(shù)據(jù)最多。根據(jù)LIU C L和LAYLAND J在文獻(xiàn)[9]中提出并證明的結(jié)論,在實(shí)時(shí)操作系統(tǒng)中,單調(diào)速率調(diào)度(RMS)算法的線程設(shè)置必須滿(mǎn)足周期越短,優(yōu)先級(jí)越高的規(guī)律,因此上述3個(gè)線程的優(yōu)先級(jí)設(shè)置應(yīng)滿(mǎn)足“執(zhí)行周期遞增,優(yōu)先級(jí)遞減”的原則,具體線程設(shè)計(jì)思路如圖2所示。
在實(shí)際數(shù)據(jù)到來(lái)后,處于最高優(yōu)先級(jí)的接收線程可以快速響應(yīng)并將接收到的字節(jié)流及時(shí)寫(xiě)入一級(jí)緩沖區(qū),一級(jí)緩沖區(qū)的大小可以設(shè)置為256 B左右,一級(jí)緩沖區(qū)存滿(mǎn)后則通知緩沖線程執(zhí)行;處于中等優(yōu)先級(jí)的緩沖線程啟動(dòng)后就迅速把一級(jí)緩沖區(qū)的數(shù)據(jù)拷貝到二級(jí)緩沖區(qū)中,并將一級(jí)緩沖區(qū)清零,數(shù)據(jù)指針復(fù)位,使其不影響下一次接收任務(wù)的正常寫(xiě)入,二級(jí)緩沖區(qū)的大小可以設(shè)置為2 048 B左右,必須顯著大于一級(jí)緩沖區(qū)的大小,二級(jí)緩沖區(qū)存滿(mǎn)后則通知存儲(chǔ)線程執(zhí)行;處于低優(yōu)先級(jí)的存儲(chǔ)線程啟動(dòng)后就迅速把二級(jí)緩沖區(qū)中的數(shù)據(jù)拷貝到三級(jí)緩沖區(qū)中,并將二級(jí)緩沖區(qū)清零,數(shù)據(jù)指針復(fù)位,使其不影響下一次二級(jí)緩沖區(qū)的正常寫(xiě)入,三級(jí)緩沖區(qū)設(shè)置成一個(gè)隊(duì)列結(jié)構(gòu),從二級(jí)緩沖區(qū)拷貝過(guò)來(lái)的數(shù)據(jù)就按照隊(duì)列依次寫(xiě)入三級(jí)緩沖區(qū),由于SD卡一次最小寫(xiě)入單位是512 B,為提高對(duì)存儲(chǔ)設(shè)備的寫(xiě)入效率,就必須嚴(yán)格控制寫(xiě)入SD卡的字節(jié)數(shù)為512的整數(shù)倍,寫(xiě)入SD卡完成后再將剩余數(shù)據(jù)的指針移到三級(jí)緩沖區(qū)的開(kāi)頭,并將下一次移進(jìn)來(lái)的數(shù)據(jù)放在這些數(shù)據(jù)的末尾,保證下一次寫(xiě)入數(shù)據(jù)的正確性和高效率,而且每個(gè)線程執(zhí)行完成后都同步計(jì)算至下次觸發(fā)的超時(shí)時(shí)間,保證緩沖區(qū)的數(shù)據(jù)即使不滿(mǎn)也能通過(guò)觸發(fā)超時(shí)逐步轉(zhuǎn)存最后寫(xiě)入SD卡,程序執(zhí)行流程如圖3所示。
通過(guò)以上3個(gè)線程和三級(jí)緩沖區(qū)對(duì)數(shù)據(jù)進(jìn)行處理后,相較于使用一個(gè)單一線程進(jìn)行數(shù)據(jù)接收和存儲(chǔ),完全避免了數(shù)據(jù)丟失問(wèn)題和SD卡頻繁寫(xiě)入的資源浪費(fèi)問(wèn)題,拆分后串口3個(gè)線程的CPU時(shí)間片輪轉(zhuǎn)過(guò)程如圖4所示。
從操作系統(tǒng)多線程調(diào)度的時(shí)間片輪轉(zhuǎn)來(lái)看[10],接收線程處理的數(shù)據(jù)量最小,其占用的CPU時(shí)間片也很少,即使在緩沖線程和存儲(chǔ)線程的執(zhí)行過(guò)程中有數(shù)據(jù)輸入,接收線程也可以搶占較低優(yōu)先級(jí)的緩沖線程和存儲(chǔ)線程得以執(zhí)行,保證不丟失任何輸入數(shù)據(jù)。而且由于接收線程執(zhí)行時(shí)間短,執(zhí)行完畢后緩沖線程和存儲(chǔ)線程也能從之前被搶占的地方繼續(xù)執(zhí)行,將數(shù)據(jù)流匯聚成數(shù)據(jù)塊再進(jìn)行寫(xiě)入,顯著提高數(shù)據(jù)的存儲(chǔ)效率,降低SD卡讀寫(xiě)的耗時(shí)。
4 系統(tǒng)性能測(cè)試
為驗(yàn)證軟硬件設(shè)計(jì)的正確性和高效性,接下來(lái)進(jìn)行了小批量試制,系統(tǒng)實(shí)物如圖5所示,并在試制完成的數(shù)據(jù)記錄儀上進(jìn)行系統(tǒng)性能測(cè)試。
擬定如下測(cè)試方案:連接PC和數(shù)據(jù)記錄儀,通過(guò)上位機(jī)軟件向數(shù)據(jù)記錄儀的3個(gè)串口同時(shí)以115 200的波特率發(fā)送不同數(shù)據(jù),頻率均為10 Hz,數(shù)據(jù)量均為1 000 B/次,模仿無(wú)人機(jī)應(yīng)用中的高頻次連續(xù)數(shù)據(jù),分別以單線程接收存儲(chǔ)和多線程數(shù)據(jù)緩沖存儲(chǔ)兩種方法進(jìn)行測(cè)試,在數(shù)據(jù)記錄儀進(jìn)行數(shù)據(jù)存儲(chǔ)的同時(shí)PC上也通過(guò)上位機(jī)軟件進(jìn)行發(fā)送數(shù)據(jù)的同步存儲(chǔ),連續(xù)不間斷工作24小時(shí)進(jìn)行壓力測(cè)試,完成后通過(guò)USB口將數(shù)據(jù)記錄儀存儲(chǔ)的3個(gè)不同文件拷貝到PC上,以上位機(jī)存儲(chǔ)的發(fā)送數(shù)據(jù)為基準(zhǔn),計(jì)算兩種方法的數(shù)據(jù)存儲(chǔ)率、CPU實(shí)際占用率和SD卡讀寫(xiě)次數(shù),結(jié)果如圖6所示。
通過(guò)這個(gè)測(cè)試方案不僅驗(yàn)證了整個(gè)系統(tǒng)軟硬件設(shè)計(jì)的可靠性,還對(duì)單線程存儲(chǔ)策略和多線程數(shù)據(jù)緩沖存儲(chǔ)策略進(jìn)行了對(duì)比。測(cè)試結(jié)果表明,多線程數(shù)據(jù)緩沖存儲(chǔ)策略因?yàn)樵黾恿司€程的調(diào)度,雖然增加了CPU的實(shí)際占用率,但這與其帶來(lái)的數(shù)據(jù)存儲(chǔ)率的顯著提升相比是微不足道的,而且這種方式大幅降低了存儲(chǔ)設(shè)備同等數(shù)據(jù)量下的讀寫(xiě)頻次,延長(zhǎng)了存儲(chǔ)設(shè)備的使用壽命,明顯優(yōu)于單線程存儲(chǔ)策略,且在長(zhǎng)時(shí)間、大數(shù)據(jù)輸入壓力測(cè)試的情況下仍能維持很好的數(shù)據(jù)存儲(chǔ)性能,數(shù)據(jù)存儲(chǔ)率為100%,達(dá)到了設(shè)計(jì)的預(yù)期效果。最后進(jìn)行實(shí)際應(yīng)用測(cè)試,準(zhǔn)備兩個(gè)數(shù)據(jù)記錄儀,將一個(gè)數(shù)據(jù)記錄儀安裝在小型四旋翼無(wú)人機(jī)上,存儲(chǔ)無(wú)人機(jī)飛行數(shù)據(jù)和差分GPS移動(dòng)站接收機(jī)的后差分?jǐn)?shù)據(jù),另一個(gè)在地面存儲(chǔ)差分GPS基站接收機(jī)的后差分?jǐn)?shù)據(jù),進(jìn)行實(shí)際多頻次高強(qiáng)度飛行后利用第三方軟件進(jìn)行后差分解算。經(jīng)測(cè)試,數(shù)據(jù)均無(wú)丟包,工作均正常,能夠滿(mǎn)足高強(qiáng)度飛行任務(wù)的需要。
5 結(jié)論
本文以實(shí)際無(wú)人機(jī)行業(yè)應(yīng)用為牽引,設(shè)計(jì)了一款基于RT-Thread的實(shí)時(shí)、可靠、低功耗、小型化和易存取的無(wú)人機(jī)數(shù)據(jù)記錄儀,通過(guò)多線程數(shù)據(jù)緩沖存儲(chǔ)策略實(shí)現(xiàn)了大量連續(xù)數(shù)據(jù)輸入條件下的高效率、高可靠存儲(chǔ),并能通過(guò)USB連接線將存儲(chǔ)的數(shù)據(jù)快速導(dǎo)出到PC中進(jìn)行事后分析,能夠滿(mǎn)足日益復(fù)雜的無(wú)人機(jī)行業(yè)應(yīng)用對(duì)數(shù)據(jù)記錄儀的要求。另外,多線程和多級(jí)緩沖區(qū)的數(shù)據(jù)處理模式不僅局限于嵌入式領(lǐng)域,對(duì)于需要多通道數(shù)據(jù)處理的個(gè)人計(jì)算機(jī)和服務(wù)器軟件開(kāi)發(fā)也有一定的借鑒作用。
-
無(wú)人機(jī)
+關(guān)注
關(guān)注
230文章
10515瀏覽量
182194 -
數(shù)據(jù)記錄儀
+關(guān)注
關(guān)注
0文章
134瀏覽量
13390
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論