應(yīng)用篇-在STM32L051上使用RT-Thread 第五篇,也是本次應(yīng)用的完結(jié)篇。
把按鍵驅(qū)動(dòng)移植好,定時(shí)器使用加上。
目錄
- 前言
-
一、按鍵操作
- 1.1 按鍵驅(qū)動(dòng)移植
- 1.2 按鍵測(cè)試
-
二、定時(shí)器操作
- 2.1 定時(shí)器邏輯添加
- 2.2 定時(shí)器測(cè)試
-
三、時(shí)刻關(guān)注占RAM大小
- 最后大小說明
- 結(jié)語
前言
在完成基本的傳感器采集,串口通訊移植修改后,其實(shí)作為一個(gè)單品傳感器已經(jīng)是正常的工作起來了,但是如果我們?cè)谑褂卯a(chǎn)品的時(shí)候有特殊情況,比如需要發(fā)送特定的無線報(bào)文,或者設(shè)置不同的工作模式之類的操作,我們就可以通過按鍵操作進(jìn)行一定的配置。
所以本文會(huì)移植一個(gè)按鍵驅(qū)動(dòng),能夠支持按鍵 短按,固定時(shí)間的長(zhǎng)按等操作,同時(shí)周期執(zhí)行的程序改成使用定時(shí)器來控制。
本文是《RT-Thread 應(yīng)用篇 — 在STM32L051上使用 RT-Thread》完結(jié)篇
??
一個(gè)簡(jiǎn)單的應(yīng)用:無線溫濕度傳感器
??
一個(gè)小內(nèi)存的芯片:STM32L051C8T6
??
一個(gè)小而美麗的物聯(lián)網(wǎng)操作系統(tǒng):RT-Thread
??
本 RT-Thread 專欄記錄的開發(fā)環(huán)境:
RT-Thread記錄(一、RT-Thread 版本、RT-Thread Studio開發(fā)環(huán)境 及 配合CubeMX開發(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é))
??
在STM32L051C8 上使用 RT-Thread 應(yīng)用篇系列博文連接:
RT-Thread 應(yīng)用篇 — 在STM32L051上使用 RT-Thread (一、無線溫濕度傳感器 之 新建項(xiàng)目)
RT-Thread 應(yīng)用篇 — 在STM32L051上使用 RT-Thread (二、無線溫濕度傳感器 之 CubeMX配置)
RT-Thread 應(yīng)用篇 — 在STM32L051上使用 RT-Thread (三、無線溫濕度傳感器 之 I2C通訊)
RT-Thread 應(yīng)用篇 — 在STM32L051上使用 RT-Thread (四、無線溫濕度傳感器 之 串口通訊)
一、按鍵操作
在初步的測(cè)試框架中,我當(dāng)時(shí)使用的是簡(jiǎn)單的按鍵處理方式,這里也上一下源碼做測(cè)試備份:
static void key_thread_entry(void *par){
while(1){
if(key1_read == 0){
rt_thread_mdelay(10); //去抖動(dòng)
if(key1_read == 0){
//按鍵按下,do something
while(key1_read == 0){rt_thread_mdelay(10);}
}
}
if(key2_read == 0){
rt_thread_mdelay(10); //去抖動(dòng)
if(key2_read == 0){
//按鍵按下,do something
while(key2_read == 0){rt_thread_mdelay(10);}
}
}
rt_thread_mdelay(1);
}
}
但是在實(shí)際中,如果要實(shí)現(xiàn)長(zhǎng)按,組合按之類的方式,還是需要一個(gè)適用的按鍵驅(qū)動(dòng)。
1.1 按鍵驅(qū)動(dòng)移植
按鍵驅(qū)動(dòng) 是用我自己一直使用的一個(gè),在我博文以前上傳過,.c.h文件都開源了:
幾個(gè)實(shí)用的按鍵驅(qū)動(dòng)(STM32、51都適用)
老樣子,把文件放置我們自己的驅(qū)動(dòng)文件夾下面,然后右擊,同步 scons 配置至項(xiàng)目:

因?yàn)檫@個(gè)驅(qū)動(dòng)程序源碼都給了,移植替換也不麻煩,所以簡(jiǎn)單看看:

1.2 按鍵測(cè)試
使用方式我介紹按鍵的博文也說過,在這個(gè)應(yīng)用上只使用了3中按鍵方式:

這里直接看下測(cè)試結(jié)果,按鍵正常:

按鍵移植成功,因?yàn)槲覀儼存I調(diào)用都使用的是開始已經(jīng)創(chuàng)建好的看見線程,所以相對(duì)之前額外的內(nèi)存占用是沒有的,多的只是一個(gè)全局變量Timer21_count
,如下圖:

細(xì)節(jié)說明: unsigned int 幾個(gè)字節(jié)在不同編譯器或者平臺(tái)可能是不一樣的,我們只需簡(jiǎn)單的測(cè)試一下即可:

