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