找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23187|回復(fù): 31
收起左側(cè)

從0到1教你寫uCOS-III教程(基于STM32單片機(jī))

  [復(fù)制鏈接]
ID:384378 發(fā)表于 2018-8-8 22:12 | 顯示全部樓層 |閱讀模式
1.1 如何學(xué)習(xí)本書
本書與市面上的任何一本 uC/OS-III 相關(guān)的書都不一樣,它們要么是翻譯官方的參考手冊,要么是講如何使用 uC/OS-III,要么是講 uC/OS-III 的源碼,而本書是教你怎么從 0 開始把 uC/OS-III 寫出來,既講了源碼實(shí)現(xiàn),也講了 API 如何使用。當(dāng)你拿到本書開始學(xué)習(xí)的時(shí)候你一定會驚訝,原來 RTOS 的學(xué)習(xí)并沒有那么復(fù)雜,反而是那么的有趣,原來自己也可以寫 OS,成就感立馬爆棚。

全書內(nèi)容循序漸進(jìn),不斷迭代,前一章都是后一章的基礎(chǔ),必須從頭開始閱讀,不能進(jìn)行跳躍式的閱讀。在學(xué)習(xí)的時(shí)候務(wù)必做到兩點(diǎn):一是不能一味地看書,要把代碼和書本結(jié)合起來學(xué)習(xí),一邊看書,一邊調(diào)試代碼。看書倒是很簡單,那如何調(diào)試代碼?即單步執(zhí)行每一條程序,看看程序的執(zhí)行流程和執(zhí)行的效果與自己大腦所想是不是一樣;二是在每學(xué)完一章之后,必須將配套的例程重寫一遍(切記不要復(fù)制,哪怕是一個(gè)分號,但可以抄),做到舉一反三,確保真正理解。在自己寫的時(shí)候肯定會錯(cuò)漏百出,這個(gè)時(shí)候要珍惜這些錯(cuò)誤,好好調(diào)試,這是你提高編程能力的最好的機(jī)會。記住,程序不是寫出來的,而是調(diào)試出來的。
1.2 本書的參考資料
1、 uC/OS-III 官方源代碼
2、 uCOS-III 中文翻譯 (電子版)
3、 嵌入式操作系統(tǒng) uCOS-II(第二版) (電子版)
4、 嵌入式實(shí)時(shí)操作系統(tǒng)μCOS-II 原理及應(yīng)用 任哲編著 (電子版)
5、 CM3 權(quán)威指南 CnR2 (電子版)
6、 STM32F10xxx Cortex-M3 programming manual (電子版)
1.3 本書的編寫風(fēng)格
本書以 uC/OS-III 官方源碼為藍(lán)本,抽絲剝繭,不斷迭代,教你怎么從 0 開始把uC/OS-III 寫出來。書中涉及到的數(shù)據(jù)類型,變量名稱、函數(shù)名稱,文件名稱,文件存放的位置都完全按照 uC/OS-III 官方的方式來實(shí)現(xiàn),當(dāng)你學(xué)完這本書之后可以無縫地切換到原版的 uC/OS-III 的使用。要注意的是,在實(shí)現(xiàn)的過程中,某些函數(shù)我會去掉一些形參和一些冗余的代碼,只保留核心的功能,但這并不會影響我們學(xué)習(xí)。
0.png

第2章 如何學(xué)習(xí) RTOS

2.1 為什么要學(xué)習(xí) RTOS
當(dāng)我們進(jìn)入嵌入式這個(gè)領(lǐng)域的時(shí)候,往往首先接觸的都是單片機(jī)編程,單片機(jī)編程又首選 51 單片機(jī)來入門。這里面說的單片機(jī)編程通常都是指裸機(jī)編程,即不加入任何 RTOS(Real Time Operation System 實(shí)時(shí)操作系統(tǒng))的程序。常用的 RTOS 有國外的 FreeRTOS、ucOS、RTX 和國內(nèi)的 Huawei LiteOS、和 RT-Thread 等,其中尤以開源且免費(fèi)的 FreeRTOS的市場占有率最高,歷史悠久的 ucos 屈居第二。

