<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于單片機(jī)的協(xié)程多任務(wù)

          基于單片機(jī)的協(xié)程多任務(wù)

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


          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();