久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

uc-OS實時操作系統的應用和學習心得

時間:2019-05-12 14:43:27下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《uc-OS實時操作系統的應用和學習心得》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《uc-OS實時操作系統的應用和學習心得》。

第一篇:uc-OS實時操作系統的應用和學習心得

uc/OS實時操作系統的應用和學習心得

這是小弟我最近的研究成果,跟大家交流一下。目前正在研究嵌入式實時軟件系統設計方法,有興趣的高手交流一下。這里給大家簡單剖析一下uCOS吧,希望對大家能有所幫助。不足之處多多指教,有問題可以討論。一.uC/OS-II的移植

移植uC/OS對目標處理器有一定要求,這個可以參照<>一書中第8章的內容.整個嵌入式系統分為兩大層:硬件層和軟件層.這里主要研究軟件層的架構.軟件層主要分為四個部分:實時操作系統內核,與處理器相關部分,與應用相關部分,用戶的應用系統.l 實時操作系統內核

實時操作系統對系統資源進行管理。主要包括任務分配和調度、系統時鐘服務、內存管理、消息機制、異常處理等等。uC/OS所有系統服務均由內核提供。內核將應用系統和底層硬件結合成一個完整的實時系統。

移植的時候內核是不變的,開發者根據自己應用系統的需要來選擇實時操作系統內核,開發者不能對內核隨意訪問,只能使用內核提供的功能服務來開發自己的應用系統。內核確定,那么所提供的系統管理能力,系統服務也就得到了限定。開發者只能在規定的范圍內對系統作些改動.2 與處理器相關的代碼

這是移植中最關鍵的部分.內核將應用系統和底層硬件有機的結合成一個實時系統,要使同一個內核能適用于不同的硬件體系,就需要在內核和硬件之間有一個中間層,這就是與處理器相關的代碼.處理器不同,這部分代碼也不同.我們在移植時需要自己處理這部分代碼,可以自己編寫,也可以直接使用已經成功移植的代碼.在uC/OS中這一部分代碼分成三個文件:OS_CPU.H, OS_CPU_A.ASM, OS_CPU_C.C 1)OS_CPU.H 包括了用#define定義的與處理器相關的常量,宏和類型定義.具體來講有系統數據類型定義,棧增長方向定義,關中斷和開中斷定義,系統軟中斷的定義等等.2)OS_CPU_A.ASM 這部分需要對處理器的寄存器進行操作,所以必須用匯編語言來編寫.包括四個子函數:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw(),OSTickISR().OSStartHighRdy()在多任務系統啟動函數OSStart()中調用.完成的功能是:設置系統運行標志位OSRunning = TRUE;將就緒表中最高優先級任務的棧指針Load到SP中,并強制中斷返回.這樣就緒的最高優先級任務就如同從中斷里返回到運行態一樣,使得整個系統得以運轉.OSCtxSw()在任務級任務切換函數中調用的.任務級切換是通過SWI或者TRAP人為制造的中斷來實現的.ISR的向量地址必須指向OSCtxSw().這一中斷完成的功能:保存任務的環境變量(主要是寄存器的值,通過入棧來實現),將當前SP存入任務TCB中,載入就緒最高優先級任務的SP,恢復就緒最高優先級任務的環境變量,中斷返回.這樣就完成了任務級的切換.OSIntCtxSw()在退出中斷服務函數OSIntExit()中調用,實現中斷級任務切換.由于是在中斷里調用,所以處理器的寄存器入棧工作已經做完,就不用作這部分工作了.具體完成的任務:調整棧指針(因為調用函數會使任務棧結構與系統任務切換時堆棧標準結構不一致),保存當前任務SP,載入就緒最高優先級任務的SP,恢復就緒最高優先級任務的環境變量,中斷返回.這樣就完成了中斷級任務切換.OSTickISR()系統時鐘節拍中斷服務函數,這是一個周期性中斷,為內核提供時鐘節拍.頻率越高系統負荷越重.其周期的大小決定了內核所能給應用系統提供的最小時間間隔服務.一般只限于ms級(跟MCU有關),對于要求更加苛刻的任務需要用戶自己建立中斷來解決.該函數具體內容:保存寄存器(如果硬件自動完成就可以省略),調用OSIntEnter(),調用OSTimeTick(),調用OSIntExit(),恢復寄存器,中斷返回.3)OS_CPU_C.C UC/OS中共定義了6個函數在該文件中.但是最重要的是OSTaskStkInit().其他都是對系統內核的擴展時用的.OSTaskStkInit()是在用戶建立任務時系統內部自己調用的,對用戶任務的堆棧進行初始化.使建立好的進入就緒態任務的堆棧與系統發生中斷并且將環境變量保存完畢時的棧結構一致.這樣就可以用中斷返回指令使就緒的任務運行起來.具體的入棧方式要根據不同mcu而定.需要參考用戶使用的mcu說明書.同時還要考慮mcu的棧生成方式.這需要根據具體問題來分析,在此不做過多論述.3 與應用相關的代碼