在裸機(jī)系統(tǒng)中,所有的程序基本都是自己寫的,所有的操作都是在一個(gè)無限的大循環(huán)里面實(shí)現(xiàn),F(xiàn)實(shí)生活中的很多中小型的電子產(chǎn)品用的都是裸機(jī)系統(tǒng),而且也能夠滿足需求。但是為什么還要學(xué)習(xí) RTOS 編程,偏偏還要整個(gè)操作系統(tǒng)進(jìn)來。一是項(xiàng)目需要,隨著產(chǎn)品要實(shí)現(xiàn)的功能越來越多,單純的裸機(jī)系統(tǒng)已經(jīng)不能夠完美地解決問題,反而會使編程變得更加復(fù)雜,如果想降低編程的難度,我們可以考慮引入 RTOS 實(shí)現(xiàn)多任務(wù)管理,這是使用RTOS 的最大優(yōu)勢。二是學(xué)習(xí)的需要,必須學(xué)習(xí)更高級的東西,實(shí)現(xiàn)更好的職業(yè)規(guī)劃,為將來走向人生巔峰迎娶白富美做準(zhǔn)備,而不是一味的在裸機(jī)編程上面死磕。作為一個(gè)合格的嵌入式軟件工程師,學(xué)習(xí)是永遠(yuǎn)不能停止的事,時(shí)刻都在為將來準(zhǔn)備。書到用時(shí)方恨少,我希望機(jī)會來臨時(shí)你不要有這種感覺。
為了幫大家理清 RTOS 編程的套路,下面我們簡單的分析下這兩種編程方式的區(qū)別,這個(gè)區(qū)別我稱它為學(xué)習(xí) RTOS 的命門,只要打通這個(gè)任督二脈,以后的 RTOS 學(xué)習(xí)可以說是易如反掌。在講解這兩種編程方法的區(qū)別的時(shí)候,我們主要講方法論,不會涉及到具體的代碼編程,主要還是通過偽代碼來講解。

2.2 如何學(xué)習(xí) RTOS
裸機(jī)編程和 RTOS 編程的風(fēng)格有些不一樣,而且有很多人說 RTOS 的學(xué)習(xí)很難,這就導(dǎo)致學(xué)習(xí)的人一聽到 RTOS 編程就在心理面忌憚三分,結(jié)果就是出師未捷身先死。那么到底如何學(xué)習(xí)一個(gè) RTOS?最簡單的就是在別人移植好的系統(tǒng)之上,看看 RTOS里面的 API 使用說明,然后調(diào)用這些 API 實(shí)現(xiàn)自己想要的功能即可。完全,不用關(guān)心底層的移植,這是最簡單快速的入門方法。這種方法各有利弊,如果是做產(chǎn)品,好處是可以快速的實(shí)現(xiàn)功能,將產(chǎn)品推向市場,贏得先機(jī),弊端是當(dāng)程序出現(xiàn)問題的時(shí)候,因?qū)@個(gè)RTOS 不夠了解,會導(dǎo)致調(diào)試?yán)щy,焦頭爛額,一籌莫展。如果是學(xué)習(xí),那么只會簡單的調(diào)用 API,那是不可取的,我們應(yīng)該深入的學(xué)習(xí)其中一款 RTOS。目前市場上現(xiàn)有的 RTOS,它們的內(nèi)核實(shí)現(xiàn)方式都差不多,我們只需要深入學(xué)習(xí)其中一款就行。萬變不離其宗,以后換到其它型號的 RTOS,使用起來,那自然是得心應(yīng)手。那如何深入的學(xué)習(xí)一款 RTOS?這里有一個(gè)最有效也是最難的方法,就是閱讀 RTOS 的源碼,深究內(nèi)核和每個(gè)組建的實(shí)現(xiàn)方式,這個(gè)過程枯燥且痛苦。但為了能夠?qū)W到 RTOS 的精華,你不入地獄誰入地獄?

