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