国产一区二区精品在线_午夜精品视频_亚洲国产高清高潮精品美女_久久久91_午夜精品视频_久久久久亚洲一区二区三区

ucos-Ⅱ 初級程序員指南

來源:網(wǎng)絡(luò)

點(diǎn)擊:2098

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞: ucos-Ⅱ

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

        (一) uC/OS-II 簡介

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

        (二) uC/OS-II 應(yīng)用程序基本結(jié)構(gòu)

        應(yīng)用uC/OS-II,自然要為它開發(fā)應(yīng)用程序,下面論述基于uC/OS-II的應(yīng)用程序的基本結(jié)構(gòu)以及注意事項(xiàng)。

        每一個uC/OS-II應(yīng)用至少要有一個任務(wù)。而每一個任務(wù)必須被寫成無限循環(huán)的形式。以下是推薦的結(jié)構(gòu):

    void task ( void* pdata )
    {
           INT8U err;
           InitTimer(); // 可選
           For( ;; )

          {
                   // 你的應(yīng)用程序代碼
                   …….
                   ……..
                  OSTimeDly(1); // 可選
           }
    }
        以上就是基本結(jié)構(gòu),至于為什么要寫成無限循環(huán)的形式呢?那是因?yàn)橄到y(tǒng)會為每一個任務(wù)保留一個堆棧空間,由系統(tǒng)在任務(wù)切換的時候換恢復(fù)上下文,并執(zhí)行一條reti 指令返回。如果允許任務(wù)執(zhí)行到最后一個花括號(那一般都意味著一條ret指令)的話,很可能會破壞系統(tǒng)堆棧空間從而使應(yīng)用程序的執(zhí)行不確定。換句話說,就是“跑飛”了。所以,每一個任務(wù)必須被寫成無限循環(huán)的形式。程序員一定要相信,自己的任務(wù)是會放棄CPU使用權(quán)的,而不管是系統(tǒng)強(qiáng)制(通過ISR)還是主動放棄(通過調(diào)用OS API)。

        現(xiàn)在來談?wù)撋厦娉绦蛑械腎nitTimer()函數(shù),這個函數(shù)應(yīng)該由系統(tǒng)提供,程序員有義務(wù)在優(yōu)先級最高的任務(wù)內(nèi)調(diào)用它而且不能在for循環(huán)內(nèi)調(diào)用。注意,這個函數(shù)是和所使用的CPU相關(guān)的,每種系統(tǒng)都有自己的Timer初始化程序。在uC/OS-II的幫助手冊內(nèi),作者特地強(qiáng)調(diào)絕對不能在OSInit()或者OSStart()內(nèi)調(diào)用Timer初始化程序,那會破壞系統(tǒng)的可移植性同時帶來性能上的損失。所以,一個折中的辦法就是象上面這樣,在優(yōu)先級最高的程序內(nèi)調(diào)用,這樣可以保證當(dāng)OSStart()調(diào)用系統(tǒng)內(nèi)部函數(shù)OSStartHighRdy()開始多任務(wù)后,首先執(zhí)行的就是Timer初始化程序。或者專門開一個優(yōu)先級最高的任務(wù),只做一件事情,那就是執(zhí)行Timer初始化,之后通過調(diào)用OSTaskSuspend()將自己掛起來,永遠(yuǎn)不再執(zhí)行。不過這樣會浪費(fèi)一個TCB空間。對于那些RAM吃緊的系統(tǒng)來說,還是不用為好。

     

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

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

    1)任務(wù)類

    2)消息類

    3)同步類

    4)時間類

    5)臨界區(qū)與事件類

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

    1) OSTaskCreate函數(shù)

        這個函數(shù)應(yīng)該至少再main函數(shù)內(nèi)調(diào)用一次,在OSInit函數(shù)調(diào)用之后調(diào)用。作用就是創(chuàng)建一個任務(wù)。目前有四個參數(shù),分別是任務(wù)的入口地址,任務(wù)的參數(shù),任務(wù)堆棧的首地址和任務(wù)的優(yōu)先級。調(diào)用本函數(shù)后,系統(tǒng)會首先從TCB空閑列表內(nèi)申請一個空的TCB指針,然后將會根據(jù)用戶給出參數(shù)初始化任務(wù)堆棧,并在內(nèi)部的任務(wù)就緒表內(nèi)標(biāo)記該任務(wù)為就緒狀態(tài)。最后返回,這樣一個任務(wù)就創(chuàng)建成功了。

    2) OSTaskSuspend函數(shù)

        這個函數(shù)很簡單,一看名字就該明白它的作用,它可以將指定的任務(wù)掛起。如果掛起的是當(dāng)前任務(wù)的話,那么還會引發(fā)系統(tǒng)執(zhí)行任務(wù)切換先導(dǎo)函數(shù)OSShed來進(jìn)行一次任務(wù)切換。這個函數(shù)只有一個參數(shù),那就是指定任務(wù)的優(yōu)先級。那為什么是優(yōu)先級呢?事實(shí)上在系統(tǒng)內(nèi)部,優(yōu)先級除了表示一個任務(wù)執(zhí)行的先后次序外,還起著分別每一個任務(wù)的作用,換句話說,優(yōu)先級也就是任務(wù)的ID。所以uC/OS-II不允許出現(xiàn)相同優(yōu)先級的任務(wù)。

    3) OSTaskResume函數(shù)

        這個函數(shù)和上面的函數(shù)正好相反,它用于將指定的已經(jīng)掛起的函數(shù)恢復(fù)成就緒狀態(tài)。如果恢復(fù)任務(wù)的優(yōu)先級高于當(dāng)前任務(wù),那么還為引發(fā)一次任務(wù)切換。其參數(shù)類似OSTaskSuspend函數(shù),為指定任務(wù)的優(yōu)先級。需要特別說明是,本函數(shù)并不要求和OSTaskSuspend函數(shù)成對使用。

    4) OS_ENTER_CRITICAL宏

        很多人都以為它是個函數(shù),其實(shí)不然,仔細(xì)分析一下OS_CPU.H文件,它和下面馬上要談到的OS_EXIT_CRITICAL都是宏。他們都是涉及特定CPU的實(shí)現(xiàn)。一般都被替換為一條或者幾條嵌入式匯編代碼。由于系統(tǒng)希望向上層程序員隱藏內(nèi)部實(shí)現(xiàn),故而一般都宣稱執(zhí)行此條指令后系統(tǒng)進(jìn)入臨界區(qū)。其實(shí),它就是關(guān)個中斷而已。這樣,只要任務(wù)不主動放棄CPU使用權(quán),別的任務(wù)就沒有占用CPU的機(jī)會了,相對這個任務(wù)而言,它就是獨(dú)占了。所以說進(jìn)入臨界區(qū)了。這個宏能少用還是少用,因?yàn)樗鼤茐南到y(tǒng)的一些服務(wù),尤其是時間服務(wù)。并使系統(tǒng)對外界響應(yīng)性能降低。

    5) OS_EXIT_CRITICAL宏

        這個是和上面介紹的宏配套使用另一個宏,它在系統(tǒng)手冊里的說明是退出臨界區(qū)。其實(shí)它就是重新開中斷。需要注意的是,它必須和上面的宏成對出現(xiàn),否則會帶來意想不到的后果。最壞的情況下,系統(tǒng)會崩潰。我們推薦程序員們盡量少使用這兩個宏調(diào)用,因?yàn)樗麄兊拇_會破壞系統(tǒng)的多任務(wù)性能。

    6) OSTimeDly函數(shù)


        這應(yīng)該程序員們調(diào)用最多的一個函數(shù)了,這個函數(shù)完成功能很簡單,就是先掛起當(dāng)起當(dāng)前任務(wù),然后進(jìn)行任務(wù)切換,在指定的時間到來之后,將當(dāng)前任務(wù)恢復(fù)為就緒狀態(tài),但是并不一定運(yùn)行,如果恢復(fù)后是優(yōu)先級最高就緒任務(wù)的話,那么運(yùn)行之。簡單點(diǎn)說,就是可以任務(wù)延時一定時間后再次執(zhí)行它,或者說,暫時放棄CPU的使用權(quán)。一個任務(wù)可以不顯式的調(diào)用這些可以導(dǎo)致放棄CPU使用權(quán)的API,但那樣多任務(wù)性能會大大降低,因?yàn)榇藭r僅僅依靠時鐘機(jī)制在進(jìn)行任務(wù)切換。一個好的任務(wù)應(yīng)該在完成一些操作主動放棄使用權(quán),好東西要大家分享嘛!

     

        四) uC/OS-II 多任務(wù)實(shí)現(xiàn)機(jī)制分析


        前面已經(jīng)說過,uC/OS-II是一種基于優(yōu)先級的可搶先的多任務(wù)內(nèi)核。那么,它的多任務(wù)機(jī)制到底如何實(shí)現(xiàn)的呢?了解這些原理,可以幫助我們寫出更加健壯的代碼來。由于我們面向的初級程序員,本文不打算寫成又一篇uC/OS-II的源碼分析,那樣的文章太多了,本文打算從實(shí)現(xiàn)原理的角度探討這個問題。
    首先我們來看看為什么多任務(wù)機(jī)制可以實(shí)現(xiàn)?其實(shí)在單一CPU的情況下,是不存在真正的多任務(wù)機(jī)制的,存在的只有不同的任務(wù)輪流使用CPU,所以本質(zhì)上還是單任務(wù)的。但由于CPU執(zhí)行速度非常快,加上任務(wù)切換十分頻繁并且切換的很快,所以我們感覺好像有很多任務(wù)同時在運(yùn)行一樣。這就是所謂的多任務(wù)機(jī)制。

      

        由上面的描述,不難發(fā)現(xiàn),要實(shí)現(xiàn)多任務(wù)機(jī)制,那么目標(biāo)CPU必須具備一種在運(yùn)行期更改PC的途徑,否則無法做到切換。不幸的使,直接設(shè)置PC指針,目前還沒有哪個CPU支持這樣的指令。但是一般CPU都允許通過類似JMP,CALL這樣的指令來間接的修改PC。我們的多任務(wù)機(jī)制的實(shí)現(xiàn)也正是基于這個出發(fā)點(diǎn)。事實(shí)上,我們使用CALL指令或者軟中斷指令來修改PC,主要是軟中斷。但在一些CPU上,并不存在軟中斷這樣的概念,所以,我們在那些CPU上,使用幾條PUSH指令加上一條CALL指令來模擬一次軟中斷的發(fā)生。

      
        回想一下你在微機(jī)原理課程上學(xué)過的知識,當(dāng)發(fā)生中斷的時候,CPU保存當(dāng)前的PC和狀態(tài)寄存器的值到堆棧里,然后將PC設(shè)置為中斷服務(wù)程序的入口地址,再下來一個機(jī)器周期,就可以去執(zhí)行中斷服務(wù)程序了。執(zhí)行完畢之后,一般都是執(zhí)行一條RETI指令,這條指令會把當(dāng)前堆棧里的值彈出恢復(fù)到狀態(tài)寄存器和PC里。這樣,系統(tǒng)就會回到中斷以前的地方繼續(xù)執(zhí)行了。那么設(shè)想一下?如果再中斷的時候,人為的更改了堆棧里的值,那會發(fā)生什么?或者通過更改當(dāng)前堆棧指針的值,又會發(fā)生什么呢?如果更改是隨意的,那么結(jié)果是無法預(yù)料的錯誤。因?yàn)槲覀儫o法確定機(jī)器下一條會執(zhí)行些什么指令,但是如果更改是計(jì)劃好的,按照一定規(guī)則的話,那么我們就可以實(shí)現(xiàn)多任務(wù)機(jī)制。事實(shí)上,這就是目前幾乎所有的OS的核心部分。不過他們的實(shí)現(xiàn)不像這樣簡單罷了。

        下面,我們來看看uC/OS-II再這方面是怎么處理的。再uC/OS-II里,每個任務(wù)都有一個任務(wù)控制塊(Task Control Block),這是一個比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。在任務(wù)控制快的偏移為0的地方,存儲著一個指針,它記錄了所屬任務(wù)的專用堆棧地址。事實(shí)上,再uC/OS-II內(nèi),每個任務(wù)都有自己的專用堆棧,彼此之間不能侵犯。這點(diǎn)要求程序員再他們的程序中保證。一般的做法是把他們申明成靜態(tài)數(shù)組。而且要申明成OS_STK類型。當(dāng)任務(wù)有了自己的堆棧,那么就可以將每一個任務(wù)堆棧再那里記錄到前面談到的任務(wù)控制快偏移為0的地方。以后每當(dāng)發(fā)生任務(wù)切換,系統(tǒng)必然會先進(jìn)入一個中斷,這一般是通過軟中斷或者時鐘中斷實(shí)現(xiàn)。然后系統(tǒng)會先把當(dāng)前任務(wù)的堆棧地址保存起來,僅接著恢復(fù)要切換的任務(wù)的堆棧地址。由于哪個任務(wù)的堆棧里一定也存的是地址(還記得我們前面說過的,每當(dāng)發(fā)生任務(wù)切換,系統(tǒng)必然會先進(jìn)入一個中斷,而一旦中斷CPU就會把地址壓入堆棧),這樣,就達(dá)到了修改PC為下一個任務(wù)的地址的目的。

        以上就是uC/OS-II的多任務(wù)實(shí)現(xiàn)機(jī)制,我們在這里大費(fèi)筆墨談?wù)撨@個問題,是希望我們的程序員們可以善加利用這個機(jī)制,寫出更健壯,更富有效率的代碼來。

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請聯(lián)系我們刪除。

    国产一区二区精品在线_午夜精品视频_亚洲国产高清高潮精品美女_久久久91_午夜精品视频_久久久久亚洲一区二区三区
    <cite id="gqusq"><tbody id="gqusq"></tbody></cite>
    <strike id="gqusq"><tbody id="gqusq"></tbody></strike>
    <abbr id="gqusq"><rt id="gqusq"></rt></abbr>
  • <strike id="gqusq"><tbody id="gqusq"></tbody></strike>
    <ul id="gqusq"></ul>
    <center id="gqusq"><noscript id="gqusq"></noscript></center>
  • 欧洲国产精品| 91视频在线免费观看| 国产乱码精品一区二区三区卡| 一本久道久久综合狠狠爱亚洲精品| 裸体一区二区| 亚洲国产影院| 欧美一区二区三区久久精品| 欧美精品国产精品久久久| 久久精品导航| 免费久久久一本精品久久区| 在线视频观看日韩| 午夜日本精品| 欧美精品国产一区| 午夜欧美一区二区三区免费观看| 国产精品一区在线播放| 香蕉精品999视频一区二区 | 欧美在线免费一级片| 欧美日韩国产高清视频| 91免费版网站在线观看| 美女日韩在线中文字幕| 国产女主播一区二区| 国产一区二区你懂的| 在线成人av| 亚洲精品一区二| 99在线热播精品免费99热| 91久久极品少妇xxxxⅹ软件| 国产一区日韩一区| 精品动漫3d一区二区三区免费| 欧美视频亚洲视频| 午夜精品999| 18成人免费观看视频| 亚洲精品视频一区二区三区| 亚洲精品视频一区二区三区| av成人毛片| 久久精品国产清高在天天线 | 亚洲 国产 欧美一区| 欧美精品二区三区四区免费看视频 | 午夜日韩电影| 国产综合精品| 亚洲久久一区| 久久久久久久高潮| 国产欧美日本在线| 日韩欧美精品久久| 国产精品对白刺激久久久| 亚洲精品免费观看| 久久五月激情| 麻豆精品蜜桃一区二区三区| 久久超碰亚洲| 亚洲欧洲三级| 亚洲青涩在线| 久久久亚洲一区| 久久伊人资源站| 天堂精品一区二区三区| 动漫3d精品一区二区三区| 久久精品国产精品青草色艺| 日韩一本精品| 一区二区欧美日韩| 国产精品一区二区欧美| 亚洲国产一区二区精品视频 | 神马影院午夜我不卡影院| 欧美日韩成人一区二区三区| 亚洲东热激情| 国产综合 伊人色| 亚洲一区二区不卡视频| 亚洲麻豆av| 久久视频在线观看中文字幕| 国产精品激情电影| 久久久久久久久一区二区| 欧美高清视频一区| 最新亚洲激情| 免费在线一区二区| 国产欧美日韩综合一区在线播放 | 国产综合第一页| 精品1区2区3区4区| 久久婷婷国产综合尤物精品| 精品99视频| 蜜桃久久影院| 性色一区二区三区| 亚洲一区美女| 国产精品.com| 激情久久久久久| 欧美日韩一区二| 亚洲一区二区毛片| 中文字幕日韩一区二区三区| 97免费资源站| 99精品欧美| 欧美伊人久久| 免费一区二区三区| 久久午夜视频| 18成人免费观看视频| 欧美日韩一区二区三区免费| 免费视频久久| 亚洲国产精品久久久久婷婷老年| 欧美人与性禽动交精品| 久久国产66| 亚洲国产精品综合| 欧美fxxxxxx另类| 欧美高清一区二区| 99影视tv| 麻豆久久婷婷| 亚洲精品国产日韩| 亚洲视频高清| 中文字幕一区综合| 青青草原成人| 欧美第一黄网| 精品高清视频| 国产富婆一区二区三区| 久久久久一区二区| 国产精品一区二区a| 欧美激情第10页| 亚洲精品国产精品国自产| 精品国产乱码久久久久久丨区2区| 亚洲女同在线| 亚洲一区欧美激情| 中文精品视频| 日韩午夜在线电影| 亚洲精品乱码| 国产午夜久久| 一区二区精品| 亚洲毛片av| 一本一本a久久| 国产精品呻吟| 99精品福利视频| 日韩亚洲视频在线| 亚洲国产一区二区三区在线播| 国产在线精品二区| 影音国产精品| 亚洲福利专区| 亚洲青涩在线| 亚洲欧美清纯在线制服| 国产精品手机在线| 麻豆精品视频| av在线亚洲男人的天堂| 俄罗斯精品一区二区三区| 久久激情中文| 国产日韩欧美一区二区| 久久久一本精品99久久精品| 欧美12av| 亚洲精品国产精品国自产| 中国成人亚色综合网站| 欧美日韩综合网| 夜夜精品视频| 久久精品道一区二区三区| 性色av一区二区怡红| 国产私拍一区| 欧美在线首页| 亚洲少妇一区| 不卡视频一区| 欧美二级三级| 国产精品v日韩精品v欧美精品网站| 亚洲一二三区在线| 亚洲在线播放电影| 尤物精品在线| 91久久精品www人人做人人爽| 国产精品久久国产三级国电话系列| 久久国产精品久久精品国产| 欧美日韩在线一区二区三区| 欧美在线亚洲综合一区| 亚洲少妇诱惑| 精品欧美一区二区久久久伦| 女人香蕉久久**毛片精品| 一本色道久久综合| 久久综合九九| 亚洲精品极品| 久久综合精品一区| 在线成人h网| 久久波多野结衣| 欧美日韩一区二区三区免费| 性伦欧美刺激片在线观看| 久久国产主播精品| 欧美久久成人| 国产精品yjizz| 中文字幕中文字幕99| 久久久人人人| 欧美一区高清| 不卡视频一区| 亚洲无线视频| 久久影院理伦片| 国产日韩欧美一区二区| 人禽交欧美网站免费| 国产精品一区二区欧美| 视频一区二区在线| 久久精品三级| 亚洲一级特黄| 欧美日韩亚洲在线| 91在线看网站| 亚洲狠狠婷婷| 三级三级久久三级久久18| 奶水喷射视频一区| 国产精品s色| 亚洲高清在线播放| 国产91一区二区三区| 亚洲视频www| 欧美精品午夜| 免费成人看片网址| 成人黄动漫网站免费| 亚洲少妇一区| 好吊色欧美一区二区三区四区 | 欧美日韩在线精品一区二区三区| 国产精品入口66mio|