這一部分是用戶根據自己的應用系統來定制合適的內核服務功能.包括兩個文件:OS_CFG.H, INCLUDES.H.OS_CFG.H來配置內核,用戶根據需要對內核進行定制,留下需要的部分,去掉不需要的部分,設置系統的基本情況.比如系統可提供的最大任務數量,是否定制郵箱服務,是否需要系統提供任務掛起功能,是否提供任務優先級動態改變功能等等.INCLUDES.H系統頭文件,整個實時系統程序所需要的文件,包括了內核和用戶的頭文件.4 用戶應用系統

這是整個實時系統的最高層,用戶通過利用實時操作系統提供的服務來開發自己的具體程序.二.用戶應用系統編寫的模式

kernel提供給用戶一些功能函數,使得用戶的系統建立更加方便,但是kernel內部不會處理用戶的工作,對于整個系統的具體應用工作還得需要用戶自己去考慮,如何利用好這些功能服務函數就成為一個比較重要的問題.1.main函數的結構 void main(void){ 初始化系統的硬件;OSInit();任務的建立,消息機制的建立;OSStart();} 這里需要的是在OSStart()執行之前不得啟動中斷,硬件系統還不能工作.必須先讓軟件系統進入工作狀態后才行.2.中斷的結構 ISR: { 保存處理器寄存器的值;調用OSIntEnter();執行用戶的工作;調用OSIntExit();恢復處理器寄存器的值;RTI;} 用戶的中斷形式和以前一樣,沒有什么大的變化,僅僅是在原來用戶ISR的基礎上在固定的位置加了兩個函數:OSIntEnter(), OSIntExit().3.各個任務的結構 void YourTask(void){ for(;;){ 用戶代碼 調用的系統服務 } } 在任務啟動函數執行完后,系統會切換到最高優先級的任務去執行,此時,可以將系統硬件部分的啟動放在該任務的最前邊,僅僅是啟動時執行一次,主要是啟動系統的節拍中斷,或者一些必須在多任務系統調度后才能初始化的部分,使系統的真正開始工作,達到軟件硬件的基本同步.Void HighestPrioTask(void){ OSStartHardware();For(;;){ 用戶代碼 調用的系統服務 } } 用戶可以按照這些格式去編寫自己的任務,建立自己的應用系統.

第二篇:UCOS學習心得

ucos學習分析總結

2009-11-08 19:54:0

2此資料由自己學習總結和網上收集整理來的大家相互學習交流

龍心

2009.9.10

1.在uC/OS-II的幫助手冊內,作者特地強調絕對不能在OSInit()或者OSStart()內

調用Timer初始化程序,那會破壞系統的可移植性同時帶來性能上的損失。

所以,一個折中的辦法就是:

在優先級最高的程序內調用,這樣可以保證當OSStart()調用系統內部函數

OSStartHighRdy()開始多任務后,首先執行的就是Timer初始化程序?;蛘?/p>

專門開一個優先級最高的任務,只做一件事情,那就是執行 Timer初始化,之后通過調用OSTaskSuspend()將自己掛起來,永遠不再執行。不過這樣會

浪費一個TCB空間。對于那些RAM吃緊的系統來說,還是不用為好。

2.(三)一些重要的uC/OS-II API介紹

任何一個操作系統都會提供大量的API供程序員使用,uC/OS-II也不例外。由于uC/OS-II面向的是嵌入式開發,并不要求大而全,所以內核提供的API也就大多和多任務息息相關。主要的有以下幾類:

1)任務類

2)消息類

3)同步類

4)時間類

5)臨界區與事件類

我個人認為對于初級程序員而言,任務類和時間類是必須要首先掌握的兩種類型的API。下面我就來介紹比較重要的:

1)OSTaskCreate函數

這個函數應該至少再main函數內調用一次,在OSInit函數調用之后調用。作用就是創建 一個任務。目前有四個參數,分別是任務的入口地址,任務的參數, 任務堆棧的首地址和

任務的優先級。調用本函數后,系統會首先從TCB空閑列表內申請一個空的TCB指針,然后 將會根據用戶給出參數初始化任務堆棧,并在內部的任務就緒表內標記該任務為就緒狀態。

最后返回,這樣一個任務就創建成功了。

2)OSTaskSuspend函數

這個函數很簡單,一看名字就該明白它的作用,它可以將指定的任務掛起。如果掛起的是 當前任務的話,那么還會引發系統執行任務切換先導函數OSShed來進行一次任務切換。這個函數只有一個參數,那就是指定任務的優先級。那為什么是優先級呢?事實上在系統 內部,優先級除了表示一個任務執行的先后次序外,還起著分別每一個任務的作用,換句話 說,優先級也就是任務的ID。所以uC/OS-II不允許出現相同優先級的任務。

3)OSTaskResume函數

