【文章內容簡介】
=NB and De =ZE thenD z=PBOR if e =NB and De =PS then Dz=PMOR if e =NB and De =PB then Dz=ZEOR if e =NS and De =NB thenD z=PMOR if e =NS and De =NS thenD z=PMOR if e =NS and De =ZE then Dz=PMOR if e =NS and De =PS thenD z=ZEOR if e =NS and De =PB then Dz=NSOR if e =ZE and De =NB then Dz=PMOR if e =ZE and De =NS then Dz=PSOR if e =ZE and De =ZE thenD z=ZEOR if e =ZE and De =PS then Dz=NSOR if e =ZE and De =PB then Dz=NMOR if e =PS and De =NB then Dz=PSOR if e =PS and De =NS then Dz=ZEOR if e =PS and De =ZE then Dz=NMOR if e =PS and De =PS then Dz=NMOR if e =PS and De =PB then Dz=NMOR if e =PB and De =NB then Dz=ZEOR if e =PB and De =NS then Dz=NMOR if e =PB and De =ZE thenD z=NBOR if e =PB and De = PS thenD z=NBOR if e =PB and De =PB thenD z=NB下面給出其推理步驟:系統經過采樣測量和AD變換,得到了誤差e和誤差變化率De的精確值,經過模糊化,可得到他們對應的模糊語言值:e=a1,De=a2。對于第一條規(guī)則,則有a1,a2對e,De中語言變量NB和NB的隸屬度:μNB(a1), μNB(a2)從而在第一條規(guī)則產生的強度為:ω1=μNB(a1)∧μNB(a2) 同理,有 ω2=μNB(a1)∧μNS(a2)……根據控制規(guī)則,共可推出25條強度。對第一條語句的推理結果為:Y1*=ω1= Y1(y1)同理, 有 Y2*=ω2= Y2(y2)…:從總的推理結果求出精確值 5 嵌入式操作系統uC/OSII及其移植到LPC2214硬件部分是基礎,而軟件部分則更能體現嵌入式系統的優(yōu)越性,根據系統的功能,采用uC/OSⅡ操作系統,它是當前得到廣泛應用的一種源碼公開的實時嵌入式操作系統, uC/OSⅡ僅是一個實時內核,這就意味著它不像其它實時操作系統那樣提供給用戶的只是一些API函數接口,有很多工作往往需要用戶自己去完成。移植uC/OSⅡ到硬件平臺只是系統設計工作的開始,還需要針對應用需求對uC/OSⅡ進行功能擴展。本章主要介紹嵌入式操作系統uC/OSⅡ及其在LPC2214的移植。 嵌入式與實時操作系統嵌入式系統面向用戶、面向產品、面向應用的,是以應用為中心、以計算機技術為基礎,軟硬件可裁剪、適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統。從某種程度講,不會出現1個標準的實時多任務操作系統(RTOS),因為嵌入式應用本身就極具多樣性。嵌入式軟件開發(fā)要想走向標準化,就必須使用多任務操作系統。嵌入式系統應用程序可以沒有操作系統直接在芯片上運行,但是為了合理地調度多任務、利用系統資源、系統函數以及和專家?guī)旌瘮到涌?,用戶必須自行選配RTOS開發(fā)平臺,這樣才能保證程序執(zhí)行的實時性、可靠性,并減少開發(fā)時間,保障軟件質量。嵌入式系統本身不具備自舉開發(fā)能力,即使設計完成以后用戶通常也是不能對其中的程序功能進行修改的,必須有一套開發(fā)工具和環(huán)境才能進行開發(fā),這些工具和環(huán)境一般是基于通用計算機上的軟硬件設備以及各種邏輯分析儀、混合信號示波器等。在嵌入式系統的開發(fā)中,嵌入式軟件是實現系統各種功能的關鍵。(1)嵌入式系統軟件的特征 嵌入式處理器的應用軟件是實現嵌入式系統功能的關鍵,對嵌入式處理器系統軟件和應用軟件的要求也和通用計算機有所不同。 (1) 軟件要求固態(tài)化存儲 為了提高執(zhí)行速度和系統可靠性,嵌入式系統中的軟件一般都固化在存儲器芯片或單片機本身中,而不是存貯于磁盤等載體中。 (2) 軟件代碼高質量、高可靠性 盡管半導體技術的發(fā)展使處理器速度不斷提高、片上存儲器容量不斷增加,但在大多數應用中,存儲空間仍然是寶貴的,還存在實時性的要求。為此要求程序編寫和編譯工具的質量要高,以減少程序二進制代碼長度、提高執(zhí)行速度。 (3) 系統軟件(OS)的高實時性是基本要求 在多任務嵌入式系統中,對重要性各不相同的任務進行統籌兼顧的合理調度是保證每個任務及時執(zhí)行的關鍵,單純通過提高處理器速度是無法完成和沒有效率的,這種任務調度只能由優(yōu)化編寫的系統軟件來完成,因此系統軟件的高實時性是基本要求。 (4) 多任務操作系統是知識集成的平臺和走向工業(yè)標準化道路的基礎 嵌入式操作系統的選擇要考慮:能否滿足應用的需求 選擇RTOS時,首先,在兼顧成本的前提下,一定要保證系統的性能滿足要求。其次,對于國內產品,一般需要中文支持。最后,得到的是RTOS的源代碼還是目標代碼,以及其使用費用。 uC/OSⅡ介紹uC/OSⅡ是美國人Jean ,最主要的特點就是源碼公開。這一點對于用戶來說可謂利弊各半,好處在于,一方面它是免費的,另一方面用戶可以根據自己的需要對它進行修改。缺點在于它缺乏必要的支持,沒有功能強大的軟件包,用戶通常需要自己編寫驅動程序,特別是如果用戶使用的是不太常用的單片機,還必須自己編寫移植程序編寫的一個源碼公開的嵌入式實時操作系統。uC/OSⅡ具有如下特點: 1 源代碼公開 2 可移植 3 可固化 4 可裁剪 5 占先式的實時操作系統,其絕大部分源代碼式用ANSI C寫的。與微處理器硬件相關的部分用匯編語言編寫,且匯編語言編寫的部分已經壓縮到最低的限度,使得uC/OSⅡ便于移植到其他微處理器上,如:XP8ARM、PowerPC。 uC/OSII移植到LPC2214所謂移植,就是使一個是實時內核能在某個微處理器或微控制器上運行。為了方便移植,大部分uC/OSⅡ代碼是用C語言寫的,但仍需要用C和匯編寫一些與處理器相關的代碼。uC/OSII 實際上可以簡單地看作是一個多任務的調度器,在這個任務調度器之上完善并添加了和多任務操作系統相關的一些系統服務,如信號量、郵箱等。移植工作的絕大部分都集中在多任務切換的實現上,因為這部分代碼主要是用來保存和恢復處理器現場,因此不能用C語言,只能使用特定的處理器匯編語言完成。移植條件:要實現μC/OSⅡ的移植,所用的處理器和編譯器必須滿足一定件:(1) 所用的C編譯器能產生可重入代碼??芍厝氪a是指可以被一個以上的任務調用,而不必擔心其數據會被破壞的代碼。可重入代碼任何時候都可以被中斷,一段時間以后又可以重新運行,而相應的數據不會丟失。(2) 用C語言就可以打開和關閉中斷。(3) 處理器支持中斷,并且能產生定時中斷(通常在10至100Hz之間)(4) 處理器支持能夠容納一定數量數據的硬件堆棧(5) 處理器有將堆棧指針和其它CPU寄存器從內存中讀出和存儲到堆?;騼却嬷械闹噶?。移植需要編寫的文件各個微處理器或微控制器的移植源代碼必須在以下2個或3個文件中: (C語言頭文件) (C程序源文件) (匯編程序源文件),因為有些C編輯器允許用戶在C語言中插入匯編語言,(1)。 數據類型定義因為不同的微處理器有不同的字長,所以uC/OSII的移植包括了一系列的類型定義以確保其可移植性。使用的是 GNU 的 armelfgcc,相關的數據類型的定義如下/******************************************************* 數據類型 (與編輯器相關)********************************************************/typedef unsigned char BOOLEAN。typedef unsigned char INT8U。/* 無符號8位整數 */typedef signed char INT8S。/* 有符號8位整數 */typedef unsigned int INT16U。/* 無符號16位整數*/typedef signed int INT16S。/* 有符號16位整數 */typedef unsigned long INT32U。/* 無符號32位整數*/typedef signed long INT32S。/* 有符號32位整數 */typedef float FP32。 /*單精度浮點數 */typedef double FP64。 /*雙精度浮點數*/typedef unsigned int os_STK。 /*堆棧入口寬度為16位*/2. 堆棧單位因為處理器現場的寄存器在任務切換時都將會保存在當前運行任務的堆棧中,所以OS_STK 數據類型應該是和處理器的寄存器長度一致的。typedef INT32U OS_STK。 /*堆棧成員為32位*/絕大多數微處理器和微控制器的堆棧是從上往下長的。當進行函數調用時,入口參數和返回地址一般都會保存在當前任務的堆棧中,編譯器的編譯選項和由此生成的堆棧指令就會決定堆棧的增長方向。define OS_STK_GROWTH 1uC/OSⅡ定義了兩個宏來禁止和允許中斷OS_ENTER_CRITICAL()和OS_TASK_SW() 還定義了從低優(yōu)先級任務切換到最高優(yōu)先級任務的宏 OS_EXIT_CRITICAL() (2).1.任務堆棧初始化這里涉及到任務初始化時的一個堆棧設計,也就是在堆棧增長方向上如何定義每個需要保存的寄存器位置,在ARM體系結構下,任務堆??臻g由高至低依次將保存著pc、lr、r1r1r… rr0、CPSR、SPSR。如圖53所示。OS STK *OSTaskStkInit(void( *task)(void *pd),void *pdata,OS— STk *ptos,INT16U opt){OS— STK *stk:opt=opt:/* opt沒有使用,作用是避免編譯器警告*/stk=ptos;/* 獲取堆棧指針 */*stk=(OS~sTK)task;/* pc*/*stk = (Os_STK)task;/* lr*/*stk = 0:/*r12*/*stk = 0:/*rl1*/*stk = 0:/*r10*/*stk = 0: /*r9*/*stk = 0: /*r8*/*stk = 0: /*r7*/*stk = 0: /*r6*/*stk = 0: /*r5*/*stk = 0: /*r4*/*stk = 0: /*r3*/*stk = 0: /*r2*/*stk = 0: /*rl*/*stk=(unsigned int)pdata; /*r0,第一個參數使用R0傳遞* /*stk=(USER USING_MODE10X00); /*spsr,允許IRQ,FIR中斷*/*stk=0; /*關中斷計數器OsEnterSum*/return(stk);}當堆棧任務完成后,OSTaskStkInit() 返回新低地址pclrr12r11…...r1r0CPSROsEnterSum增長方向高地址圖53 任務堆棧保存情況的堆棧指針。(3) uC/OSII的移植實例要求用戶編寫四個簡單的匯編語言函數:OSStartHighRdy()運行優(yōu)先級最高的就緒任務OSCtxSw()任務級的任務切換OSIntCtxSw()中斷級的任務切換OSTickISR()中斷服務 OSStartHighRdy()匯編代碼如下:MSR CPSR_c,(Nolnt I SYS32MOde);進入系統模式LDR R4, = OSRunning;設置OSRunning為真,標識程序開始運行MOV R5, 1STRB R5,[R4]BL OSTaskSwHook;調用鉤子函數LDR R6, = OSTCBHighRdy;加載OS_TCB中最高優(yōu)先級任務的地址LDR R6,[R6]B OSIntCtxSw_1,程序跳轉,獲取新任務堆棧指針OSCtxSw()任務級的任務切換函數STMFD sp!,{lr}。保存PC指針STMFD sp!,{lr}。保存lr指針STMFD sp!,{r0r12}。保存寄存器文件和返回地址MRS r4,CPSRSTMFD sp!,{r4}。保存當前PSRMRS r4,SPSRSTMFD sp!,{r4}。OSPrioCur=OSPrioHighRdyLDR r4,addr_OSPrioCurLDR r5,addr_OSPrioHighRdyLDRB r6,[r5]STRB r6,[r4] 。得到當前任務的TCB地址LDR r4,addr_OSTCBCurLDR r5,[r4]STR sp,[r5] 。保存棧指針在占先任務的TC