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

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

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

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

just_2010 ? 來源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-25 20:45 ? 次閱讀
學(xué)完了 RT-Thread 內(nèi)核基礎(chǔ),來使用 RT-Thread 實現(xiàn)一個小應(yīng)用。
硬件平臺:STM32L051C8  TCM310(Enocean無線芯片)
軟件平臺:RT-Thread Studio  STM32CubeMX
產(chǎn)品名稱:無線溫度傳感器
實現(xiàn)功能:STM32L051 通過 I2C 協(xié)議讀取 SHT21D 溫濕度傳感器數(shù)據(jù),然后通過串口和 Enocean
		通訊,按照標(biāo)準(zhǔn)Enocean協(xié)議,將溫濕度數(shù)據(jù)發(fā)送出去

目錄

  • 前言
  • 一、使用 RT-Thread Studio 新建項目
  • 二、初始項目代碼分析
    • 2.1 內(nèi)存堆
    • 2.2 main 線程初始化
    • 2.3 軟件定時器
    • 2.4 rtconfig.h
  • 三、初始項目占RAM大小
  • 四、時刻保持查看測試結(jié)果
  • 結(jié)語

前言

RT-Thread 專欄更新到今天,已經(jīng)把內(nèi)核基礎(chǔ)全部講完,還沒有一個使用 RT-Thread Studio 完整的項目實例,我在第一篇文章中介紹版本的時候就說過,在一般普通的應(yīng)用項目上,Nano估計用起來還更多,內(nèi)存就是成本! 既然我們把 RT-Thread Nano 內(nèi)容大都過了一遍,那就來使用它實現(xiàn)一個傳感器小項目。

看過我博文的朋友都知道為什么我會使用 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ū)保護)
RT-Thread記錄(六、IPC機制之信號量、互斥量和事件集)
RT-Thread記錄(七、IPC機制之郵箱、消息隊列)
RT-Thread記錄(八、理解 RT-Thread 內(nèi)存管理)
RT-Thread記錄(九、RT-Thread 中斷處理與階段小結(jié))
??

一、使用 RT-Thread Studio 新建項目

首先,我們還是使用 RT-Thread Studio 新建工程,我們選擇 Nano 項目,如下圖:

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

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

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

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

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

完成上述步驟,再回過頭來重新新建項目,整個選項如下圖所示:

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

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

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

二、初始項目代碼分析

最初我們學(xué)習(xí)使用的開發(fā)板是自己畫的 STM32F103VGT6,有著 96KB 的 RAM,已經(jīng)是很大的內(nèi)存了,而目前博主實際項目上很多產(chǎn)品使用的是 STM32L051C8 只有 8KB 的RAM,在使用 FreeRTOS 的時候我遇到的一個大問題就是 RAM 空間不足的問題。

L051 的 RAM 實在是太小了,所以對于這種小內(nèi)存的芯片肯定在配置上,初始化上與大內(nèi)存的會有些差異,所以我們有必要來看一看剛剛生成的項目程序,應(yīng)該能夠看到些細節(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)驗,在這種傳感器單品項目上棧使用 0x400 是沒問題的,系統(tǒng)也正好是默認(rèn)是 0x400:

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

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

我們進入到rtthread_startup函數(shù),我們在以前分析過,他的流程如下:

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

對于這些基本流程,他們都是一樣的,但是我們要看的東西,在這些步驟里面。

感覺上面寫了一堆沒用的,但是我還是放出來了,因為我自己確實就是這樣去分析,查找的,希望能給大家做個參考。
但是如果熟悉了初始化的步驟,其實可以直接在 rtconfig.h 中直接看宏定義,所有的配置一目了然,后面我們會說一下。

2.1 內(nèi)存堆

我在 rtthread_startup函數(shù)按照步驟往下看,進入到rt_hw_board_init函數(shù),發(fā)現(xiàn) L051 是默認(rèn)不使用堆,也就不會初始化堆空間,如下圖:

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

poYBAGK25zaAcr6HAAA3O1Y3qBw901.png

其實很好理解,因為 L051 的內(nèi)存是在是太小了。當(dāng)然我們自己也可以去修改配置,但是為了系統(tǒng)的穩(wěn)定性,最好不要這么去做。

這里除了知道L051C8 沒有使用堆以后,還得注意,沒有使用堆,就不能用內(nèi)核對象的動態(tài)創(chuàng)建函數(shù),等于說我們的線程包括其他的IPC機制 都得使用靜態(tài)初始化方式?。?!

2.2 main 線程初始化

還是在 rtthread_startup中往下看,進入到rt_application_init函數(shù),就是 main 線程的初始化函數(shù)。

創(chuàng)建 main 線程,因為沒有使用heap,所以只能使用靜態(tài)初始化的方式,這倒不是什么問題,但是我們需要注意的是,線程棧的大小為2K :

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

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

2.3 軟件定時器

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

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

