應用篇-在STM32L051上使用RT-Thread 第五篇,也是本次應用的完結篇。
把按鍵驅動移植好,定時器使用加上。
目錄
- 前言
-
一、按鍵操作
- 1.1 按鍵驅動移植
- 1.2 按鍵測試
-
二、定時器操作
- 2.1 定時器邏輯添加
- 2.2 定時器測試
-
三、時刻關注占RAM大小
- 最后大小說明
- 結語
前言
在完成基本的傳感器采集,串口通訊移植修改后,其實作為一個單品傳感器已經是正常的工作起來了,但是如果我們在使用產品的時候有特殊情況,比如需要發送特定的無線報文,或者設置不同的工作模式之類的操作,我們就可以通過按鍵操作進行一定的配置。
所以本文會移植一個按鍵驅動,能夠支持按鍵 短按,固定時間的長按等操作,同時周期執行的程序改成使用定時器來控制。
本文是《RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread》完結篇
??
一個簡單的應用:無線溫濕度傳感器
??
一個小內存的芯片:STM32L051C8T6
??
一個小而美麗的物聯網操作系統:RT-Thread
??
本 RT-Thread 專欄記錄的開發環境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發環境 及 配合CubeMX開發快速上手)
RT-Thread記錄(二、RT-Thread內核啟動流程 — 啟動文件和源碼分析)
??
RT-Thread 內核篇系列博文鏈接:
RT-Thread記錄(三、RT-Thread 線程操作函數及線程管理與FreeRTOS的比較)
RT-Thread記錄(四、RT-Thread 時鐘節拍和軟件定時器)
RT-Thread記錄(五、RT-Thread 臨界區保護)
RT-Thread記錄(六、IPC機制之信號量、互斥量和事件集)
RT-Thread記錄(七、IPC機制之郵箱、消息隊列)
RT-Thread記錄(八、理解 RT-Thread 內存管理)
RT-Thread記錄(九、RT-Thread 中斷處理與階段小結)
??
在STM32L051C8 上使用 RT-Thread 應用篇系列博文連接:
RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread (一、無線溫濕度傳感器 之 新建項目)
RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread (二、無線溫濕度傳感器 之 CubeMX配置)
RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread (三、無線溫濕度傳感器 之 I2C通訊)
RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread (四、無線溫濕度傳感器 之 串口通訊)
一、按鍵操作
在初步的測試框架中,我當時使用的是簡單的按鍵處理方式,這里也上一下源碼做測試備份:
static void key_thread_entry(void *par){
while(1){
if(key1_read == 0){
rt_thread_mdelay(10); //去抖動
if(key1_read == 0){
//按鍵按下,do something
while(key1_read == 0){rt_thread_mdelay(10);}
}
}
if(key2_read == 0){
rt_thread_mdelay(10); //去抖動
if(key2_read == 0){
//按鍵按下,do something
while(key2_read == 0){rt_thread_mdelay(10);}
}
}
rt_thread_mdelay(1);
}
}
但是在實際中,如果要實現長按,組合按之類的方式,還是需要一個適用的按鍵驅動。
1.1 按鍵驅動移植
按鍵驅動 是用我自己一直使用的一個,在我博文以前上傳過,.c.h文件都開源了:
幾個實用的按鍵驅動(STM32、51都適用)
老樣子,把文件放置我們自己的驅動文件夾下面,然后右擊,同步 scons 配置至項目:
因為這個驅動程序源碼都給了,移植替換也不麻煩,所以簡單看看:
1.2 按鍵測試
使用方式我介紹按鍵的博文也說過,在這個應用上只使用了3中按鍵方式:
這里直接看下測試結果,按鍵正常:
按鍵移植成功,因為我們按鍵調用都使用的是開始已經創建好的看見線程,所以相對之前額外的內存占用是沒有的,多的只是一個全局變量Timer21_count
,如下圖:
細節說明: unsigned int 幾個字節在不同編譯器或者平臺可能是不一樣的,我們只需簡單的測試一下即可:
二、定時器操作
雖然按鍵也用到了定時器,但是那個定時器是專門給按鍵驅動用的,我們開始還初始化了一個定時時間1S的定時器,開始也測試過了。
在使用裸機的時候,需要一定時間周期性的進行某項工作,我們只能使用定時器,而用了操作系統,在單獨的線程中直接使用操作系統的延時函數也可以達到效果。
在一般的應用,定時時間沒有那么嚴格要求的時候,完全可以直接使用rt_thread_mdelay
,比如原始的周期處理:
但是復雜一些的應用,都使用rt_thread_mdelay
,線程多了管理起來就不方便了,如果使用定時器配合信號量(在裸機中就是全局變量)那就是比較規范的方式了。
2.1 定時器邏輯添加
我們需要給定時器創建一個計數的全局變量,然后到了一定的時間給需要執行任務的線程通知,這個通知我們新建信號量實現(雖然通知也可以使用全局變量),但是既然用了RT-Thread ,就把IPC機制用起來,這樣保證良好的習慣也為以后做大的應用打下好的基礎。
我們操作如下圖所示:
所以我們原始的周期處理代碼改成如下所示:
2.2 定時器測試
測試也沒什么,串口通訊接收報文也正常,今天改的按鍵和定時器也正常。
最后測試所有的功能和結果都正常:
三、時刻關注占RAM大小
今天的工作做完,本應用篇也算完結了,最后還是要看一下占用RAM的大小:
最終的程序,運行時候需要占用 RAM的大小: 7456 字節,我們的芯片 RAM:8192字節。
最后大小說明
從一開始,因為我們是在小內存的芯片上使用 RT-Thread ,所以每一篇每改一次代碼博主都會記錄內存使用大小。
最終程序我們上面記錄需要使用的 RAM 大小為 7456 字節,實際上本次應用內存占用還有一定的優化空間的,比如主線程2K還是可以減少一點,按鍵線程其實不需要512字節等等。。。
但是因為本次應用也確實簡單,而且內存也沒到溢出的地步,所以就沒有遇到瓶頸也就沒有特意的花精力去處理每一個線程合適的大小。
其實在文章中,我也經常說明一些影響內存的細節問題,希望看過我文章的小伙伴都有體會。
結語
?? 我希望大家都能夠自己去掌握自己程序的內存。??
掌握自己程序內存占用,首先要理解數據在芯片上的存放方式。
使用了操作系統,也得明白任務棧和系統棧的關系。對于每個線程,哪些操作需要占用內存都需要一定的了解。
對于基本的程序設計,也得明白 不同關鍵字修飾的變量存放的不同位置。
其實所有的這些我在自己的文章中都有過說明,相信關注博主的小伙伴一定有所收獲!
??
一個簡單的應用:無線溫濕度傳感器
??
一個小內存的芯片:STM32L051C8T6
??
一個小而美麗的物聯網操作系統:RT-Thread
好了,到本文為止,我們《RT-Thread 應用篇 — 在STM32L051上使用 RT-Thread》系列也就算完結了。
希望小伙伴多多支持,多多指教!謝謝!
從下一篇文章開始我們就要開始學習 RT-Thread 的 I/O 設備模型了。
審核編輯:湯梓紅
-
移植
+關注
關注
1文章
382瀏覽量
28160 -
定時器
+關注
關注
23文章
3255瀏覽量
115169 -
按鍵驅動
+關注
關注
0文章
11瀏覽量
7159 -
RT-Thread
+關注
關注
31文章
1305瀏覽量
40303
發布評論請先 登錄
相關推薦
評論