這個函數和上面的函數正好相反,它用于將指定的已經掛起的函數恢復成就緒狀態。如果 恢復任務的優先級高于當前任務,那么還為引發一次任務切換。其參數類似

OSTaskSuspend

函數,為指定任務的優先級。需要特別說明是,本函數并不要求和OSTaskSuspend函數成對使

用。

4)OS_ENTER_CRITICAL宏

很多人都以為它是個函數,其實不然,仔細分析一下OS_CPU.H文件,它和下面馬上要談到的 OS_EXIT_CRITICAL都是宏。他們都是涉及特定 CPU的實現。一般都被替換為一條或者幾條

嵌入式匯編代碼。由于系統希望向上層程序員隱藏內部實現,故而一般都宣稱執行此條指 令后系統進入臨界區。其實, 它就是關個中斷而已。這樣,只要任務不主動放棄CPU使用權, 別的任務就沒有占用CPU的機會了,相對這個任務而言,它就是獨占了。所以說進入臨界區了。

這個宏能少用還是少用,因為它會破壞系統的一些服務,尤其是時間服務。并使系統對外界響 應性能降低。

5)OS_EXIT_CRITICAL宏

這個是和上面介紹的宏配套使用另一個宏,它在系統手冊里的說明是退出臨界區。其實它就 是重新開中斷。需要注意的是,它必須和上面的宏成對出現,否則會帶來意想不到的后果。最壞的情況下,系統會崩潰。我們推薦程序員們盡量少使用這兩個宏調用,因為他們的確會

破壞系統的多任務性能。

6)OSTimeDly函數

這應該程序員們調用最多的一個函數了,這個函數完成功能很簡單,就是先掛起當起當前任務,然后進行任務切換,在指定的時間到來之后,將當前任務恢復為就緒狀態,但是并不一定運行, 如果恢復后是優先級最高就緒任務的話,那么運行之。簡單點說,就是可以任務延時一定時間 后再次執行它,或者說,暫時放棄CPU的使用權。一個任務可以不顯式的調用這些可以導致放棄CPU使用權的API,但那樣多任務性能會大大降低,因為此時僅僅依靠時鐘機制在進行任務切換。一個好的任務應該在完成一些操作主動放棄使用權,好東西要大家分享嘛!

3.我們推薦程序員們盡量少使用OS_ENTER_CRITICAL宏和 OS_EXIT_CRITICAL宏兩個宏調用,因為他們的確會破壞系統的多任務性能。why??

4.在以uC/OS為操作系統的項目中,系統可能要處理各種不同的中斷請求,如果某個中斷處理

程序需要調用uC/OS的各種Post函數向任務發出消息,那么uC/OS建議中斷服務程序的寫法是:

1、保存全部CPU寄存器

2、調用OSIntEnter或OSIntNesting直接加

13、執行用戶代碼做中斷服務

4、調用OSIntExit5、恢復所有CPU寄存器

6、執行中斷返回指令

暫且稱為“標準中斷”方式,這種方式實際上是將這個中斷處理加入了任務調度系統,也就是 說這個中斷可以引起任務的切換。

第三篇:實時操作系統報告

實時操作系統課程實驗報告

專業:通信1001 學號:3100601025 姓名:陳治州

完成時間:2013年6月11日

實驗 簡易電飯煲的模擬

一.實驗目的:

掌握在基于嵌入式實時操作系統μC/OS-II的應用中,基于多任務的模式的編程方法。鍛煉綜合應用多任務機制,任務間的通信機制,內存管理等的能力。

二.實驗要求:

1.按“S”開機,系統進入待機狀態,時間區域顯示當前北京時間,默認模式“煮飯”;2.按“C”選擇模式,即在“煮飯”、“煮粥”和“煮面”模式中循環選擇;

3.按“B”開始執行模式命令,“開始”狀態選中,時間區域開始倒計時,倒計時完成后進入“保溫”狀態,同時該狀態顯示選中,時間區域顯示保溫時間;

4.按“Q”取消當前工作狀態,系統進入待機狀態,時間區域顯示北京時間,模式為當前模式;

5.按“X”退出系統,時間區域不顯示。

6.煮飯時長為30,煮粥時長為50,煮面時長為40.三.實驗設計:

1.設計思路:

以老師所給的五個程序為基礎,看懂每個實驗之后,對borlandc的操作有了大概的認識,重點以第五個實驗Task_EX為框架,利用其中界面顯示與按鍵掃描以及做出相應的響應,對應實現此次實驗所需要的功能。

本次實驗分為界面顯示、按鍵查詢與響應、切換功能、時鐘顯示與倒計時模塊,綜合在一起實驗所需功能。2.模塊劃分圖:(1)界面顯示:

Main()Taskstart()Taskstartdispinit()在TaskStartDispInit()函數中,使用PC_DispStr()函數畫出界面。(2)按鍵查詢與響應:

