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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ucosii在stm32上的移植詳解2

          ucosii在stm32上的移植詳解2

          作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          在詳解1中主要講了移植需要用到的CM3內(nèi)核知識,本文講一講ucosii的原理和代碼組成。ucosii最經(jīng)典的學(xué)習(xí)資料莫過于邵貝貝老師的<<嵌入式實(shí)時操作系統(tǒng)uc/os-ii(第2版)>>,我想這本書對學(xué)ucosii已經(jīng)足夠了,因?yàn)樗製cosii V2.55代碼都講了一遍。移植前應(yīng)該好好看看此書。

          下面說說我對ucosii的理解。應(yīng)該說ucosii這個內(nèi)核還是比較簡單的,基本可以分為任務(wù)調(diào)度,任務(wù)同步和內(nèi)存管理三個部分。

          本文引用地址:http://www.ex-cimer.com/article/201611/318071.htm

          任務(wù)調(diào)度
          ucosii為保證實(shí)時性,給每個任務(wù)分配一個不同的優(yōu)先級。當(dāng)發(fā)生任務(wù)切換時,總是切換到就緒的最高優(yōu)先級任務(wù)。有2種情況會發(fā)生任務(wù)切換。
          1.任務(wù)等待資源就緒或自我延時;
          2.退出中斷;

          情況1可以理解為任務(wù)主動放棄cpu的使用權(quán)。
          情況2可以理解為中斷后,某種資源可能就緒了,需要任務(wù)切換。
          需要注意的是SysTick中斷,這個中斷是os的“心跳”,必須得有。這樣就使得cpu會發(fā)生周期性地做任務(wù)切換。由于ucosii不支持時間片輪轉(zhuǎn)調(diào)度,因此在該中斷中必須做的工作僅有os的時間管理。也就是調(diào)用OSTimeTick()。

          任務(wù)同步
          任務(wù)同步和大多數(shù)操作系統(tǒng)的做法差不多,如果學(xué)過操作系統(tǒng)或是有多線程編程經(jīng)驗(yàn)的話,應(yīng)該很好理解。無非是任務(wù)A因?yàn)槟硞€資源未就緒,就放棄cpu使用權(quán),等任務(wù)B或是中斷使該資源就緒,當(dāng)再次任務(wù)進(jìn)行切換時如果任務(wù)A優(yōu)先級最高,則任務(wù)A繼續(xù)執(zhí)行。具體怎么實(shí)現(xiàn)就看邵老師的書吧。

          內(nèi)存管理
          ucosii的內(nèi)存管理比較簡單,就不說了。

          下面看看ucosii代碼組成:
          os_core.c是ucosii的核心,它包含了內(nèi)核初始化,任務(wù)切換,事件塊管理等,其中事件塊是各個同步量(這里我把互斥量,信號量,郵箱,隊(duì)列統(tǒng)稱為同步量,不是很科學(xué),圖個方便。事件標(biāo)志組不是以事件塊為基礎(chǔ)的,不過原理也差不多)的基礎(chǔ)。

          os_task.c
          任務(wù)管理代碼。

          os_flag.c
          os_mbox.c
          os_mutex.c
          os_q.c
          os_sem.c
          各個同步量管理代碼。

          os_mem.c
          內(nèi)存管理代碼。

          os_time.c
          時間管理代碼,主要做各種延時。

          os_tmr.c
          定時器管理代碼,這部分代碼時從V2.81版才開始有的,邵老師的書講的是V2.55版的代碼,是沒有這部分內(nèi)容的。如果前面的代碼都理解的話,這部分代碼也是不難理解的。一個定時器大體由3部分組成:定時時間,回調(diào)函數(shù)和屬性。當(dāng)定時時間到了的話,就進(jìn)行一次回調(diào)函數(shù)的處理,定時器屬性說明定時器是周期性的定時還是只做一次定時。如果用戶使能了OS_TMR_EN,ucosii會在內(nèi)部創(chuàng)建一個定時器任務(wù),負(fù)責(zé)處理各個定時器。這個任務(wù)一般應(yīng)該由硬件定時器的中斷函數(shù)中調(diào)用OSTmrSignal()去激活。所以從本質(zhì)上說os_tmr.c中的定時器是由一個硬件定時器分化出來的。
          默認(rèn)情況下是由SysTick中斷里通過OSTimeTickHook()去激活定時器任務(wù)的。

          移植相關(guān)文件
          os_cpu.h:
          進(jìn)行數(shù)據(jù)類型定義,處理器相關(guān)代碼和幾個函數(shù)原型。

          os_cpu_c.c:
          定義一些用戶hook函數(shù)。

          os_cpu_a.asm:
          移植需要用匯編代碼完成的函數(shù),主要就是任務(wù)切換函數(shù)。

          os_dbg.c:
          內(nèi)核調(diào)試相關(guān)數(shù)據(jù)和函數(shù),可以不改。

          ucosii內(nèi)核就介紹到這里。



          關(guān)鍵詞: ucosiistm32移植詳

          評論


          技術(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); })();