• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > uc\\os-II 操作系統

    uc\\os-II 操作系統

    作者: 時間:2018-09-04 來源:網絡 收藏

    本文面向首次接觸uC/OS-II的程序員,為他們介紹一下這個系統的一些基本特征和編程上的注意事項,并介紹幾個值得了解的API。本文作者已經成功的將uC/OS-II移植到幾種不同CPU之上。包括EPSON S1C33和Sunplus unSP?等,積累了豐富的經驗,現在愿意和朋友們分享這些經歷。希望本文的資料對于希望使用這個系統來開發的朋友有所幫助,作者樂意與您分享任何您成功的喜悅。

    本文引用地址:http://www.czjhyjcfj.com/article/201809/388406.htm

    This passage is written for the basic programmers who are first developed with the uC/OS-II real time OS。I will talk about the basic structure of this system。And I will discuss how to use some of the useful API。I will also discuss the imp of the mutilty-tasking in uC/OS-II。

    (一) uC/OS-II 簡介

    uC/OS-II是一種基于優先級的可搶先的硬實時內核。自從92年發布以來,在世界各地都獲得了廣泛的應用,它是一種專門為嵌入式設備設計的內核,目前已經被移植到40多種不同結構的CPU上,運行在從8位到64位的各種系統之上。尤其值得一提的是,該系統自從2.51版本之后,就通過了美國FAA認證,可以運行在諸如航天器等對安全要求極為苛刻的系統之上。鑒于uC/OS-II可以免費獲得代碼,對于嵌入式RTOS而言,選擇uC/OS無疑是最經濟的選擇。

    (二) uC/OS-II 應用程序基本結構

    應用uC/OS-II,自然要為它開發應用程序,下面論述基于uC/OS-II的應用程序的基本結構以及注意事項。

    每一個uC/OS-II應用至少要有一個任務。而每一個任務必須被寫成無限循環的形式。以下是推薦的結構:

    void task ( void* pdata )

    {

    INT8U err;

    InitTimer(); // 可選

    For( ;; )

    {

    // 你的應用程序代碼

    …….

    ……..

    OSTimeDly(1); // 可選

    }

    }

    以上就是基本結構,至于為什么要寫成無限循環的形式呢?那是因為系統會為每一個任務保留一個堆棧空間,由系統在任務切換的時候換恢復上下文,并執行一條reti 指令返回。如果允許任務執行到最后一個花括號(那一般都意味著一條ret指令)的話,很可能會破壞系統堆棧空間從而使應用程序的執行不確定。換句話說,就是“跑飛”了。所以,每一個任務必須被寫成無限循環的形式。程序員一定要相信,自己的任務是會放棄CPU使用權的,而不管是系統強制(通過ISR)還是主動放棄(通過調用OS API)。

    現在來談論上面程序中的InitTimer()函數,這個函數應該由系統提供,程序員有義務在優先級最高的任務內調用它而且不能在for循環內調用。注意,這個函數是和所使用的CPU相關的,每種系統都有自己的Timer初始化程序。在uC/OS-II的幫助手冊內,作者特地強調絕對不能在OSInit()或者OSStart()內調用Timer初始化程序,那會破壞系統的可移植性同時帶來性能上的損失。所以,一個折中的辦法就是象上面這樣,在優先級最高的程序內調用,這樣可以保證當OSStart()調用系統內部函數OSStartHighRdy()開始多任務后,首先執行的就是Timer初始化程序。或者專門開一個優先級最高的任務,只做一件事情,那就是執行Timer初始化,之后通過調用OSTaskSuspend()將自己掛起來,永遠不再執行。不過這樣會浪費一個TCB空間。對于那些RAM吃緊的系統來說,還是不用為好。

    2006-7-23 21:55 lanso

    (三) 一些重要的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宏

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


    上一頁 1 2 下一頁

    關鍵詞:

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 什邡市| 新郑市| 天长市| 海林市| 大田县| 晋州市| 甘谷县| 马龙县| 卓资县| 平安县| 曲周县| 大宁县| 固镇县| 洪湖市| 鲁甸县| 遂川县| 尼勒克县| 江陵县| 阳曲县| 鞍山市| 高碑店市| 大渡口区| 治县。| 成安县| 大连市| 晋宁县| 拉萨市| 天门市| 错那县| 鹿泉市| 阿克陶县| 启东市| 绥化市| 宁河县| 莫力| 五原县| 扎囊县| 竹溪县| 泸西县| 扶余县| 云浮市|