Main()Taskstart()在TaskStart()函數中,用if(PC_GetKey(&key)== TRUE)判斷是否有按鍵輸入。然后根據key的值,判斷輸入的按鍵是哪一個;在響應中用switch語句來執行對應按鍵的響應。(3)切換功能:

l計數“C”按鍵的次數M=l%3Switch(m)M=0,1,2對應于煮飯,煮粥,煮面,然后使用PC_DispStr()函數在選擇的選項前畫上“@”指示,同時,在其余兩項錢畫上“ ”以“擦出”之前畫下的“@”,注意l自增。

四.主要代碼:

#include “stdio.h” #include “includes.h” #include “time.h” #include “dos.h” #include “sys/types.h” #include “stdlib.h” #define TASK_STK_SIZE

512

#define N_TASKS

OS_STK

TaskStk[N_TASKS][TASK_STK_SIZE];

OS_STK

TaskStartStk[TASK_STK_SIZE];

INT8U

TaskData[N_TASKS];

void Task0(void *pdata);

void TaskStart(void *pdata);

static void TaskStartDispInit(void);

void main(void){

PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS, OSCtxSw);

OSTaskCreate(TaskStart,(void *)0, &TaskStartStk[TASK_STK_SIZE-1], 4);

OSStart();

} void TaskStart(void *pdata){ #if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr;#endif

INT8U l,m;

INT16S key;

l=0;

pdata = pdata;

TaskStartDispInit();

OS_ENTER_CRITICAL();

PC_VectSet(0x08, OSTickISR);

PC_SetTickRate(OS_TICKS_PER_SEC);

OS_EXIT_CRITICAL();

OSStatInit();

for(;;){

if(PC_GetKey(&key)== TRUE)

{

switch(key)

{

case 0x1B:

PC_DOSReturn();

break;

case 0x43:

{ m=(l%3);

switch(m)

{ case 0: {

PC_DispStr(26,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(55,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);} break;

case 1: { PC_DispStr(26,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr(55,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);} break;case 2: { PC_DispStr(26,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);

PC_DispStr(40,6, “ ”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(55,6, “@”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);}

break;}

l++;} break;

} } OSCtxSwCtr = 0;

OSTimeDlyHMSM(0, 0, 1, 0);

} } static void TaskStartDispInit(void){ PC_DispStr(0, 0, “

uC/OS-II, The Real-Time Kernel

”, DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);PC_DispStr(0, 1, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 2, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 3, “

dianfanbao shiyan

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 4, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 5, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 6, “

kai shi.zhu fan.zhu zhou.zhu mian.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 7, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 8, “

bao wen.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 9, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 10, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 11, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 12, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 13, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 14, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 15, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 16, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 17, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 18, “

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);PC_DispStr(0, 19, “ 'S':kai ji.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 20, “ 'C':mo shi qie huan.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 21, “ 'B':kai shi zhi xin.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 22, “ 'Q':qu xiao dang qian gong zuo zhuang tai.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);PC_DispStr(0, 23, “ 'X':tui chu xi tong.”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);

PC_DispStr(0, 24, “

<-PRESS 'ESC' TO QUIT->

”, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);}

五.運行界面:

(1)主界面:

(2)顯示北京時間:

(3)模式切換:

(4)倒計時:

(5)保溫執行時間:

六.總結:

本次實驗主要以老師所給的實驗事例為基礎,并結合老師課堂講的內容,理解編寫程序。做實驗本實驗前,先執行了一下事例程序,以此了解borlandc的一些基本操作;然后就是看懂每個實驗的框架和主要部分;接著,將事例程序中的部分思想運用到本次實驗中,其中以顯示界面的思想運用的最多;除此以外,在模式切換上花了最大的精力,最終的解決方法是以變量l作為一個計數值,并運用switch語句在選擇的模式上畫上“@”,同時還得注意在未選擇的模式上畫上空格來“擦除”之前畫上的@;在查詢按鍵上,同樣運用switch語句......這次實驗收獲不少,不僅對之前學的C語言有了更進一步的鞏固,而且還強化了ucos里面的多任務的一些認識;同時,以前對DOS界面很陌生,但本次實驗使用的正是DOS界面,通過幾天的經歷,對DOS中的編譯、“help”等各個方面有了更深入的認識,不再害怕使用DOS了。

對本課程有很大的興趣,在以后的課余時間里我會不斷學習這些知識。

第四篇:基于UCOS嵌入式實時操作系統的單任務和多任務LED顯示總結----婁...

基于uCOSII的單任務和多任務LED顯示

一、uCOSII簡介

uCOS II是一個微型的實時操作系統,包括了一個操作系統最基本的一些特性,如任務調度、任務通信、內存管理、中斷管理、定時管理等。而且這是一個代碼完全開放的實時操作系統,簡單明了的結構和嚴謹的代碼風格,非常適合初涉嵌入式操作系統的人士學習。

二、設計目的

通過實驗,學習在uC/OSII操作系統中單任務控制LED閃爍和多個任務控制LED之間的切換和同步,以及多任務控制程序的編寫方法。

三、裸機程序和uCOSII 的運行流程對比

3.1 裸機程序的運行流程

裸機主函數的運行流程:

這個是我們寫一般的單片機程序的流程,就是在主函數中用死循環執行功能函數,然后加上中斷。3.2 uCOSII 的運行流程

uCOSII是一個操作系統,但是說到底也是一個支持任務切換的裸機程序。在初始化變量OSInit函數中,初始化所有全局變量,數據結構,創建最低優先級空閑任務OSTaskIde,并創建6個空數據鏈表:空任務控制塊鏈表,空事件控制塊鏈表,空列隊控制塊鏈表,空標志組鏈表,空內存控制塊鏈表,空閑定時器控制塊鏈表

創建任務 OSTaskCreate函數,一般創建一個最高優先級任務TaskStart任務,任務調度后,在這個任務中再創建其他的任務,初始化硬件,并打開中斷。

進入多任務管理階段OSStart函數,將就緒表中最高優先級任務的棧指針加載到SP中,并強制中斷返回。

任務調度工作就是查找就緒表中優先級最高的任務,實現任務的切換。簡單來說,裸機程序在主函數中通過死循環執行各種函數,最終達到實現各種功能函數的目的。而uCOSII系統,通過不斷的產生定時中斷,或則任務主動放棄CPU,然后進行任務之間的調度,相當于不斷循環執行不同的任務,最終實現各種任務。

四、工作原理

4.1uCOSII 的內核管理

4.1.1 ucos的文件結構:

應用軟件Ucos(與處理器無關的代碼)OS_CORE.COS_FLAG.COS_MBOX.COS_MEM.COS_MUTEX.COS_Q.COS_SEM.COS_TASK.COS_TIME.CUCOS_11.CUCOS_11.HUCOS-11配置(與應用相關)OS_CFG.HINCLUDE.HUCOS移植(與處理器相關代碼)OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C硬件4.1.2 臨界段:

OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。它們可以用不同的方法去實現,用定義(#define)常數OS_CRITICAL_METHOD(1,2,3)來選擇用哪種方法來實現。

當OS_CRITICAL_METHOD=1時,表示用處理器指令關中斷,完成OS_ENTER_CRITIACL,用開中斷完成OS_EXIT_CRITICAL.利用這種方法有點小問題,即是調用UCOS功能函數之前,中斷是關掉的,從UCOS返回后,中斷就打開了。

當OS_CRITICAL_METHOD=2時,這種方法是在堆棧中保存中斷的開關狀態,然后再關中斷。在實現OS_EXIT_CRITICAL時,只需簡單的從堆棧中彈出原來中斷的開關狀態。利用這種方法,不論用戶在調用函數之前中斷是開著的還是關著的,函數的進入和返回狀態都得到了保護。

當OS_CRITICAL_METHOD=3時,一些編譯器提供了擴展功能,用戶可以得到當前處理器的狀態字,并保存在C函數的局部變量中,這個變量可以用于恢復PSW。在STM32中,我們一般都是用第三種模式。4.1.3 任務的狀態:

任務狀態之間的轉換如下圖:

特別值得注意的是,在任務執行的過程中可以被中斷打斷。4.1.4任務控制快:

系統必須為每個任務創建一個保存與該任務有關的相關信息的數據結構,這個數據結構就叫做該任務的任務控制塊(TCB)。當任務的CPU使用權被剝奪時UCOS利用它來保存任務的狀態。4.1.5就緒表:

每個就緒的任務都放在就緒表中,就緒表中有兩個變量,OSRdyGRP和OSRdyTbl。OSRdyGrp中每一位表示8組任務中每一組是否有進入就緒態的任務。當有任務進入就緒態時,就緒表OSRdyTbl[]中相應元素的相應位也置為1。4.1.6任務調度OS_SCHED():

Ucos總是進行進入就緒態任務中優先級最高的任務,確定哪個任務優先級最高,這一工作就是有調度器完成的。4.1.7任務切換OS_TASK_SW():

需恢復該任務在CPU使用權被剝奪時保存下來的全部寄存器的值,之后,運行被切換的任務。

4.1.8給調度器上鎖和開鎖:

給調度器上鎖函數OSSchedlock()用于禁止任務調度,直到任務完成后,調用調度器開鎖函數OSSchedUnlock()為止。這兩函數必須成對使用。4.1.9空閑任務OS_TaskIdle():

每個程序必須在初始化時建立一個空閑任務,這個任務沒有其他任務進入就緒態時,投入運行,空閑任務永遠處于就緒態。空閑任務始終設為最低優先級。OSTaskIdle()可以調用OSTaskIdleHook()讓CPU進入STOP指令,從而進入低功耗模式。當應用系統有電池供電時,這種方式特別有用。

4.2uCOSII 的任務管理

4.2.1建立任務OSTaskCreat(): 如果想讓UCOS管理用戶的任務,必須先建立任務??梢酝ㄟ^將任務的地址和其他參數傳遞到以下兩個函數之一來建立任務。當調用OSTaskCreat()時,需要四個OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)Task:是指向任務代碼的指針,pdata:是任務開始執行是,傳遞給任務的參數的指針,ptos:是分配給任務的堆棧的棧頂指針,prio是分配給任務的優先級。

4.2.2任務堆棧OS_STK(): 每個任務都有自己的堆棧,堆棧必須申明為OS_STK類型,并且由連續的內存空間組成??梢造o態分配堆棧空間,也可以動態分配堆??臻g。但是一般我們都是分配靜態堆棧空間。4.2.3刪除任務OSTaskDel():

有時需要刪除任務,刪除任務,是說任務返回并處于休眠態,并不是說任務的代碼被刪除了。4.3時間管理

4.3.1任務延遲函數OSTimeDly():

Ucos提供一個可以被任務調用而將任務延時一段特定時間的功能函數,即OSTimeDly().任務調用OSTimeDly()后,一旦規定的時間期滿或者有其他的任務通過調用OSTimeDlyResume()取消了延時,他就會進入就緒狀態。只有當該任務在所有就緒態任務中具有最高的優先級,它才會立即運行。4.3.2按時,分,秒延時函數OSRimeDLyHMSM():

OSTimeDly()一樣,調用OSRimeDlyHMSM()函數也會是UCOS進行一次任務調度,并且執行下一個優先級最高的就緒任務。當OSTimeDlyHMSM()后,一旦規定的時間期滿,或者有OSTimeDlyResume(),它就會馬上處于就緒態。同樣,只有當該任務在所有就緒態任務中具有最高的優先級,他才開始運行。

五、設計方案:

5.1單任務

在stm32的平臺上移植ucosII,并且建立一個單任務,任務控制LED1以10HZ的頻率閃爍。5.2多任務

在stm32的平臺上移植ucosII,并且建立三個任務,三個任務分別控制LED1,LED2,LED3以10HZ,20HZ,50HZ的的頻率閃爍。

六、程序流程圖

多任務控制LED閃爍:

七、遇到的問題

7.1編譯器報錯,顯示PUBLIC未定義

由于我們移植的核心代碼用IAR編譯的,由于編譯器的不同,所以要把PUBLIC改成EXPORT。

7.2編譯報錯,顯示,棧未定義

由于每個任務都要有獨立的棧來保存局部變量,從本質上講也就是將CPU寄存器的值保存到RAM中。在uCOS中,每一個任務都有一個獨立的任務堆棧。

八、主要代碼 8.1主函數

#include “includes.h” //包含所有頭文件

OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];//定義起始任務堆棧

int main(void){

BSP_Init();//板級初始化

OSInit();//系統初始化,創建空閑任務

OSTaskCreate(Task_Start,(void *)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);

OS_ENTER_CRITICAL();OSStart();

//把控制權交給操作系統,進行任務調度

return 0;} 8.2用戶應用函數

#include “includes.h”

OS_STK task_led2_stk[TASK_LED2_STK_SIZE];

//任務2堆棧 OS_STK task_led3_stk[TASK_LED3_STK_SIZE];

//任務3堆棧 OS_STK task_led4_stk[TASK_LED4_STK_SIZE];

//任務4堆棧

void Task_Start(void *p_arg)

//task1 {

(void)p_arg;

//未用到傳遞參數,防止編譯器報錯

SysTick_init();

OSTaskCreate(Task_LED2,(void *)0,//

&task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO);OSTaskCreate(Task_LED3,(void *)0,//

&task_led3_stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO);

OSTaskCreate(Task_LED4,(void *)0,//

&task_led4_stk[TASK_LED4_STK_SIZE-1], TASK_LED4_PRIO);

while(1)

{

LED1(ON);

OSTimeDlyHMSM(0, 0,0,100);

LED1(OFF);

OSTimeDlyHMSM(0, 0,0,100);

} } //任務2 void Task_LED2(void *p_arg){

(void)p_arg;

SysTick_init();

while(1)

{

LED2(ON);

OSTimeDlyHMSM(0, 0,0,200);

LED2(OFF);

OSTimeDlyHMSM(0, 0,0,200);

} }

