《瑞薩RA產(chǎn)品家族初學者指南》系列文章已收錄成合集,歡迎點擊上方查看合集并訂閱!
9. 使用實時操作系統(tǒng)
上一章中的練習已經(jīng)利用了瑞薩RA系列單片機(MCU)靈活配置軟件包(FSP)的很大一部分。在本章中,您將使用FreeRTOS實時操作系統(tǒng)創(chuàng)建一個小型應(yīng)用程序,利用線程控制LED并利用信號量實現(xiàn)與按鈕的同步。您將親身體驗到這實際上僅需要幾個步驟。
我們將從頭開始創(chuàng)建完整的項目,因此如果您沒有進行過之前的實驗,請不必擔心。
本章目錄
線程、信號量和隊列
使用e2 studio將線程添加到FreeRTOS中
9.1 線程、信號量和隊列
在我們實際深入進行此練習之前,需要定義將在本章和下一章中使用的一些術(shù)語,以確保我們能夠達成共識。
首先,需要定義術(shù)語“線程”。如果您更習慣于“任務(wù)”這個表達方式,只需把線程看作是一種任務(wù)。有些人甚至互換使用這兩個短語。當使用實時操作系統(tǒng)(RTOS)時,單片機上運行的應(yīng)用程序?qū)⒉鸱譃閹讉€較小的半獨立代碼塊,每個代碼塊通??刂瞥绦虻囊粋€方面。這些小片段稱為線程。一個應(yīng)用程序中可以存在多個線程,但是在任何給定時間都只能有一個線程處于活動狀態(tài),因為RA系列單片機是單核器件。每個線程都有自己的堆??臻g,如果需要安全的上下文,則可以將其置于MCU的安全側(cè)。每個線程還分配有優(yōu)先級(相對于應(yīng)用程序中的其他線程),并且可以處于不同的狀態(tài),例如運行、就緒、阻塞或暫停。在FreeRTOS中,可以通過調(diào)用eTaskGetState()API函數(shù)來查詢線程的狀態(tài)。線程間信號傳輸、同步或通信是通過信號量、隊列、互斥、通知、直接任務(wù)通知或者流和消息緩沖區(qū)來實現(xiàn)的。
信號量是RTOS的資源,可用于傳輸事件和線程同步(以產(chǎn)生者-使用者方式)。使用信號量允許應(yīng)用程序暫停線程,直到事件發(fā)生并發(fā)布信號量。如果沒有RTOS,就需要不斷地輪詢標志變量或創(chuàng)建代碼來執(zhí)行中斷服務(wù)程序(ISR)中的某個操作,這會在相當長的一段時間內(nèi)阻塞其他中斷。使用信號量可快速退出ISR并將操作推遲到相關(guān)線程。
FreeRTOS提供計數(shù)信號量和二進制信號量。盡管二進制信號量由于只能采用兩個值(0和1)而非常適合實現(xiàn)任務(wù)之間或中斷與任務(wù)之間的同步,但是計數(shù)信號量的計數(shù)范圍可涵蓋0到用戶在FSP配置器中創(chuàng)建信號量期間指定的最大計數(shù)。默認值為256,可支持設(shè)計人員執(zhí)行更復雜的同步操作。
每個信號量都有兩個相關(guān)的基本操作:
xSemaphoreTake()(將使信號量遞減1)和xSemaphoreGive()(將使信號量遞增1)。
這兩個函數(shù)有兩種形式:一種是可以從中斷服務(wù)程序內(nèi)部調(diào)用(xSemaphoreTakeFromISR()和xSemaphoreGiveFromThread())的形式,另一種則是上述可以在線程的正常上下文中調(diào)用的形式。
我們需要討論的最后一個術(shù)語是隊列,即使在本練習中不使用隊列,下一章的練習中也會使用。報文隊列是線程間通信的主要方法,它允許在任務(wù)之間或中斷與任務(wù)之間發(fā)送消息。消息隊列中可以有一條或多條消息。數(shù)據(jù)(也可以是指向更大緩沖區(qū)的指針)會復制到隊列中,即,它不存儲引用而是消息本身。新消息通常置于隊列的末尾,但也可以直接發(fā)送到開頭。接收到的消息將從前面開始刪除。
允許的消息大小可在設(shè)計時通過FSP配置器指定。默認項大小為4個字節(jié),默認隊列長度(表示隊列中可存儲的項數(shù))為20。所有項的大小必須相同。FreeRTOS中的隊列數(shù)沒有限制;惟一的限制是系統(tǒng)中可用的存儲空間。使用xQueueSend()函數(shù)將消息放入隊列中,并通過xQueueReceive()從隊列中讀取消息。與信號量一樣,函數(shù)有兩種版本:一種可以從線程的上下文調(diào)用,另一種可以從ISR內(nèi)部調(diào)用。
9.2 使用e2 studio將線程添加到FreeRTOS中
接下來的練習也是基于EK-RA6M4評估板。這次,我們將使用電路板左上方的藍色按鈕S1向應(yīng)用程序傳輸事件,應(yīng)用程序?qū)⑶袚Q綠色LED2進行響應(yīng)。為實現(xiàn)目標,我們將使用FreeRTOS,事件的處理將在線程內(nèi)進行,并通過信號量進行通知。
像往常一樣,第一步是使用項目配置器創(chuàng)建一個新項目,這已在第4章和第8章中做過練習。首先,轉(zhuǎn)到“File → New → C/C++ Project”(文件 → 新建 → C/C++項目)。在所出現(xiàn)窗口的側(cè)邊欄中選擇Renesas RA,并突出顯示“Renesas RA C/C++ Project”(瑞薩RA C/C++項目)條目。單擊“Next”(下一步)并在出現(xiàn)的屏幕上輸入項目名稱,例如MyRtosProject。再次單擊“Next”(下一步)。此操作將轉(zhuǎn)到“Device and Tools Selection”(器件和工具選擇)窗口。首先,選擇一個電路板。選擇EK-RA6M4并將相應(yīng)的器件設(shè)置為R7FA6M4AF3CFB(如果尚未列出)。查看工具鏈:它應(yīng)顯示為GCC Arm Embedded。單擊“Next”(下一步)繼續(xù)操作。
在當前出現(xiàn)的屏幕中,可以在非TrustZone與安全和非安全TrustZone項目之間進行選擇。保持“Flat(NonTrustZone)Project”(扁平化(非TrustZone)項目)處于選中狀態(tài),然后單擊“Next”(下一步)。隨即出現(xiàn)“Build Artifact andRTOSSelection”(構(gòu)建工件和RTOS選擇)窗口。保持設(shè)置不變,即在“Build Artifact Selection”(構(gòu)建工件選擇)下選擇“Executable”(可執(zhí)行文件),在“RTOS Selection”(RTOS選擇)下選擇FreeRTOS。單擊“Next”(下一步),轉(zhuǎn)到下一個名為“Project Template Selection”(項目模板選擇)的屏幕。在此,選擇“FreeRTOS – Minimal – Static Allocation”(FreeRTOS – 最小化 – 靜態(tài)分配)。
最后,單擊“Finish”(完成),在配置器生成項目后,e2 studio將詢問您是否切換到“FSP Configuration”(FSP配置)透視圖。透視圖出現(xiàn)后,直接轉(zhuǎn)到“Stacks”(堆)選項卡。該選項卡將在“Threads”(線程)窗格中顯示“HAL/Common”(HAL/通用)線程的單個條目,其中包含I/O端口的驅(qū)動程序。單擊窗格頂部的“New Thread”(新線程)圖標(請參見圖9-1添加新線程)。
圖9-1:在FSP配置器出現(xiàn)之后,將僅顯示一個線程。選擇“New Thread”(新線程)按鈕,添加另一個線程
現(xiàn)在,在“Properties”(屬性)視圖中更改新線程的屬性:將“Symbol”(符號)重命名為led_thread,將“Name”(名稱)重命名為LED Thread。其他屬性保持默認值。在“LED Thread Stack”(LED線程堆)窗格中,單擊“New Stack”(新線程)按鈕圖標,選擇“Driver → Input → External IRQ Driver on r_icu”(驅(qū)動程序 → 輸入 → r_icu 上的外部IRQ驅(qū)動程序)(請參見圖9-2)。
圖9-2:添加新驅(qū)動程序只需單擊幾下鼠標
此操作將為外部中斷添加驅(qū)動程序。查看新驅(qū)動程序的“Properties”(屬性)并進行一些更改:首先,將“Channel”(通道)從0更改為10,因為S1所連引腳連接到IRQ10。出于相同的原因,將名稱更改為g_external_irq10或您喜歡的任何名稱。
為中斷分配優(yōu)先級12,啟動期間FSP將不會允許該中斷。也可以選擇任何其他優(yōu)先級,但開始時最好選擇優(yōu)先級12,因為即使在較大的系統(tǒng)中,也很少會遇到中斷優(yōu)先級沖突。請注意,優(yōu)先級15是為系統(tǒng)時鐘節(jié)拍定時器(systick)保留的,因此不應(yīng)被其他中斷使用。
圖9-3:堆元素的灰色條表示此驅(qū)動程序是模塊實例,只能由另一個FSP模塊實例引用。
將“Trigger”(觸發(fā)器)從“Rising”(上升)更改為“Falling”(下降)以捕捉按鈕激活操作,并將“Digital Filtering”(數(shù)字濾波)從“Disabled”(禁用)更改為“Enabled”(啟用)。始終將“Digital Filtering Sample Clock”(數(shù)字濾波采樣時鐘)設(shè)置為PCLK/64。這將有助于對按鈕去抖。最后,用external_irq10_callback替換Callback行中的NULL。每次按下S1都會調(diào)用此函數(shù)。在稍后創(chuàng)建應(yīng)用程序時,我們將為回調(diào)函數(shù)本身添加代碼。圖9-4給出了必要設(shè)置的摘要。
圖9-4:應(yīng)用程序所需的IRQ驅(qū)動程序的屬性
接下來,只需要執(zhí)行幾個步驟,即可編譯和下載程序。
第9章未完待續(xù)
原文標題:瑞薩RA產(chǎn)品家族初學者指南-第9章(1)
文章出處:【微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
mcu
+關(guān)注
關(guān)注
146文章
16802瀏覽量
349362 -
瑞薩
+關(guān)注
關(guān)注
33文章
22275瀏覽量
85821
原文標題:瑞薩RA產(chǎn)品家族初學者指南-第9章(1)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論