在軟件定時器下一個是rt_thread_idle_init();,初始化的空閑線程,這個地方是一樣的,其中了解空閑線程的大小為 256 個字節(jié)。

我以前在介紹軟件定時器的時候提到過,內(nèi)存不夠是不建議使用軟件定時器的,因為軟件定時器需要占用內(nèi)存。
正好這里默認(rèn)也是不能使用軟件定時器。

2.4 rtconfig.h

上面初始化完成以后系統(tǒng)就開始調(diào)度了,可以正常的進行我們的用戶程序設(shè)計,然后我們通過上面的分析,發(fā)現(xiàn)了在小內(nèi)存的 STM32L051 上有些東西未開啟,這些定義都是在 rtconfig.h 文件中配置的,于是我們可以打開這個配置程序去做個比較。

實際上對于操作系統(tǒng)來說, 我們一開始就可以直接查看配置文件,看看定義了那些可用,哪些不可用。

具體的比較就不一一分析了,這里我把在實際使用可能需要用到的做個列舉,也方面自己后面寫應(yīng)用的時候查看:

  • 勾子函數(shù)默認(rèn)都不能使用
  • 軟件定時器默認(rèn)不能使用
  • IPC機制中只能使用 信號量,互斥量和郵箱,事件集和消息隊列默認(rèn)不可以使用
  • 沒有內(nèi)存堆,不能使用動態(tài)創(chuàng)建函數(shù)
  • 沒有內(nèi)存管理,無法使用內(nèi)存池
  • 默認(rèn)沒有FinSH,無法使用shell命令

其他的以后遇到再說,當(dāng)然更高級點的功能當(dāng)然也不能使用,比如設(shè)備模型組件軟件包那些,我們還沒學(xué) = =!

三、初始項目占RAM大小

因為使用芯片內(nèi)存太小了,跑 RTOS 有一個關(guān)鍵的問題,就是內(nèi)存不夠,所以我們得時刻關(guān)注這一點我們來看一下,一看有點嚇一跳:

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

至于上圖結(jié)論怎么得出來的,可以看這篇很通俗很詳細很好的博文: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

感覺有點煩,啥都沒寫,就已經(jīng) 5840 字節(jié)了,估計后面會很難受,不過想想開始那個 main 線程使用了 2048 字節(jié),所以還有調(diào)整的余地,到時候我們來看看!

四、時刻保持查看測試結(jié)果

從0開始做一個項目,要保持良好的習(xí)慣,時刻保持查看測試結(jié)果,可以把復(fù)雜的問題簡單化,出問題很容易找出問題的來源。

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

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

下載到板子,一切正常。

結(jié)語

雖然本文只是新建了一個 RT-Thread Nano工程,但是我們分析了初始化項目代碼,說明了一些與學(xué)習(xí)時候大容量芯片不同且需要注意的地方,不僅讓我們更了解 RT-Thread Nano 的一些基本配置和初始化情況,同時也為我們后續(xù)的程序設(shè)計做好了充足的準(zhǔn)備,可以避免一些不必要的問題發(fā)生。

下一篇的內(nèi)容就是通過 STM32CubeMX 做外設(shè)的基本配置,然后添加一些簡單的測試代碼。

好的開始是成功的一半! 這個項目已經(jīng)做完一半了!= =!

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

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

    關(guān)注

    2263

    文章

    10847

    瀏覽量

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

    關(guān)注

    28

    文章

    1468

    瀏覽量

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

    關(guān)注

    31

    文章

    1249

    瀏覽量

    39726
收藏 人收藏

    評論

    相關(guān)推薦

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

    應(yīng)用篇-在STM32L051使用RT-Thread 第二篇,使用STM32CubeMX 進行對應(yīng)外設(shè)配置,同時做些簡單測試。
    的頭像 發(fā)表于 06-26 14:02 ?4410次閱讀
    <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 ?3547次閱讀
    <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 第四篇,巧妙的使用信號量處理串口通訊。
    的頭像 發(fā)表于 06-28 10:59 ?5043次閱讀
    <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 ?3783次閱讀
    <b class='flag-5'>STM32L051</b><b class='flag-5'>上</b>使用<b class='flag-5'>RT-Thread</b> (五、完結(jié)篇)

    從0到1教你寫RT-Thread新建工程

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

    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 新建項目項目導(dǎo)入介紹

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

    如何使用RT-Thread Studio來新建項目

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

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

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

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

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

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

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

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

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

    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征文精選】畫板子、敲代碼、玩RTOS、搞Linux,大家起“秀”!

    //STM32L051使用RT-Thread(新建項目)
    的頭像 發(fā)表于 08-25 09:56 ?643次閱讀
    【RTT征文精選】畫板子、敲代碼、玩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,因為使用0.2.3建立的模板編譯會報錯。
    的頭像 發(fā)表于 10-12 17:42 ?1148次閱讀