//任務3 void Task_LED3(void *p_arg){

(void)p_arg;

SysTick_init();

while(1)

{

//LED3(ON);

OSTimeDlyHMSM(0, 0,0,300);

//LED3(OFF);

OSTimeDlyHMSM(0, 0,0,300);

} }

//任務4 void Task_LED4(void *p_arg){

(void)p_arg;

SysTick_init();

while(1)

{

LED3(ON);

OSTimeDlyHMSM(0, 0,0,40);

LED3(OFF);

OSTimeDlyHMSM(0, 0,0,40);

} }

婁宇庭

2014年5月5 日

第五篇:操作系統學習心得

操作系統學習心得

會計092班 姓名:潘東輝 學號:0904042062 1.下面就操作系統從2000年以來的發展做一個較簡單的介紹。從一些文獻中,我可以了解到:至2005年為止,用于通用計算機上的分布的操作系統主要兩個家族:類Unix家族和微軟Windows家族。而主機系統和嵌入式操作系統使用多樣的系統,并且很多和Windows、Unix都沒有直接的聯系。類Unix家族包括多個組織的操作系統,其中有幾個主要的子類包括System V、BSD和Linux。這里'Unix'是一個商標,開發組織允許使用操作系統在一個定義前提下自由地開發。這名字是通用大型設置操作系統類似組織 Unix。Unix系統運行在從巨型機到嵌入式系統的多種機器架構上。Unix主要使用于重要的商務服務器系統以及學院和工程環境中的工作站之上。和 AT&T Unix不同,自由軟件比如Linux和BSD逐步開始流行,并且開始進入桌面操作系統領域。和一些Unix操作系統不同,像惠普公司的HPUX和IBM 公司的AIX是設計僅運行在客戶購買的設備上,其中有一些特殊的(比如SUN公司的Solaris)可以運行在客戶購買設備和基于工業標準的PC上。APPLE公司的Mac OS X是一個BSD特例,以取代早期小型市場上的蘋果公司Mac OS,眾多流行的Unix操作系統正在走向一體。微軟公司的Windows操作系統家族起源于早期的IBM PC環境中的MS-DOS,現在版本是基于新的Windows NT內核,第一次是在OS/2中制定。和Unix不同,Windows只能運行在32位和64位的x86 CPU(如Intel或者AMD的芯片)上,盡管早期有版本運行于DEC Alpha,MIPS 和 PowerPC體系結構。今天Windows是一個流行的操作系統,在全球桌面市場中占有90%左右的份額,同時在中低端服務器市場也有廣泛的應用,如 Web服務器和數據庫服務器。

