跨界 · 融合 · 服務 · 創新
基于uC/OS-II操作系統的無人機飛控系統軟件設計
史峰,何立明,馬曉峰,史中正
摘要:針對以往飛控系統軟件中代碼多,可靠性、實時性差,不具通用性等缺點,采用uC/OS-II操作系統設計無人機飛控軟件,利用操作系統來進行軟件中各任務的實時調度和通信。通過地面測試和空中試驗表明:該軟件系統具有可靠性高、實時性強等優點, 滿足飛控系統軟件設計要求。
關鍵詞:飛控系統; uC/OS-II;優先級劃分;調度與通信
0、引言
無人機飛行控制系統是一個復雜的多任務系統, 要求不僅能夠與地面控制站雙向通信、采集傳感器數據、進行飛控/導航計算、驅動執行機構等, 還要求可靠性高、實時性強。傳統的飛控系統軟件大多按預先設定的順序循環執行, 具有代碼多,可靠性、實時性差, 不具備通用性等缺點。
針對以上缺點,本文采用uC/OS-II操作系統開發無人機飛控軟件, 將復雜的處理任務交給操作系統進行實時調度,滿足無人機飛控系統實時、多任務的要求。
1、無人機飛控系統軟件總體設計
飛控系統軟件設計基本要求是:1)具有采集功能:能夠采集傳感器的值, 控制信號值和舵機當前狀態值;2)具有姿態解算功能:解算出當前無人機的姿態值;3)具有控制率計算功能:根據不同任務解算不同控制信號, 實現無人機自主導航;4)具有串口通信功能:接收GPS信息, 通過SD卡存儲信息, 與地面控制站進行信息交換;5)其他要求:具有遙控飛行、自動飛行2種飛行模式的切換功能, 具有系統自檢和墜毀監控等功能。
整個系統的軟件流程圖如圖1所示:
圖1 飛控系統軟件流程圖
2、基于uC /OS-II操作系統的飛控軟件設計
2.1 uC/OS-II操作系統簡介 uC/OS-II是目前世界上最小的操作系統內核軟件,它由Labrosse JJ于1992年推出。具有內核小、實時性強、穩定性高、任務切換快、可移植性好等優點,現已被眾多的研究者作為操作系統的樣板移植到各種硬件平臺上。
2.2 任務劃分和優先級確定首先, 對飛控軟件進行任務劃分,將飛控系統軟件進行分解,形成相對獨立的程序模塊或功能函數,并將它們設置為操作系統下的任務,同時確定每個任務的優先級。
根據飛控系統軟件流程圖, 將軟件分為4個模塊來設計,即系統初始化模塊、主控模塊、數據存儲模塊、通信模塊,每個模塊對應一個優先級不同的任務。其中, 主控模塊又包括數據采集、控制運算、控制率輸出3個子模塊。(1)初始化模塊的功能是開機自檢;(2)主控模塊:采集模塊的功能是通過串口和A/D轉換采集傳感器和GPS的值和地面站傳輸的上行指令;運算模塊的功能是進行姿態解算和控制率計算;輸出模塊的功能是把控制率輸出到驅動舵機;(3)數據存儲模塊的功能是將采集和控制計算的數據存儲到SD卡中;(4)數據通信模塊的功能是將采集和控制計算的數據通過數據鏈傳輸到地面控制臺。
根據系統的功能要求,將軟件分成4個優先級不同的任務:第一個任務是初始化任務TaskIint( ) , 由初始化模塊構成,該模塊的主要功能是系統自檢。這是整個程序中優先級最高的任務,優先級定義為1,系統一上電就執行這個任務;第二個任務是TaskWork( ),這個任務的優先級僅次于TaskIint( )任務,優先級定義為2,此任務由主控模塊構成,是一個實時性較強的任務。這個任務是一個無限的循環, 執行周期為20ms;第三個任務是TaskDataMemory( ),由數據存儲模塊構成,這個任務是優先級較低的任務,優先級定義為3;第四個任務是TaskDataTransfer( ),由數據通信模塊構成,是程序中優先級最低的任務,優先級定義為4。
2.3 任務的調度與通信任務建立完成后,要能夠協調地工作、完成系統功能,需要對任務進行調度和通信。任務間的調度是指內核決定多任務中該輪到哪個任務的運行。uC/OS-II操作系統中的任務狀態分為睡眠態任務、就緒態任務、等待狀態任務、運行態任務和被中斷的任務5個狀態, uC/OS-II是基于優先級調度法的可剝奪型內核,即是指CPU總是讓處于就緒態的、優先級最高的任務先運行。
任務間的通信是指任務間或中斷服務與任務間的信息傳遞。任務間的通信方式有信號量管理、互斥型信號量管理、事件標志組管理、消息郵箱管理、消息隊列管理和內存管理。本文采用消息郵箱管理,典型的消息信箱也稱作交換消息,使用一個指針型變量, 通過內核服務,一個任務或一個中斷服務子程序通過內核服務可以將一則消息放到郵箱里去。同樣, 一個或多個任務通過內核服務, 可以接收這則消息。當任務接到消息之后, 狀態變為就緒態任務,等到其優先級變為最高時執行該任務。
本系統中定義的4個任務的調度和通信是這樣實現的:系統上電后執行的第一個任務TaskIint( ) ,所以,在初始化任務執行完成并返回正常的情況下,利用uC/OS-II的OSTaskDel( ) 函數將這個任務返回并處于休眠狀態。此時,TaskWork( )成為優先級最高的任務,將會一直執行。由于程序運行本身并不占用太多時間,所以,使用OSTimeDly( )函數進行延時20ms,即任務TaskWork( ) 將自己掛起20ms,將CPU的控制權交給其他任務。任務TaskDataMemory( )的運行周期為120ms,即當任務TaskWork( )執行6次后,向任務TaskDataMemory( )發送一次消息, 消息中包含需要存儲的數據,任務TaskDataMemory ( ) 接收到消息后,等到任務TaskWork( )將自己掛起時執行。任務TaskDataTransfer( )的運行周期為1s,當任務TaskWork( )執行50次后, 向任務TaskDataTransfer( )發送一次消息, 消息中包含需要向地面站發送的數據, 任務TaskDataMemory( ) 接收到消息后,等到任務TaskWork ( ) 將自己掛起時執行。因為任務TaskDataMemory ( ) 和TaskDataTransfer ( ) 運行時間很短,在TaskWork( ) 掛起20ms中執行完畢,不會出現運行過程中被高優先級任務搶奪CPU控制權的現象。主函數偽代碼如下: