新聞中心

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

        uc\\os-II 操作系統

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

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

        本文引用地址:http://www.104case.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); // 可選

        }

        }

        以上就是基本結構,至于為什么要寫成無限循環的形式呢?那是因為系統會為每一個任務保留一個堆??臻g,由系統在任務切換的時候換恢復上下文,并執行一條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 下一頁

        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 黄大仙区| 普兰店市| 岳普湖县| 民丰县| 锦州市| 德清县| 黄龙县| 靖安县| 农安县| 邵武市| 连南| 萝北县| 中西区| 额尔古纳市| 菏泽市| 南江县| 合作市| 司法| 林口县| 新干县| 松溪县| 昆山市| 隆化县| 玉门市| 康乐县| 福鼎市| 安新县| 金川县| 尤溪县| 太谷县| 天全县| 南京市| 双牌县| 喀什市| 博兴县| 宝兴县| 固原市| 仁布县| 阿巴嘎旗| 龙游县| 平舆县|