要想最大限度地發(fā)揮Zynq All Programmable SoC的優(yōu)勢,您需要一款操作系統(tǒng)。本文將介紹如何安裝實時操作系統(tǒng)——這里特指μC/OS-III。
要想從最大限度地發(fā)揮賽靈思Zynq?-7000 All Programmable SoC處理系統(tǒng)的地優(yōu)勢,采用操作系統(tǒng)肯定比使用簡單的物理硬件解決方案更加有效。Zynq SoC設(shè)計的開發(fā)人員有很多種操作系統(tǒng)可供選擇,可以根據(jù)最終應(yīng)用選擇實時操作系統(tǒng)。如果您正在多個應(yīng)用領(lǐng)域需要快速響應(yīng)和可靠性能來避免損失或?qū)崿F(xiàn)嚴(yán)格性能目標(biāo)的極具挑戰(zhàn)性的環(huán)境中使用Zynq SoC,那么 RTOS無疑是您的最佳選擇。
我們將利用最流行的實時操作系統(tǒng)之一,Micrium的μC/OS-III來演示如何以最佳方式將RTOS添加到Zynq SoC系統(tǒng)中。RTOS或其早期版本已被用于包括好奇號火星探測器在內(nèi)的多種激動人心的系統(tǒng)中。RTOS的最新版本目前正在進(jìn)行MISRA-C、DO178B A級、SIL3/4和IEC61508標(biāo)準(zhǔn)的認(rèn)證,這意味著它將吸引廣泛Zynq SoC用戶的目光。但是在介紹具體實現(xiàn)方法之前,我們先回顧一下實時操作系統(tǒng)的基本知識,這對此很有幫助。
什么是實時操作系統(tǒng)?
實時操作系統(tǒng)與標(biāo)準(zhǔn)操作系統(tǒng)有什么區(qū)別?實時操作系統(tǒng)是確定的,意思是指系統(tǒng)需要在明確的截止時間內(nèi)做出響應(yīng)。這種確定性很重要,其原因有多種,例如,如果最終應(yīng)用正在監(jiān)控工業(yè)流程,那么必須在特定時段內(nèi)對事件做出響應(yīng),工業(yè)控制系統(tǒng)就屬于這類情況。
可根據(jù)滿足截止時間的能力對RTOS進(jìn)一步分類為三種不同類型的RTOS,每種類型都以不同方式滿足截止時間。在hard RTOS中,錯過截止時間被視為系統(tǒng)錯誤。而對于firm RTOS就不是這樣,偶爾錯過截止時間是可以接受的。在soft RTOS中,錯過一次截止時間會減少結(jié)果的有效性,但系統(tǒng)在整體上對此是可以接受的。
實時操作系統(tǒng)以運行任務(wù)(有時稱為進(jìn)程)為核心,每項任務(wù)執(zhí)行規(guī)定的功能。例如,某個任務(wù)可能通過接口讀取數(shù)據(jù),或?qū)?shù)據(jù)執(zhí)行某種操作。簡單的系統(tǒng)可能只運行一項任務(wù),但更多情況下處理器上會同時運行多項任務(wù)。這些任務(wù)間的轉(zhuǎn)換被稱為“上下文切換”,它要求將與每項任務(wù)關(guān)聯(lián)的處理器狀態(tài)存儲并添加到任務(wù)棧中。
采用分時法,每個任務(wù)都會獲得處理器上的一個專用時間檔,而更高優(yōu)先級的任務(wù)還可分配多個時間檔。
下一步運行哪項任務(wù)將由內(nèi)核來控制。該內(nèi)核是RTOS的核心,用來管理軟件的輸入與輸出請求,并將它們轉(zhuǎn)換為處理器中央處理單元和功能元件能識別的數(shù)據(jù)處理指令。任務(wù)調(diào)度可能比較復(fù)雜,尤其是當(dāng)需要避免死鎖(指兩個或更多任務(wù)相互鎖定)時更是如此。兩種基本調(diào)度方法分別是分時法和事件驅(qū)動法。采用分時法,每項任務(wù)都會獲得處理器上的一個專用時間檔,而更高優(yōu)先級的任務(wù)還可分配多個時間檔。時間分段通過定期中斷或定時器進(jìn)行控制,這種方法通常被稱為 “輪詢調(diào)度”。而采用事件驅(qū)動方案,只有當(dāng)具有更高優(yōu)先級的任務(wù)需要運行時才會進(jìn)行任務(wù)切換。這種方法通常稱為“搶先式調(diào)度”。
死鎖、資源共享和互斥等待
當(dāng)兩個或兩個以上進(jìn)程(例如UART、ADC或DAC)需要使用相同資源時,它們可以同時對該資源提出請求。這種情況下,應(yīng)對訪問進(jìn)行控制以防出現(xiàn)爭用現(xiàn)象。如何對此進(jìn)行管理非常重要,若不采用正確的管理方法,就會出現(xiàn)“死鎖”或“互斥等待”這樣的問題,從而導(dǎo)致系統(tǒng)錯誤。
當(dāng)某個進(jìn)程占用一種資源且無法將其釋放時,就會出現(xiàn)死鎖,因為在這種情況下無法完成該項任務(wù)。該進(jìn)程需要使用當(dāng)前被另一進(jìn)程占用的另一種資源。由于系統(tǒng)無限期地處于這種狀態(tài),因此可以說應(yīng)用程序已被鎖死??梢韵胂螅梨i對于實時操作系統(tǒng)來說是非常不好的。
當(dāng)某個進(jìn)程因為所需要的資源總是被分配給其它進(jìn)程而無法運行時,就會發(fā)生互斥等待。
多年來,已經(jīng)有很多關(guān)于這類主題的文章和資料,也推薦了很多解決方案,對此您可能并不會感到意外,例如Dekker算法,這是一種用于并行程序中互斥問題的經(jīng)典解決方法。處理這類情況的最常用方法是信號量法,通常分為二進(jìn)制信號量和計數(shù)信號量這兩種類型。
通常,為每種資源會分配一個二進(jìn)制信號量。請求進(jìn)程會在任務(wù)執(zhí)行之前等待資源變?yōu)榭捎觅Y源。一旦任務(wù)完成,請求進(jìn)程就會釋放該資源。這些信號量通常被稱為等待(WAIT)和發(fā)信號(SIGNAL)操作。進(jìn)程首先等待信號量。如果資源閑置,進(jìn)程將被賦予該資源的控制權(quán),并運行直到完成,此時進(jìn)程會發(fā)出完成信號。但是,如果進(jìn)程在等待信號量時資源已被占用,那么進(jìn)程將會被暫停直到該資源被釋放為止。當(dāng)前正在執(zhí)行的進(jìn)程一旦完成,暫停狀態(tài)就會立刻終止,但如果具備更高優(yōu)先級的進(jìn)程搶先占用該資源,那么就需要等待更長的時間。通常使用名為互斥鎖(mutexes)的特殊二進(jìn)制信號量來防止優(yōu)先級反轉(zhuǎn)的發(fā)生(mutexes一詞源于“mutual exclusion”)。
計數(shù)信號量的工作方式與二進(jìn)制信號量相同,但是只有當(dāng)特定資源類型有一個以上的實例時才會使用計數(shù)信號量(例如數(shù)據(jù)存儲)。由于每個資源都被分配到一個進(jìn)程中,因此計數(shù)數(shù)值會減少以顯示剩余的可用資源數(shù)量。當(dāng)數(shù)值減至為零時可用資源就沒有了,同時提出請求的進(jìn)程就會被暫停,直到有一種資源被釋放為止。
不同進(jìn)程之間經(jīng)常進(jìn)行通信是很有必要的。有以下幾種方法可供使用,其中最簡單的方法是按如上所訴的方式使用數(shù)據(jù)存儲和信號量。更為復(fù)雜的技術(shù)包括消息隊列。采用消息隊列,當(dāng)一個進(jìn)程需要向另一個進(jìn)程發(fā)送信息時,它會向隊列POST一條消息。當(dāng)一個進(jìn)程需要從隊列中接收消息時,它會PEND隊列。因此,消息隊列的工作原理就像FIFO(先入先出)存儲器一樣。
μC/OS-III操作系統(tǒng)
Micrium的μC/OS-III是一種優(yōu)先式RTOS,意思是指它總是運行已做好執(zhí)行準(zhǔn)備并具有最高優(yōu)先級的任務(wù)。要想將該操作系統(tǒng)添加到您的Zynq SoC系統(tǒng)設(shè)計中,第一步需要從Micrium網(wǎng)站下載μC/OS-III RTOS。下載后,安裝工作非常簡單。您只需要將一些ZIP文件解壓到電腦上賽靈思安裝程序中的正確文件夾(路徑)。
應(yīng)確保將名為Zynq-7000-ucosiii-bsp.zip的ZIP文件解壓到\ \ISE_DS\EDK\ sw\ lib\bsp\文件夾。您會在此文件夾下看到一些其它操作系統(tǒng),包括獨立系統(tǒng)和xilkernel。隨后,如圖1所示,將名為Zynq-7000-ucosiii-demo.zip的ZIP 文件解壓到\\ISE_DS\EDK\sw\lib\sw_apps\文件夾。您會在此文件夾內(nèi)看到一些其它應(yīng)用的演示。
安裝完這兩組文件后,我們就可以在軟件開發(fā)套件(SDK)中創(chuàng)建項目。我們將會使用之前創(chuàng)建的相同基礎(chǔ)硬件,但由于想添加該操作系統(tǒng),因此還需要一個新的應(yīng)用程序和板支持包(BSP)。
在SDK中,應(yīng)關(guān)閉基礎(chǔ)硬件設(shè)計外所有已打開的項目。下一步選擇File > New > Application Project選項,命名新項目并選擇操作系統(tǒng)μC/OS-III(見圖2)。然后選擇用于μC/OS-III的演示程序(見圖3)。
完成后,點擊Finish按鈕。在SDK中將會創(chuàng)建應(yīng)用和板支持包(如選擇該項)。如果您選擇了Auto Build選項,會發(fā)現(xiàn)若干錯誤報告。這是因為并不是所有項目參考都是正確的。要設(shè)定這些項目參考,您需要導(dǎo)入在Project > Src > Settings選項中找到的演示設(shè)置。右擊XML文件并查看屬性。這樣便可選擇并復(fù)制文件位置,如圖4所示。
位置復(fù)制后,右擊項目并選擇屬性。在項目C/C++ General下,選擇Paths和Symbol選項。然后選擇Import Settings,并粘貼到設(shè)置文件的位置。
另外必須確保資源庫能正確指向您之前所添加的庫。您可以通過設(shè)置Xilinx Tools > Repositories對其進(jìn)行檢查;該選項應(yīng)顯示之前μC/OS-III BSP的安裝位置。
由于我們希望用UART輸出演示的狀態(tài)(顯示完成的初始化值和正在運行的任務(wù)),因此您可能需要在BSP設(shè)置下將stdin和stdout設(shè)置到UART。
執(zhí)行完這些工作后,您會發(fā)現(xiàn)目前就可以創(chuàng)建項目了。但是仍存在一些警告,如果您嘗試在硬件上運行該項目,項目并不能如演示那樣執(zhí)行。這是因為存在一個未聲明的函數(shù)警告。在bsp.c文件中加入如下聲明可糾正這個問題。
#include "xil_cache.l
一旦添加“include”頭文件后,項目就可按照預(yù)期構(gòu)建并在ZedBoard上運行,(登陸 ?v=uRB4La5ijrA 觀看YouTube視頻)。
啟動并運行
啟動并運行實例項目后,您大可放心您的系統(tǒng)上肯定正確實現(xiàn)了RTOS。現(xiàn)在,您可繼續(xù)在Zynq SoC上正確實現(xiàn)軟件設(shè)計。一旦您創(chuàng)建了軟件應(yīng)用,并且工程設(shè)計團(tuán)隊也已做好了在硬件上進(jìn)行測試的準(zhǔn)備后,您就可以創(chuàng)建一個編程文件——創(chuàng)建方法與物理硬件系統(tǒng)完全相同(見賽靈思中國通訊雜志第48期中的“如何配置Zynq SoC 物理硬件解決方案”,從而讓采用RTOS的應(yīng)用從配置存儲器中啟動并執(zhí)行。
評論