0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32L051上使用RT-Thread (一、新建項(xiàng)目)

just_2010 ? 來(lái)源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-25 20:45 ? 次閱讀
學(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)目,如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_18,color_FFFFFF,t_70,g_se,x_16#

然后進(jìn)入項(xiàng)目創(chuàng)建頁(yè)面,項(xiàng)目基于芯片,然后在系列中選擇 STM32L0 系列,如果沒(méi)有需要添加,如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_19,color_FFFFFF,t_70,g_se,x_16#

在上面圖點(diǎn)擊 添加更多,然后在 SDK 管理器中,安裝 STM32L0 的資源包,選中,點(diǎn)擊安裝即可,如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16#

完成上述步驟,再回過(guò)頭來(lái)重新新建項(xiàng)目,整個(gè)選項(xiàng)如下圖所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_19,color_FFFFFF,t_70,g_se,x_16#

新建完成工程以后,會(huì)直接在資源管理器出現(xiàn),以前的項(xiàng)目不會(huì)被關(guān)閉:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

二、初始項(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:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

啟動(dòng)文件我們了解一下即可,基本沒(méi)有區(qū)別。

我們進(jìn)入到rtthread_startup函數(shù),我們?cè)谝郧胺治鲞^(guò),他的流程如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

對(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ì)初始化堆空間,如下圖:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_19,color_FFFFFF,t_70,g_se,x_16

poYBAGK25zaAcr6HAAA3O1Y3qBw901.png

