在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于單片機的協(xié)程多任務

            基于單片機的協(xié)程多任務

            作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏
            在很多的單片機項目中,由于操作系統(tǒng)的體積以及使用的背景知識,如果采用的話,可能讓項目脫離主要業(yè)務方向,這個時候很有必要使用簡單的協(xié)程多任務。
            1協(xié)程多任務的特點
            每個任務優(yōu)先級平等
            每個任務主動釋放CPU控制權
            2 UCOS等操作系統(tǒng)的特點
            任務存在不同優(yōu)先級,很方便進行CPU資源的分配。
            對于ucos的任務來說,每個任務都認為自己是獨占cpu的,可以隨便休眠之類,這樣對于代碼的風格的限制比較小,比較好修改現(xiàn)存的模塊。
            操作系統(tǒng)一般提供比較多的服務,對于復雜應用比較好。
            3 協(xié)程多任務的應用場合
            協(xié)程方式適合簡單的多任務,每個任務要確認其符合協(xié)程的模型,不能阻塞cpu運行,要主動釋放CPU,如果考慮到多人合作,或者引入第三方的代碼,進來,那么協(xié)程方式恐怕工作量過大(模型改造檢查),這時最好使用操作系統(tǒng)。
            協(xié)程或者操作系統(tǒng)的平臺的建立,這些都需要積累,也沒有什么高級和低級的區(qū)別,只是針對不同的場景和開發(fā)人員選擇不同而已。
            4協(xié)程多任務的實現(xiàn)
            為了使用方便,并且將來便于系統(tǒng)升級,多任務采用基于接口的方式定義和實現(xiàn)。
            4.1 任務的定義
            每個任務會管理自己的數(shù)據(jù),提供對外接口,每個任務提供以下形式結(jié)構
            Struct _task1
            {
            //任務對外接口,函數(shù)指針
            Void (*start)(Struct _task1*handle);
            Void (*run)(Struct _task1*handle);
            Void (*stop)(Struct _task1*handle);
            //其他對外接口
            ...
            //任務私有數(shù)據(jù)
            } task1;
            之所以將對外接口放在任務結(jié)構體中,是為了強調(diào)這些是任務的對外接口,而且客戶只能調(diào)用這里面的接口,另外函數(shù)指針也很方便的提供了一個接口和實現(xiàn)的分隔層
            4.2 任務的實現(xiàn)
            任務的實現(xiàn)層面,用戶可以根據(jù)對系統(tǒng)和業(yè)務的理解,做系統(tǒng)演化,而不會影響到外部接口的使用
            //任務接口實現(xiàn)函數(shù)
            Void task1_start(Struct _task1*handle)
            {
            //設置任務開始標識
            }
            Void task1_run(Struct _task1*handle)
            {
            If(handle->status1)
            {
            //處理
            }
            Else if(handle->status2)
            {
            //處理
            }
            }
            Void task1_stop(Struct _task1*handle)
            {
            //設置任務結(jié)束標識
            }
            //任務初始化函數(shù),構造任務結(jié)構體
            Void task1_init(Struct _task1*handle)
            {
            Handle->start = task_start;
            Handle->run = task_run;
            Handle->stop= task_stop;
            }
            4.3 調(diào)用形式
            4.3.1 定義全局任務結(jié)構體
            Struct _task1
            {
            //任務對外接口,函數(shù)指針
            Void (*start)(Struct _task1*handle);
            Void (*run)(Struct _task1*handle);
            Void (*stop)(Struct _task1*handle);
            //其他對外接口
            ...
            //任務私有數(shù)據(jù)
            } task1;
            4.3.2 任務初始化
            Task1_init(&task1);
            4.3.3 開始任務
            Task1->start(&task1);
            4.3.4 結(jié)束任務
            Task1->stop(&task1);
            4.3.5 任務運行
            一般系統(tǒng)在啟動后運行的一個無限循環(huán)語句中有
            While(1)
            {
            Task1->run(&task1);
            Task2->run(&task2)
            ...其他任務運行
            }
            5 定時器以及延時的實現(xiàn)方法
            協(xié)程多任務不會在代碼中使用sleep()阻塞CPU的方法做定時器或者休眠,定時器會有一個單獨的任務,任務提供新增定時器、刪除定時器、查詢定時器值等接口來提供軟件定時器功能。
            6 任務間通訊
            原則上通過任務提供的接口來通訊,當然如果通訊工作量過大,不反對使用第三方任務來完成通訊。
            7 驅(qū)動層模塊任務例子
            對于務來說,應用層和驅(qū)動層是優(yōu)先級相同的任務,對于很多的驅(qū)動來說,例如UART驅(qū)動,其發(fā)送和接收很多采用的是查詢的方式來進行,下面簡單的使用多任務的結(jié)構方式來說明驅(qū)動的寫作
            Struct _com{
            //任務對外接口,函數(shù)指針
            Void (*start)(Struct _com*handle);
            Void (*run)(Struct _com*handle);
            Void (*stop)(Struct _com*handle);
            //其他對外接口
            Void read(char* ch)
            Void write(char* ch)
            ...
            //任務私有數(shù)據(jù)
            //驅(qū)動狀態(tài),
            Char status;
            }com1;
            //運行代碼
            Void Com_run(Struct _com * handle)
            {
            If(read)
            {
            If(register1)
            {
            }
            Else if(register2)
            {
            }
            }
            Else if(write)
            {
            If(register3)
            {
            }
            Else if(register4)
            {
            }
            }
            }
            從上面代碼可見,驅(qū)動模塊其實和普通的任務沒有區(qū)別。


            評論


            技術專區(qū)

            關閉