最近看到技術(shù)交流群在討論【要不要閱讀RTOS內(nèi)核源碼】的話(huà)題。站在過(guò)來(lái)人的角度來(lái)說(shuō)下:非必要,不建議你閱讀RTOS內(nèi)核源碼。
我在讀大學(xué)的時(shí)候,喜歡研究底層的技術(shù)原理,比如數(shù)碼管、液晶、74系列邏輯IC等,好奇它們?cè)趺垂ぷ?、怎么?shí)現(xiàn)的,也會(huì)寫(xiě)一些代碼來(lái)測(cè)試,驗(yàn)證其中原理。
再后來(lái),學(xué)習(xí)一些協(xié)議棧、RTOS,會(huì)比較好奇,也會(huì)花時(shí)間研究其中的源碼。直到深入閱讀、理解RTOS內(nèi)核源碼的時(shí)候,才發(fā)現(xiàn)并非一件容易的事。
我學(xué)習(xí)RTOS的經(jīng)歷
先給大家說(shuō)下我學(xué)習(xí)RTOS的經(jīng)歷吧。
我學(xué)習(xí)RTOS是從大學(xué)的時(shí)候就開(kāi)始了,在學(xué)習(xí)RTOS之前和很多人一樣,也是什么都不懂,跟著老師、看著周邊的人學(xué)什么就跟著學(xué)什么,比如數(shù)電、模電、單片機(jī)編程、外設(shè)等。
單片機(jī)裸機(jī)各種資源外設(shè)學(xué)的差不多,感覺(jué)應(yīng)該進(jìn)階一下了,所以就選擇了RTOS。
在2011、12年讀書(shū)的時(shí)候,RTOS還不像現(xiàn)在這么流行(那時(shí)還是以“裸機(jī)”為主),那個(gè)時(shí)候網(wǎng)上RTOS的教程大多都還是以μCOS為主,其他RTOS的資料相對(duì)很少。像FreeRTOS、RT-Thread以及其他RTOS的資料都很少。
因?yàn)樵缙讦藽OS的發(fā)行都有配套的書(shū)籍(請(qǐng)參看μC/OS的那段故事),所以早些年在教學(xué)方面大多選擇了μCOS,這也是我當(dāng)時(shí)選擇μCOS作為學(xué)習(xí)的原因。
(順便再提一點(diǎn),雖然早期μCOS是商業(yè)收費(fèi)的操作系統(tǒng),但源碼是可以免費(fèi)下載的)
1.選擇單片機(jī)開(kāi)發(fā)板
我早期學(xué)習(xí)單片機(jī)主要是51(AT89C51、STC89C51等),MSP430等,可以說(shuō)對(duì)他倆玩的比較熟。
所以學(xué)習(xí)μCOS也是基于他倆開(kāi)始的,因?yàn)榇蠹叶贾?1資源(Flash、RAM)確實(shí)太少了,雖然網(wǎng)上有基于51單片機(jī)移植μCOS系統(tǒng)的,但移植系統(tǒng)之后基本干不了別的事了。
所以,我基于51移植μCOS折騰了一段時(shí)間就放棄了,選擇了MSP430,430相對(duì)51資源多一些,還能有發(fā)揮的余地。
早些年如果有學(xué)習(xí)基于MSP430移植μCOS系統(tǒng)的同學(xué),或許都看過(guò)我早期分享的源碼:
因?yàn)镸SP430之后用過(guò)STM32xx、 LPC17xx等基于ARM Cortex-M3 內(nèi)核的32位單片機(jī),當(dāng)時(shí)基于MSP430跑μCOS系統(tǒng)也感覺(jué)很吃力,所以后來(lái)選擇了STM32跑μCOS系統(tǒng)。
順便再回憶一下STM32開(kāi)發(fā)板:
現(xiàn)在STM32開(kāi)發(fā)板基本是正點(diǎn)原子、安富萊、野火這三家的天下,早些年基于STM32的開(kāi)發(fā)板是一家神舟開(kāi)發(fā)版,當(dāng)時(shí)可以說(shuō)全網(wǎng)最火,關(guān)鍵原因是性?xún)r(jià)比很高。
當(dāng)時(shí),像神舟III號(hào)基于STM32F103ZE那樣一塊板載資源非常豐富的開(kāi)發(fā)板只要一百多。雖然我當(dāng)時(shí)比較窮,但我還是沒(méi)經(jīng)受住誘惑買(mǎi)了神舟I號(hào),后又買(mǎi)了神舟III號(hào)。
可惜的是,神舟開(kāi)發(fā)板團(tuán)隊(duì)后面(應(yīng)該在15年之后)就沒(méi)有再做了,不知道有多少人還有這段記憶?
2.閱讀μCOS內(nèi)核源碼
我接觸μCOS操作系統(tǒng)是在2011年,那個(gè)時(shí)候也是參考各種例程移植代碼,觀(guān)察各種現(xiàn)象。
雖然系統(tǒng)跑通了,內(nèi)核資源也用上了,但始終不能理解各種原理,也不能Get到實(shí)時(shí)操作系統(tǒng)的精髓。
于是,開(kāi)啟了閱讀源碼之路,這一下來(lái),發(fā)現(xiàn)并不簡(jiǎn)單。因?yàn)椴僮飨到y(tǒng)中有各種指針、數(shù)組、結(jié)構(gòu)體等,那個(gè)時(shí)候老師也從來(lái)沒(méi)有教過(guò)數(shù)據(jù)結(jié)構(gòu)那些知識(shí),只能靠自己一步一步摸索。
我閱讀μCOS操作系統(tǒng)內(nèi)核源碼及內(nèi)核資源,前前后后、斷斷續(xù)續(xù)大概花了一年時(shí)間,之后才深入明白R(shí)TOS原來(lái)是這么工作的,也更加理解了μCOS內(nèi)核調(diào)度原理、通信機(jī)制等。
如果早些年有學(xué)習(xí)μCOS的同學(xué),應(yīng)該會(huì)看過(guò)我早期分享的一份基于神舟III號(hào)、uCOS2.92系統(tǒng)的源碼,包含多任務(wù)、信號(hào)量、互斥鎖、事件標(biāo)志、消息郵箱、消息隊(duì)列、內(nèi)存管理等各種例程:
這份源碼有中文注釋?zhuān)俏以缙趯W(xué)習(xí)μCOS的時(shí)候一步一步翻譯過(guò)來(lái),當(dāng)時(shí)學(xué)習(xí)μCOS可以說(shuō)下了狠功夫。
學(xué)習(xí)RTOS有必要閱讀源碼嗎?
你看了我上面的經(jīng)歷,可能會(huì)有一種閱讀內(nèi)核源碼的沖動(dòng)。
其實(shí),對(duì)于很多人我是不建議閱讀源碼,特別是兩種人:
基礎(chǔ)較差的人
沒(méi)有時(shí)間的人
我學(xué)習(xí)RTOS之前折騰過(guò)很多源碼,也參加過(guò)電子設(shè)計(jì)競(jìng)賽,自認(rèn)為基礎(chǔ)還可以。關(guān)鍵是在大學(xué),有大量的時(shí)間。
如果你基礎(chǔ)不好,且沒(méi)有太多空閑時(shí)間,又要學(xué)習(xí)RTOS,閱讀源碼一定要慎重、慎重、再慎重。
對(duì)于絕大部分讀者,我的建議是:直接參考例程,然后折騰操作系統(tǒng)的各種API,通過(guò)狀態(tài)燈、串口打印輸出理解其中的作用及原理。
比如:創(chuàng)建任務(wù)之后,刪除任務(wù),你觀(guān)察狀態(tài)燈是否還在執(zhí)行這個(gè)任務(wù)。
閱讀并理解內(nèi)核源碼有什么好處?
你可能會(huì)問(wèn):不建議閱讀源碼,是不是閱讀源碼就沒(méi)啥作用了?
閱讀并理解源碼其實(shí)對(duì)自己有很大幫助作用的,比如你會(huì)進(jìn)一步理解RTOS各種通信機(jī)制方便后期應(yīng)用編程,再比如能提升自己的編程思維,我后期很多項(xiàng)目都借鑒了一些源碼的模式。
最后再說(shuō)明一下,RTOS內(nèi)核有一些相對(duì)復(fù)雜的內(nèi)容,如果你基礎(chǔ)不好,可能閱讀幾天就放棄了。同時(shí),如果你沒(méi)時(shí)間,只是三天打魚(yú)兩天曬網(wǎng),最終可能沒(méi)有一點(diǎn)收獲。
所以,對(duì)于絕大部分人我是不建議閱讀源碼。
原文標(biāo)題:RTOS內(nèi)核源碼,非必要不建議閱讀
文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論