市面上雖然有一些講解相關(guān) RTOS 源碼的書,如果你基礎(chǔ)不夠,且先前沒有使用過該款 RTOS,那么源碼看起來還是會非?菰,且并不能從全局掌握整個(gè) RTOS 的構(gòu)成和實(shí)現(xiàn)。
現(xiàn)在,我們采用一種全新的方法來教大家學(xué)習(xí)一款 RTOS,即不是單純的講里面的API 如何使用,也不是單純的拿里面的源碼一句句來講解。而是,從 0 開始,層層疊加,不斷地完善,教大家怎么把一個(gè) RTOS 寫 0 到 1 寫出來,讓你在每一個(gè)階段都能享受到成功的喜悅。在這個(gè) RTOS 實(shí)現(xiàn)的過程中,只需要你具備 C 語言的基礎(chǔ)就行,然后就是跟著我們這個(gè)教程篤定前行,最后定有所成。
這個(gè)用來教學(xué)的 RTOS,我們不會完全自己寫一個(gè),不會再重復(fù)的造輪子,而是選取年齡最大(26 歲)、商業(yè)化最成功、安全驗(yàn)證最多的 uC/OS-III 為藍(lán)本,將其抽絲剝繭,層層疊加,從 0 到 1 寫出來。在實(shí)現(xiàn)的過程中,數(shù)據(jù)類型、變量名、函數(shù)名稱、文件類型等都完全按照 uC/OS-III 里面的寫法,不會自己再重新命名。這樣學(xué)完我們這個(gè)課程之后,就可以無縫地過度到 uC/OS-III 的使用。
2.3 如何選擇 RTOS
選擇一個(gè) RTOS 要看下你是學(xué)習(xí)還是做產(chǎn)品,如果是學(xué)習(xí)則選擇一個(gè)年齡最大,商業(yè)化最成功,安全驗(yàn)證最多的來學(xué)習(xí),而且是深入學(xué)習(xí)。那么符合前面這幾個(gè)標(biāo)準(zhǔn)的只有ucos,所以,學(xué)一個(gè) RTOS,首選 ucos,而且 ucos 的資料是最多的。當(dāng)然,選擇其他的RTOS 來學(xué)習(xí)也是可以的。學(xué)完之后就是要用了,如果是產(chǎn)品中使用 ucos 就要面臨授權(quán)的問題,就是要給版權(quán)費(fèi)。一聽到要給錢,大家肯定是不樂意了,所以開源免費(fèi)的FreeRTOS 就受到各個(gè)半導(dǎo)體廠商和開發(fā)者的青睞。目前,F(xiàn)reeRTOS 是市場占有率最高的RTOS,非常適合用來做產(chǎn)品。另外,國內(nèi)的 RT-Thread 也在迅速的崛起,同樣是開源免費(fèi)。

第3章 新建工程—軟件仿真
  在開始寫 RTOS 之前,我們先新建一個(gè)工程,Device 選擇 Cortex-M3 內(nèi)核的處理器,調(diào)試方式選擇軟件仿真,到最后寫完整個(gè) RTOS 之后,我們再把 RTOS 移植到野火 STM32開發(fā)板上,到了最后的移植其實(shí)已經(jīng)非常簡單,只需要換一下啟動文件和添加 bsp 驅(qū)動就行。

3.1 新建本地工程文件夾
在開始新建工程之前,我們先在本地電腦端新建一個(gè)文件夾用于存放工程。文件夾名字我們?nèi)?RTOS,然后再在該文件夾下面新建各個(gè)文件夾和文件,有關(guān)這些文件夾的包含關(guān)系和作用具體見表格 3-1。

表格 3-1 工程文件夾根目錄下的文件夾的作用
0.png

3.2 使用 KEIL 新建工程
開發(fā)環(huán)境我們使用 KEIL5,版本為 5.15,高于或者低于 5.15 都行,只要是版本 5 就行。

3.2.1 New Progect
首先打開 KEIL5 軟件,新建一個(gè)工程,工程文件放在目錄 Project\RVMDK(uv5)下面,名稱命名為 YH-uCOS-III,其中 YH 是野火拼音首字母的縮寫,當(dāng)然你也可以換成其它名稱,但是必須是英文,不能是中文,切記。

3.2.2 Select Device For Target
當(dāng)命名好工程名稱,點(diǎn)擊確定之后會彈出 Select Device for Target 的選項(xiàng)框,讓我們選擇處理器,這里我們選擇 ARMCM3,具體見圖 3-1。

0.png


0.png

