學(xué)完了 RT-Thread 內(nèi)核基礎(chǔ),來(lái)使用 RT-Thread 實(shí)現(xiàn)一個(gè)小應(yīng)用。
硬件平臺(tái):STM32L051C8 TCM310(Enocean無(wú)線芯片)
軟件平臺(tái):RT-Thread Studio STM32CubeMX
產(chǎn)品名稱:無(wú)線溫度傳感器
實(shí)現(xiàn)功能:STM32L051 通過(guò) I2C 協(xié)議讀取 SHT21D 溫濕度傳感器數(shù)據(jù),然后通過(guò)串口和 Enocean
通訊,按照標(biāo)準(zhǔn)Enocean協(xié)議,將溫濕度數(shù)據(jù)發(fā)送出去
目錄
- 前言
- 一、使用 RT-Thread Studio 新建項(xiàng)目
-
二、初始項(xiàng)目代碼分析
- 2.1 內(nèi)存堆
- 2.2 main 線程初始化
- 2.3 軟件定時(shí)器
- 2.4 rtconfig.h
- 三、初始項(xiàng)目占RAM大小
- 四、時(shí)刻保持查看測(cè)試結(jié)果
- 結(jié)語(yǔ)
前言
RT-Thread 專欄更新到今天,已經(jīng)把內(nèi)核基礎(chǔ)全部講完,還沒(méi)有一個(gè)使用 RT-Thread Studio 完整的項(xiàng)目實(shí)例,我在第一篇文章中介紹版本的時(shí)候就說(shuō)過(guò),在一般普通的應(yīng)用項(xiàng)目上,Nano估計(jì)用起來(lái)還更多,內(nèi)存就是成本! 既然我們把 RT-Thread Nano 內(nèi)容大都過(guò)了一遍,那就來(lái)使用它實(shí)現(xiàn)一個(gè)傳感器小項(xiàng)目。
看過(guò)我博文的朋友都知道為什么我會(huì)使用 STM32L051,我在前面博文 ST芯片漲價(jià)后,你是如何做的?已經(jīng)提到過(guò)原因,滿足應(yīng)用要求,替換成本低。
本文完全從 0 開(kāi)始新建工程,工程代碼分析,修改,移植,測(cè)試,步步為營(yíng),最終完成一個(gè)完整的應(yīng)用。
??
本 RT-Thread 專欄記錄的開(kāi)發(fā)環(huán)境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開(kāi)發(fā)環(huán)境 及 配合CubeMX開(kāi)發(fā)快速上手)
RT-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程 — 啟動(dòng)文件和源碼分析)
??
RT-Thread 內(nèi)核篇系列博文鏈接:
RT-Thread記錄(三、RT-Thread 線程操作函數(shù)及線程管理與FreeRTOS的比較)
RT-Thread記錄(四、RT-Thread 時(shí)鐘節(jié)拍和軟件定時(shí)器)
RT-Thread記錄(五、RT-Thread 臨界區(qū)保護(hù))
RT-Thread記錄(六、IPC機(jī)制之信號(hào)量、互斥量和事件集)
RT-Thread記錄(七、IPC機(jī)制之郵箱、消息隊(duì)列)
RT-Thread記錄(八、理解 RT-Thread 內(nèi)存管理)
RT-Thread記錄(九、RT-Thread 中斷處理與階段小結(jié))
??
一、使用 RT-Thread Studio 新建項(xiàng)目
首先,我們還是使用 RT-Thread Studio 新建工程,我們選擇 Nano 項(xiàng)目,如下圖:
然后進(jìn)入項(xiàng)目創(chuàng)建頁(yè)面,項(xiàng)目基于芯片,然后在系列中選擇 STM32L0 系列,如果沒(méi)有需要添加,如下圖:
在上面圖點(diǎn)擊 添加更多,然后在 SDK 管理器中,安裝 STM32L0 的資源包,選中,點(diǎn)擊安裝即可,如下圖:
完成上述步驟,再回過(guò)頭來(lái)重新新建項(xiàng)目,整個(gè)選項(xiàng)如下圖所示:
新建完成工程以后,會(huì)直接在資源管理器出現(xiàn),以前的項(xiàng)目不會(huì)被關(guān)閉:
二、初始項(xiàng)目代碼分析
最初我們學(xué)習(xí)使用的開(kāi)發(fā)板是自己畫(huà)的 STM32F103VGT6,有著 96KB 的 RAM,已經(jīng)是很大的內(nèi)存了,而目前博主實(shí)際項(xiàng)目上很多產(chǎn)品使用的是 STM32L051C8 只有 8KB 的RAM,在使用 FreeRTOS 的時(shí)候我遇到的一個(gè)大問(wèn)題就是 RAM 空間不足的問(wèn)題。
L051 的 RAM 實(shí)在是太小了,所以對(duì)于這種小內(nèi)存的芯片肯定在配置上,初始化上與大內(nèi)存的會(huì)有些差異,所以我們有必要來(lái)看一看剛剛生成的項(xiàng)目程序,應(yīng)該能夠看到些細(xì)節(jié)。
代碼從哪里開(kāi)始分析,當(dāng)然是從初始化開(kāi)始,我們?cè)凇禦T-Thread記錄(二、RT-Thread內(nèi)核啟動(dòng)流程 — 啟動(dòng)文件和源碼分析)》已經(jīng)知道了啟動(dòng)流程,我們就從頭開(kāi)始看看。
對(duì)于 STM32 來(lái)說(shuō),整個(gè)系列的啟動(dòng)文件基本都是一樣的,唯一不同的地方在于,有些芯片外設(shè)多,所以中斷向量表會(huì)多一些。
在啟動(dòng)文件中,有一條語(yǔ)句bl SystemInit,這個(gè)SystemInit 里面對(duì)于不同型號(hào)的STM32也會(huì)不一樣,但是這里我們也不用太在意,這都是ST官方提供的標(biāo)準(zhǔn)初始化。
其他的地方能修改的或許也只有堆棧的大小了,但是在 RT-Thread 上,我們?cè)趩?dòng)文件中并沒(méi)有在啟動(dòng)文件中定義 堆 (heap) 的大小,所以只剩下棧(.stack)的大小了,根據(jù)我以前使用 STM32L051 的經(jīng)驗(yàn),在這種傳感器單品項(xiàng)目上棧使用 0x400 是沒(méi)問(wèn)題的,系統(tǒng)也正好是默認(rèn)是 0x400:
啟動(dòng)文件我們了解一下即可,基本沒(méi)有區(qū)別。
我們進(jìn)入到rtthread_startup
函數(shù),我們?cè)谝郧胺治鲞^(guò),他的流程如下:
對(duì)于這些基本流程,他們都是一樣的,但是我們要看的東西,在這些步驟里面。
感覺(jué)上面寫(xiě)了一堆沒(méi)用的,但是我還是放出來(lái)了,因?yàn)槲易约捍_實(shí)就是這樣去分析,查找的,希望能給大家做個(gè)參考。
但是如果熟悉了初始化的步驟,其實(shí)可以直接在 rtconfig.h
中直接看宏定義,所有的配置一目了然,后面我們會(huì)說(shuō)一下。
2.1 內(nèi)存堆
我在 rtthread_startup
函數(shù)按照步驟往下看,進(jìn)入到rt_hw_board_init
函數(shù),發(fā)現(xiàn) L051 是默認(rèn)不使用堆,也就不會(huì)初始化堆空間,如下圖:
其實(shí)很好理解,因?yàn)?L051 的內(nèi)存是在是太小了。當(dāng)然我們自己也可以去修改配置,但是為了系統(tǒng)的穩(wěn)定性,最好不要這么去做。
這里除了知道L051C8 沒(méi)有使用堆以后,還得注意,沒(méi)有使用堆,就不能用內(nèi)核對(duì)象的動(dòng)態(tài)創(chuàng)建函數(shù),等于說(shuō)我們的線程包括其他的IPC機(jī)制 都得使用靜態(tài)初始化方式?。?!
2.2 main 線程初始化
還是在 rtthread_startup
中往下看,進(jìn)入到rt_application_init
函數(shù),就是 main 線程的初始化函數(shù)。
創(chuàng)建 main 線程,因?yàn)闆](méi)有使用heap,所以只能使用靜態(tài)初始化的方式,這倒不是什么問(wèn)題,但是我們需要注意的是,線程棧的大小為2K :
總共就8K 的RAM,一個(gè)main 線程就占用了 2K,算是很大了,這里得注意下這個(gè)大小,后續(xù)應(yīng)用中看看是否需要調(diào)整。
2.3 軟件定時(shí)器
rtthread_startup
往下走,進(jìn)入到rt_system_timer_thread_init
函數(shù):
在軟件定時(shí)器下一個(gè)是rt_thread_idle_init();
,初始化的空閑線程,這個(gè)地方是一樣的,其中了解空閑線程的大小為 256 個(gè)字節(jié)。
我以前在介紹軟件定時(shí)器的時(shí)候提到過(guò),內(nèi)存不夠是不建議使用軟件定時(shí)器的,因?yàn)檐浖〞r(shí)器需要占用內(nèi)存。
正好這里默認(rèn)也是不能使用軟件定時(shí)器。
2.4 rtconfig.h
上面初始化完成以后系統(tǒng)就開(kāi)始調(diào)度了,可以正常的進(jìn)行我們的用戶程序設(shè)計(jì),然后我們通過(guò)上面的分析,發(fā)現(xiàn)了在小內(nèi)存的 STM32L051 上有些東西未開(kāi)啟,這些定義都是在 rtconfig.h
文件中配置的,于是我們可以打開(kāi)這個(gè)配置程序去做個(gè)比較。
實(shí)際上對(duì)于操作系統(tǒng)來(lái)說(shuō), 我們一開(kāi)始就可以直接查看配置文件,看看定義了那些可用,哪些不可用。
具體的比較就不一一分析了,這里我把在實(shí)際使用可能需要用到的做個(gè)列舉,也方面自己后面寫(xiě)應(yīng)用的時(shí)候查看:
- 勾子函數(shù)默認(rèn)都不能使用
- 軟件定時(shí)器默認(rèn)不能使用
- IPC機(jī)制中只能使用 信號(hào)量,互斥量和郵箱,事件集和消息隊(duì)列默認(rèn)不可以使用
- 沒(méi)有內(nèi)存堆,不能使用動(dòng)態(tài)創(chuàng)建函數(shù)
- 沒(méi)有內(nèi)存管理,無(wú)法使用內(nèi)存池
- 默認(rèn)沒(méi)有FinSH,無(wú)法使用shell命令
其他的以后遇到再說(shuō),當(dāng)然更高級(jí)點(diǎn)的功能當(dāng)然也不能使用,比如設(shè)備模型組件軟件包那些,我們還沒(méi)學(xué) = =!
三、初始項(xiàng)目占RAM大小
因?yàn)槭褂眯酒瑑?nèi)存太小了,跑 RTOS 有一個(gè)關(guān)鍵的問(wèn)題,就是內(nèi)存不夠,所以我們得時(shí)刻關(guān)注這一點(diǎn)我們來(lái)看一下,一看有點(diǎn)嚇一跳:
至于上圖結(jié)論怎么得出來(lái)的,可以看這篇很通俗很詳細(xì)很好的博文:STM32的內(nèi)存管理相關(guān)(內(nèi)存架構(gòu),內(nèi)存管理,map文件分析)
感覺(jué)有點(diǎn)煩,啥都沒(méi)寫(xiě),就已經(jīng) 5840 字節(jié)了,估計(jì)后面會(huì)很難受,不過(guò)想想開(kāi)始那個(gè) main 線程使用了 2048 字節(jié),所以還有調(diào)整的余地,到時(shí)候我們來(lái)看看!
四、時(shí)刻保持查看測(cè)試結(jié)果
從0開(kāi)始做一個(gè)項(xiàng)目,要保持良好的習(xí)慣,時(shí)刻保持查看測(cè)試結(jié)果,可以把復(fù)雜的問(wèn)題簡(jiǎn)單化,出問(wèn)題很容易找出問(wèn)題的來(lái)源。
最后看一下程序下載到芯片是否正常:
下載到板子,一切正常。
結(jié)語(yǔ)
雖然本文只是新建了一個(gè) RT-Thread Nano工程,但是我們分析了初始化項(xiàng)目代碼,說(shuō)明了一些與學(xué)習(xí)時(shí)候大容量芯片不同且需要注意的地方,不僅讓我們更了解 RT-Thread Nano 的一些基本配置和初始化情況,同時(shí)也為我們后續(xù)的程序設(shè)計(jì)做好了充足的準(zhǔn)備,可以避免一些不必要的問(wèn)題發(fā)生。
下一篇的內(nèi)容就是通過(guò) STM32CubeMX 做外設(shè)的基本配置,然后添加一些簡(jiǎn)單的測(cè)試代碼。
好的開(kāi)始是成功的一半! 這個(gè)項(xiàng)目已經(jīng)做完一半了!= =!
好了,本文就到這,謝謝大家!
-
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354294 -
I2C
+關(guān)注
關(guān)注
28文章
1477瀏覽量
123055 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1261瀏覽量
39838
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論