二、定時(shí)器操作
雖然按鍵也用到了定時(shí)器,但是那個(gè)定時(shí)器是專門給按鍵驅(qū)動(dòng)用的,我們開始還初始化了一個(gè)定時(shí)時(shí)間1S的定時(shí)器,開始也測(cè)試過了。
在使用裸機(jī)的時(shí)候,需要一定時(shí)間周期性的進(jìn)行某項(xiàng)工作,我們只能使用定時(shí)器,而用了操作系統(tǒng),在單獨(dú)的線程中直接使用操作系統(tǒng)的延時(shí)函數(shù)也可以達(dá)到效果。
在一般的應(yīng)用,定時(shí)時(shí)間沒有那么嚴(yán)格要求的時(shí)候,完全可以直接使用rt_thread_mdelay
,比如原始的周期處理:

但是復(fù)雜一些的應(yīng)用,都使用rt_thread_mdelay
,線程多了管理起來就不方便了,如果使用定時(shí)器配合信號(hào)量(在裸機(jī)中就是全局變量)那就是比較規(guī)范的方式了。
2.1 定時(shí)器邏輯添加
我們需要給定時(shí)器創(chuàng)建一個(gè)計(jì)數(shù)的全局變量,然后到了一定的時(shí)間給需要執(zhí)行任務(wù)的線程通知,這個(gè)通知我們新建信號(hào)量實(shí)現(xiàn)(雖然通知也可以使用全局變量),但是既然用了RT-Thread ,就把IPC機(jī)制用起來,這樣保證良好的習(xí)慣也為以后做大的應(yīng)用打下好的基礎(chǔ)。
我們操作如下圖所示:

所以我們?cè)嫉闹芷谔幚泶a改成如下所示:

2.2 定時(shí)器測(cè)試
測(cè)試也沒什么,串口通訊接收?qǐng)?bào)文也正常,今天改的按鍵和定時(shí)器也正常。
最后測(cè)試所有的功能和結(jié)果都正常:

三、時(shí)刻關(guān)注占RAM大小
今天的工作做完,本應(yīng)用篇也算完結(jié)了,最后還是要看一下占用RAM的大?。?/p>
最終的程序,運(yùn)行時(shí)候需要占用 RAM的大?。?7456 字節(jié),我們的芯片 RAM:8192字節(jié)。
最后大小說明
從一開始,因?yàn)槲覀兪窃谛?nèi)存的芯片上使用 RT-Thread ,所以每一篇每改一次代碼博主都會(huì)記錄內(nèi)存使用大小。
最終程序我們上面記錄需要使用的 RAM 大小為 7456 字節(jié),實(shí)際上本次應(yīng)用內(nèi)存占用還有一定的優(yōu)化空間的,比如主線程2K還是可以減少一點(diǎn),按鍵線程其實(shí)不需要512字節(jié)等等。。。
但是因?yàn)楸敬螒?yīng)用也確實(shí)簡(jiǎn)單,而且內(nèi)存也沒到溢出的地步,所以就沒有遇到瓶頸也就沒有特意的花精力去處理每一個(gè)線程合適的大小。
其實(shí)在文章中,我也經(jīng)常說明一些影響內(nèi)存的細(xì)節(jié)問題,希望看過我文章的小伙伴都有體會(huì)。
結(jié)語
?? 我希望大家都能夠自己去掌握自己程序的內(nèi)存。??
掌握自己程序內(nèi)存占用,首先要理解數(shù)據(jù)在芯片上的存放方式。
使用了操作系統(tǒng),也得明白任務(wù)棧和系統(tǒng)棧的關(guān)系。對(duì)于每個(gè)線程,哪些操作需要占用內(nèi)存都需要一定的了解。
對(duì)于基本的程序設(shè)計(jì),也得明白 不同關(guān)鍵字修飾的變量存放的不同位置。
其實(shí)所有的這些我在自己的文章中都有過說明,相信關(guān)注博主的小伙伴一定有所收獲!
??
一個(gè)簡(jiǎn)單的應(yīng)用:無線溫濕度傳感器
??
一個(gè)小內(nèi)存的芯片:STM32L051C8T6
??
一個(gè)小而美麗的物聯(lián)網(wǎng)操作系統(tǒng):RT-Thread
好了,到本文為止,我們《RT-Thread 應(yīng)用篇 — 在STM32L051上使用 RT-Thread》系列也就算完結(jié)了。
希望小伙伴多多支持,多多指教!謝謝!
從下一篇文章開始我們就要開始學(xué)習(xí) RT-Thread 的 I/O 設(shè)備模型了。
審核編輯:湯梓紅
-
移植
+關(guān)注
關(guān)注
1文章
398瀏覽量
28690 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3298瀏覽量
118868 -
按鍵驅(qū)動(dòng)
+關(guān)注
關(guān)注
0文章
11瀏覽量
7235 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1406瀏覽量
41913
發(fā)布評(píng)論請(qǐng)先 登錄
STM32L051上使用RT-Thread (一、新建項(xiàng)目)

【原創(chuàng)精選】RT-Thread征文精選技術(shù)文章合集
RT-Thread STM32 配置系統(tǒng)時(shí)鐘(使用外部晶振)

RT-Thread全球技術(shù)大會(huì):在RT-Thread上編寫測(cè)試用例

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

STM32L4 RT-Thread Studio解決lptimer不工作的問題

評(píng)論