其實(shí)這兩個(gè)文件剛開始都是存放在 KEIL 的安裝目錄下,當(dāng)我們配置 Manage Run-Time Environment 選項(xiàng)框之后,軟件就會把選中好的文件從 KEIL 的安裝目錄拷貝到我們的工程目錄:Project\RTE\Device\ARMCM3 下面。其中 startup_ARMCM3.s 是匯編編寫的啟動文件,system_ARMCM3.c 是 C 語言編寫的跟時(shí)鐘相關(guān)的文件。更加具體的可直接閱讀這兩個(gè)文件的源碼。只要是 Cortex-M3 內(nèi)核的單片機(jī),這兩個(gè)文件都適用。

3.3 在 KEIL 工程里面新建文件組
在工程里面添加 User、uC/OS-III Source、uC/OS-III Ports、uC/CPU、uC/LIB 和 Doc 這幾個(gè)文件組,用于管理文件,具體見圖 3-4。
0.png

對于新手,這里有個(gè)問題就是如何添加文件組?具體的方法為鼠標(biāo)右鍵 Target1,在彈出的選項(xiàng)里面選擇 Add Group…即可,具體見圖 3-5,需要多少個(gè)組就鼠標(biāo)右擊多少次Target1。
0.png

3.4 在 KEIL 工程里面添加文件
在工程里面添加好組之后,我們需要把本地工程里面新建好的文件添加到工程里面。
具體為把 readme.txt 文件添加到 Doc 組,app.c 添加到 User 組,至于 OS 相關(guān)的文件我們還沒有編寫,那么 OS 相關(guān)的組就暫時(shí)為空,具體見圖 3-6。
0.png

對于新手,這里有個(gè)問題就是如何將本地工程里面的文件添加到工程組里里面?具體的方法為鼠標(biāo)左鍵雙擊相應(yīng)的組,在彈出的文件選擇框中找到要添加的文件,默認(rèn)的文件類型是 C 文件,如果要添加的是文本或者匯編文件,那么此時(shí)將看不到,這個(gè)時(shí)候就需要把文件類型選擇為 All Files,最后點(diǎn)擊 Add 按鈕即可,具體見圖 3-7。

0.png

3.4.1 編寫 main 函數(shù)

一個(gè)工程如果沒有 main 函數(shù)是編譯不成功的,會出錯(cuò)。因?yàn)橄到y(tǒng)在開始執(zhí)行的時(shí)候先執(zhí)行啟動文件里面的復(fù)位程序,復(fù)位程序里面會調(diào)用 C 庫函數(shù)__main,__main 的作用是初始化好系統(tǒng)變量,如全局變量,只讀的,可讀可寫的等等。__main 最后會調(diào)用__rtentry,再由__rtentry 調(diào)用 main 函數(shù),從而由匯編跳入到 C 的世界,這里面的 main 函數(shù)就需要我們手動編寫,如果沒有編寫 main 函數(shù),就會出現(xiàn) main 函數(shù)沒有定義的錯(cuò)誤,具體見圖 3-8。
0.png

main 函數(shù)我們寫在 app.c 文件里面,因?yàn)槭莿倓傂陆üこ蹋?main 函數(shù)暫時(shí)為空,
具體見代碼清單 3-1。
代碼清單 3-1main 函數(shù)
  1. int main(void)
  2. {
  3. for (;;) {
  4. /* 啥事不干 */
  5. }
  6. }
復(fù)制代碼
…………
…………
一共16章節(jié)
…………
完整的pdf格式文檔51黑下載地址(共126頁P(yáng)DF):
[野火]《從0到1教你寫uCOS-III》.pdf (3.25 MB, 下載次數(shù): 615)


評分

參與人數(shù) 2黑幣 +55 收起 理由
造夢Sir + 5 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:1 發(fā)表于 2018-8-9 03:20 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2018-8-9 03:20 | 顯示全部樓層
寫的太棒了,大愛火哥啊.
回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2018-8-9 03:22 | 顯示全部樓層
這個(gè)是我看過的最通俗易懂的uCOS-III教程
回復(fù)

使用道具 舉報(bào)

ID:396960 發(fā)表于 2018-9-16 10:44 | 顯示全部樓層
下來看看,謝謝樓主無私
回復(fù)

使用道具 舉報(bào)

ID:104779 發(fā)表于 2018-9-18 01:55 | 顯示全部樓層
向上傳資料人致敬!
回復(fù)