大型機系統,比如IBM公司的Z/OS,和嵌入式操作系統比如QNX、eCOs和PalmOS都是和Unix和Windows無關的操作系統,而 Windows CE、Windows NT Embedded 4.0和Windows XP Embedded都是和Windows相關的。

老的操作系統停留在市場包括類似IBM Windows的OS/

2、來自惠普的VMS(以前的DEC);蘋果公司的Mac OS操作系統、非Unix先驅蘋果公司Mac OS X,以及AmigaOS,第一個圖形用戶界面的操作系統,包括對于普通用戶的高級的多媒體能力。

2.下面我簡單的總結了一下操作系統的作用:操作系統在計算機系統中占據著一個非常重要的地位,它不僅是硬件與所有其他軟件之間的接口,而且任何數字電子計算機都必須在其硬件平臺上加載相應的操作系統之后,才能構成一個可以協調運轉的計算機系統。只有在操作系統的指揮控制下,各種計算機資源才能被分配給用戶使用。也只有在操作系統的支撐下,其他系統軟件如各類編譯系統、程序庫和運行支持環境才得以取得運行條件。沒有操作系統,任何應用軟件都無法運行。有了操作系統就像是我們去飯店點菜一樣方便,為我們提供了一個良好的平臺,更好更直觀的管理自己的計算機。操作系統主要有兩方面重要的作用。