其實(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 :

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

總共就8K 的RAM,一個(gè)main 線程就占用了 2K,算是很大了,這里得注意下這個(gè)大小,后續(xù)應(yīng)用中看看是否需要調(diào)整。

2.3 軟件定時(shí)器

rtthread_startup往下走,進(jìn)入到rt_system_timer_thread_init函數(shù):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_10,color_FFFFFF,t_70,g_se,x_16

在軟件定時(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)嚇一跳:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

至于上圖結(jié)論怎么得出來(lái)的,可以看這篇很通俗很詳細(xì)很好的博文:STM32的內(nèi)存管理相關(guān)(內(nèi)存架構(gòu),內(nèi)存管理,map文件分析)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

感覺(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)源。

最后看一下程序下載到芯片是否正常:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_19,color_FFFFFF,t_70,g_se,x_16

下載到板子,一切正常。

結(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)做完一半了!= =!

好了,本文就到這,謝謝大家!

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354294
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1477

    瀏覽量

    123055
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1261

    瀏覽量

    39838
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32L051使用RT-Th (二、CubeMX配置)

    應(yīng)用篇-在STM32L051使用RT-Thread 第二篇,使用STM32CubeMX 進(jìn)行對(duì)應(yīng)外設(shè)配置,同時(shí)做些簡(jiǎn)單測(cè)試。
    的頭像 發(fā)表于 06-26 14:02 ?4453次閱讀
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT</b>-Th (二、CubeMX配置)

    STM32L051使用RT-Threa (三、I2C通訊)

    應(yīng)用篇-在STM32L051使用RT-Thread 第三篇,學(xué)習(xí)RT-Thread Studio如何添加自定義的.c .h文件,
    的頭像 發(fā)表于 06-27 10:32 ?3596次閱讀
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT</b>-Threa (三、I2C通訊)

    STM32L051使用RT-Thread (四、串口通訊)

    應(yīng)用篇-在STM32L051使用RT-Thread 第四篇,巧妙的使用信號(hào)量處理串口通訊。
    的頭像 發(fā)表于 06-28 10:59 ?5102次閱讀
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT-Thread</b> (四、串口通訊)

    STM32L051使用RT-Thread (五、完結(jié)篇)

    應(yīng)用篇-在STM32L051使用RT-Thread 第五篇,也是本次應(yīng)用的完結(jié)篇。
    的頭像 發(fā)表于 06-29 10:34 ?3856次閱讀
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT-Thread</b> (五、完結(jié)篇)

    從0到1教你寫(xiě)RT-Thread新建工程

    仿真,然后我們?cè)匍_(kāi)始步地教大家把 RT-Thread 內(nèi)核從 0 到 1 寫(xiě)出來(lái),讓大家徹底搞懂 RT-Thread的內(nèi)部實(shí)現(xiàn)和設(shè)計(jì)的哲學(xué)思想。最后我們?cè)侔?
    發(fā)表于 11-18 14:17 ?1537次閱讀

    RT-Thread Studio 使用 RT-Thread Nano

    本文介紹了如何在 RT-Thread Studio 使用 RT-Thread Nano,并以創(chuàng)建 stm32f103RB 的 Nano 工程為例。準(zhǔn)備工作安裝
    發(fā)表于 05-18 15:59

    RT-Thread Studio 新建項(xiàng)目項(xiàng)目導(dǎo)入介紹

    /stm32l475-atk-pandora 工程為例,演示如何導(dǎo)入個(gè) MDK 工程到 RT-Thread Studio 中,導(dǎo)入前工程目錄如下圖所示:在 Studio 資源管理器窗口中點(diǎn)擊右鍵,在下拉菜單中選擇導(dǎo)入功能
    發(fā)表于 08-10 16:52

    如何使用RT-Thread Studio來(lái)新建項(xiàng)目

    RT-Thread Studio學(xué)習(xí)之使用外部時(shí)鐘系統(tǒng)簡(jiǎn)介新建RT-Thread項(xiàng)目使用外部時(shí)鐘簡(jiǎn)介本文將基于STM32F407VET芯片介
    發(fā)表于 01-20 07:51

    【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集

    使用RT-Thread系列STM32L051使用RT-Thread (、
    發(fā)表于 07-26 14:56

    使用rt-thread新建基于芯片的項(xiàng)目失敗是何原因呢

    使用rt-thread stdio 新建基于芯片的項(xiàng)目,芯片使用stm32f7,新建默認(rèn)的項(xiàng)目
    發(fā)表于 12-30 15:15

    RT-Thread零基礎(chǔ)快速入門(mén)第1講——新建工程

    RT-Thread零基礎(chǔ)快速入門(mén)第2講——新建工程目錄RT-Thread零基礎(chǔ)快速入門(mén)第2講——新建工程、前言二、使用ENV工具
    發(fā)表于 11-30 19:21 ?16次下載
    <b class='flag-5'>RT-Thread</b>零基礎(chǔ)快速入門(mén)第1講——<b class='flag-5'>新建</b>工程

    RT-Thread STM32 配置系統(tǒng)時(shí)鐘(使用外部晶振)

    ,沒(méi)有更新最新版本軟件)RT-Thread內(nèi)核:V4.0.2STM32 CubeMX: V5.6.0、創(chuàng)建RT-Thread項(xiàng)目打開(kāi)
    發(fā)表于 12-14 18:45 ?14次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>STM32</b> 配置系統(tǒng)時(shí)鐘(使用外部晶振)

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發(fā)表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 <b class='flag-5'>STM32L</b>475 上手指南

    【RTT征文精選】畫(huà)板子、敲代碼、玩RTOS、搞Linux,大家起“秀”!

    //STM32L051使用RT-Thread(、新建項(xiàng)目)
    的頭像 發(fā)表于 08-25 09:56 ?664次閱讀
    【RTT征文精選】畫(huà)板子、敲代碼、玩RTOS、搞Linux,大家<b class='flag-5'>一</b>起“秀”!

    rt-thread studio新建stm32f407工程

    rt-thread studio新建stm32f407工程,使用的版本是:2.2.6,stm32f4的支持包版本為0.2.2。先不用0.2.3,因?yàn)槭褂?.2.3建立的模板編譯會(huì)報(bào)錯(cuò)。
    的頭像 發(fā)表于 10-12 17:42 ?1209次閱讀