使用道具 舉報(bào)

ID:86450 發(fā)表于 2018-9-18 10:06 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:411798 發(fā)表于 2018-10-18 16:44 | 顯示全部樓層
很好的資料
回復(fù)

使用道具 舉報(bào)

ID:18591 發(fā)表于 2018-11-6 23:23 | 顯示全部樓層
好資料,~~~~~~~~~~~~~~~~~~
回復(fù)

使用道具 舉報(bào)

ID:5203 發(fā)表于 2018-11-7 08:08 | 顯示全部樓層
書中的內(nèi)容很好,很實(shí)用。謝謝啦!
回復(fù)

使用道具 舉報(bào)

ID:393586 發(fā)表于 2018-11-7 20:35 | 顯示全部樓層
這是野火的吧 公眾號里面也發(fā)布了
回復(fù)

使用道具 舉報(bào)

ID:445403 發(fā)表于 2018-12-13 09:24 | 顯示全部樓層
我想下載來學(xué)習(xí),可是沒有積分。。。
回復(fù)

使用道具 舉報(bào)

ID:162136 發(fā)表于 2018-12-27 22:09 | 顯示全部樓層
下載看了一下,不錯(cuò),感謝。
回復(fù)

使用道具 舉報(bào)

ID:58591 發(fā)表于 2019-1-11 15:02 | 顯示全部樓層
下載學(xué)習(xí)下,感謝分享
回復(fù)

使用道具 舉報(bào)

ID:66915 發(fā)表于 2019-1-12 12:37 | 顯示全部樓層
寫的太棒了,大愛火哥啊
回復(fù)

使用道具 舉報(bào)

ID:467292 發(fā)表于 2019-1-13 11:10 | 顯示全部樓層
贊一個(gè)!好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:185317 發(fā)表于 2019-1-15 11:26 | 顯示全部樓層
謝謝上傳
回復(fù)

使用道具 舉報(bào)

ID:18591 發(fā)表于 2019-1-20 19:15 | 顯示全部樓層
寫的太棒了
回復(fù)

使用道具 舉報(bào)

ID:466010 發(fā)表于 2019-1-23 17:37 | 顯示全部樓層
下載下來看看
回復(fù)

使用道具 舉報(bào)

ID:344498 發(fā)表于 2019-1-28 14:30 | 顯示全部樓層
帶OS應(yīng)該是做單片機(jī)最高階了
回復(fù)

使用道具 舉報(bào)

ID:273165 發(fā)表于 2019-5-16 10:08 | 顯示全部樓層
不可多得的好資料,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:492919 發(fā)表于 2019-5-16 19:55 | 顯示全部樓層
看上去好利害啊!
下來看看
回復(fù)

使用道具 舉報(bào)

ID:346927 發(fā)表于 2019-5-17 20:44 | 顯示全部樓層
正在學(xué)STM32,不可多得的好資料,謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:171630 發(fā)表于 2019-6-30 22:58 | 顯示全部樓層
不錯(cuò),已經(jīng)下載下來,希望可以學(xué)習(xí)學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

ID:282431 發(fā)表于 2019-7-2 08:52 | 顯示全部樓層
這個(gè)是最通俗易懂的uCOS-III教程,學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

ID:282095 發(fā)表于 2019-7-2 11:16 | 顯示全部樓層
很實(shí)用
回復(fù)

使用道具 舉報(bào)

ID:559960 發(fā)表于 2019-9-27 08:56 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:644362 發(fā)表于 2019-11-18 15:53 | 顯示全部樓層
非常棒的教程,謝謝謝謝!
回復(fù)

使用道具 舉報(bào)

ID:146034 發(fā)表于 2020-1-16 12:41 | 顯示全部樓層
好資料  學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:655943 發(fā)表于 2020-5-2 13:00 | 顯示全部樓層
正想學(xué)這個(gè),感謝分享
回復(fù)

使用道具 舉報(bào)

ID:282431 發(fā)表于 2020-5-2 17:24 | 顯示全部樓層
正在學(xué)STM32F,好資料,謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:690363 發(fā)表于 2020-5-9 10:59 | 顯示全部樓層
我這點(diǎn)黑幣啊,估計(jì)最后都不夠用了,都是好資料,謝謝
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表