1)操作系統要管理系統中的各種資源,包括硬件及軟件資源。操作系統對每一種資源的管理都必須進行以下幾項工作:監視這種資源。該資源有多少,資源的狀態如何,它們都在哪里,誰在使用,可供分配的又有多少,資源的使用歷史等內容都是監視的含義。實施某種資源分配策略,以決定誰有權限可獲得這種資源,何時可獲得,可獲得多少,如何退回資源等。分配這種資源。按照已決定的資源分配策略,對符合條件的申請者分配這種資源,并進行相應的管理事務處理?;厥者@種資源。在使用者放棄這種資源之后,對該種資源進行處理,如果是可重復使用的資源,則進行回收、整理,以備再次使用。2)操作系統要為用戶提供的良好的界面。操作系統,必須為最終用戶和系統用戶這兩類用戶的各種工作提供良好的界面,以方便用戶的工作。典型的操作系統界面有兩類:一類是命令行界面,如Unix和MS-DOS;另一類則是圖形化的操作系統界面,典型的圖形化的操作系統界面是MS Windows。

3.下面我就談談我在學習操作系統這門公選課時所得到的感悟。老師的教學風格既保守又開放,完全不限制學生太多的想象空間,讓我們能夠盡情發揮自己的創造力。本來我感覺操作系統一定是一門枯燥乏味的學科,但是卻被我們的老師講述的生動具體。從學習操作系統的過程中,我感受到就算是一個操作系統學科也蘊含了很多知識,要想學得透徹,完全搞明白也不是那么容易的。隨著科學技術的日益發展,計算機技術的提高速度是相當驚人的,過一段時間就會有所更新。我們在買來電腦時,就已經注定著它的技術在淘汰了,只要幾個月的時間,也許它就會被超越,計算機在我們國家的發展還是在起步階段。有很多地方時需要我們向別人學習的我們應該思考為什么我們必須要用微軟的windous,而我們就沒有更好的操作系統來取代它嗎?我們作為一個大學生,雖然我不是計算機專業的,但是我們一定要想著多學一些知識來武裝自己,不使自己過早的被時代所淘汰。更何況是現在這樣一個競爭如此激烈的年代,我們更應該為自己的將來做長期的打算。

下載uc-OS實時操作系統的應用和學習心得word格式文檔
下載uc-OS實時操作系統的應用和學習心得.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    計算機實時操作系統的改善措施

    《計算機實時操作系統的改善措施》 摘要: 實時系統在工業、商業和軍事等領域都有非常廣泛的用途,并且已經有很多實際的應用。一般來說,實時系統通常是比較復雜的,因為它必須處......

    嵌入式Linux實時操作系統習題總結

    第1章 1.嵌入式系統是指操作系統和功能軟件集成于計算機硬件系統之中。嵌入式系統一般有3個主要的組成部分:硬件、實時操作系統以及應用軟件。 2.嵌入式系統的三要素是嵌入、專......

    嵌入式實時操作系統 項目開發總結報告

    項目開發總結報告 分 類:軟件項目計劃 使用者:E-fanciers Version: 1.0 項 目 承 擔 隊伍:煙臺大學 計算機學院 E-fanciers小組撰 寫 人(簽名): 許超 于歌 完 成 日 期: 2009-7-1......

    Linux操作系統學習心得

    Linux操作系統學習心得 這學期有幸學習了《嵌入式系統設計》這門課,在胡佳文老師的教導下深入了解了有關于嵌入式系統,ARM9,Linux系統等很多方面的知識,獲益良多,在學習過程中......

    Linux操作系統學習心得

    Linux操作系統學習心得 Linux操作系統這個名詞記得在很早以前就聽過,但具體是什么樣的系統卻真的不知道,甚至都不知道它是手機系統還是電腦系統,知道的只是它好像比較不易......

    LINUX操作系統學習心得

    LINUX操作系統學習心得第一次看見LINUX這個詞是在選擇選修課的時候,根本不知道LINUX是什么東西,帶著對計算機的喜愛,選了LINUX操作系統這門選修課。 經過這一個學期的學習,對LIN......

    嵌入式實時操作系統(dynaLinux),及其開發平臺(精)

    嵌入式實時操作系統(dynaLinux),及其開發平臺 公司簡介: 注冊時間:2003年3月24日 經濟性質:合資 從事領域:電子信息 資產狀況:注冊資金100萬人民幣 人員狀況:12人 股本結構: 中方:方......

    操作系統及Internet基本應用

    信 息 工 程 學 院 大學計算機基礎 實習報告 學院:理學院 班級:應化113 姓名:尤牛奔 學號:2011014944成績:A 一、實習題目 : 操作系統及Internet基本應用 二、實習過程 在上......

主站蜘蛛池模板: 久久久久夜夜夜精品国产| 麻豆精品国产熟妇aⅴ一区| 亚洲一区二区三区偷拍女厕| 免费无遮挡无码永久视频| 人妻无码不卡中文字幕系列| 99久久免费国产精品| 精品亚洲国产成人| 大胸少妇午夜三级| 精品成人免费一区二区不卡| 精品亚洲a∨无码一区二区三区| 日产日韩亚洲欧美综合在线| 国产伦人人人人人人性| 色婷婷狠狠97成为人免费| 亚洲精品成人区在线观看| 中文字幕网伦射乱中文| 四虎亚洲精品高清在线观看| 国产女人18毛片水真多18精品| 岛国无码av不卡一区二区| 妓女爽爽爽爽爽妓女8888| 亚洲成a∨人片在线观看无码| 国产98色在线 | 日韩| 国产成人无码a区在线观看视频免费| 国产乱人伦偷精品视频免| 免费观看国产短视频的方法| 国内女人喷潮完整视频| 国产精品久久久久久人妻精品| 国产又爽又刺激的视频| 国产精品偷窥女厕视频| 大屁股熟女白浆一区二区| 欧美在线看片a免费观看| 日韩一卡2卡3卡4卡新区亚洲| 亚洲狠狠婷婷综合久久| 国产精品美女久久久m| 撕开奶罩揉吮奶头高潮av| 最新亚洲人成无码网www电影| 波多野结衣不打码视频| 狂野欧美性猛交xxxx| 最大胆裸体人体牲交免费| 成人免费无遮挡在线播放| 国产精品 欧美 亚洲 制服| 在线精品亚洲观看不卡欧|