CPK-RA6M4評(píng)估板入門指南
要點(diǎn)
CPK-RA6M4是用于RA6M4單片機(jī)的評(píng)估板套件。該套件可通過靈活配置軟件包(FSP)和e2 studio IDE,對(duì)RA6M4 MCU群組的特性進(jìn)行無縫評(píng)估,并對(duì)嵌入系統(tǒng)應(yīng)用程序進(jìn)行開發(fā)。本文檔是《瑞薩RA MCU基礎(chǔ)知識(shí)》的配套文檔,旨在將該指南中有關(guān)硬件操作的部分在CPK-RA6M4評(píng)估板上進(jìn)行實(shí)現(xiàn)。
在使用本文檔之前,推薦您先學(xué)習(xí)《瑞薩RA MCU基礎(chǔ)知識(shí)》,以了解更多關(guān)于RA MCU的基礎(chǔ)知識(shí)以及其他相關(guān)知識(shí),這樣有助于您在本文所述的硬件實(shí)操中更快上手。
開發(fā)環(huán)境
e2 studio:2021-04版
FSP:v3.1.0
目錄
首次使用瑞薩CPK-RA6M4評(píng)估板
下載并測(cè)試示例
Hello World! – Hi Blinky!
使用實(shí)時(shí)操作系統(tǒng)
使用“靈活配置軟件包”通過USB端口發(fā)送數(shù)據(jù)
4. 使用實(shí)時(shí)操作系統(tǒng)
本章內(nèi)容基于《瑞薩RA MCU基礎(chǔ)知識(shí)》中的章節(jié)9使用實(shí)時(shí)操作系統(tǒng)所作。
您將在本章中學(xué)到以下內(nèi)容:
什么是線程、信號(hào)量和隊(duì)列,以及如何使用它們。
如何在e2 studio中向程序添加線程和信號(hào)量。
如何在RTOS控制下通過按鈕切換用戶LED的狀態(tài)。
上一章中的練習(xí)已經(jīng)利用了瑞薩RA系列單片機(jī)(MCU)靈活配置軟件包(FSP)的很大一部分。在本章中,您將使用FreeRTOS實(shí)時(shí)操作系統(tǒng)創(chuàng)建一個(gè)小型應(yīng)用程序,利用線程控制LED并利用信號(hào)量實(shí)現(xiàn)與按鈕的同步。您將親身體驗(yàn)到這實(shí)際上僅需要幾個(gè)步驟。
我們將從頭開始創(chuàng)建完整的項(xiàng)目,因此如果您沒有進(jìn)行過之前的實(shí)驗(yàn),請(qǐng)不必?fù)?dān)心。
4.1 線程、信號(hào)量和隊(duì)列
在我們實(shí)際深入進(jìn)行此練習(xí)之前,需要定義將在本章和下一章中使用的一些術(shù)語,以確保我們能夠達(dá)成共識(shí)。
首先,需要定義術(shù)語“線程”。如果您更習(xí)慣于“任務(wù)”這個(gè)表達(dá)方式,只需把線程看作是一種任務(wù)。有些人甚至互換使用這兩個(gè)短語。當(dāng)使用實(shí)時(shí)操作系統(tǒng)(RTOS)時(shí),單片機(jī)上運(yùn)行的應(yīng)用程序?qū)⒉鸱譃閹讉€(gè)較小的半獨(dú)立代碼塊,每個(gè)代碼塊通??刂瞥绦虻囊粋€(gè)方面。這些小片段稱為線程。一個(gè)應(yīng)用程序中可以存在多個(gè)線程,但是在任何給定時(shí)間都只能有一個(gè)線程處于活動(dòng)狀態(tài),因?yàn)镽A系列單片機(jī)是單核器件。每個(gè)線程都有自己的堆??臻g,如果需要安全的上下文,則可以將其置于MCU的安全側(cè)。每個(gè)線程還分配有優(yōu)先級(jí)(相對(duì)于應(yīng)用程序中的其他線程),并且可以處于不同的狀態(tài),例如運(yùn)行、就緒、阻塞或暫停。在FreeRTOS中,可以通過調(diào)用eTaskGetState()API函數(shù)來查詢線程的狀態(tài)。線程間信號(hào)傳輸、同步或通信是通過信號(hào)量、隊(duì)列、互斥、通知、直接任務(wù)通知或者流和消息緩沖區(qū)來實(shí)現(xiàn)的。
信號(hào)量是RTOS的資源,可用于傳輸事件和線程同步(以產(chǎn)生者-使用者方式)。使用信號(hào)量允許應(yīng)用程序暫停線程,直到事件發(fā)生并發(fā)布信號(hào)量。如果沒有RTOS,就需要不斷地輪詢標(biāo)志變量或創(chuàng)建代碼來執(zhí)行中斷服務(wù)程序(ISR)中的某個(gè)操作,這會(huì)在相當(dāng)長的一段時(shí)間內(nèi)阻塞其他中斷。使用信號(hào)量可快速退出ISR并將操作推遲到相關(guān)線程。
FreeRTOS提供計(jì)數(shù)信號(hào)量和二進(jìn)制信號(hào)量。盡管二進(jìn)制信號(hào)量由于只能采用兩個(gè)值(0和1)而非常適合實(shí)現(xiàn)任務(wù)之間或中斷與任務(wù)之間的同步,但是計(jì)數(shù)信號(hào)量的計(jì)數(shù)范圍可涵蓋0到用戶在FSP配置器中創(chuàng)建信號(hào)量期間指定的最大計(jì)數(shù)。默認(rèn)值為256,可支持設(shè)計(jì)人員執(zhí)行更復(fù)雜的同步操作。
每個(gè)信號(hào)量都有兩個(gè)相關(guān)的基本操作:xSemaphoreTake()(將使信號(hào)量遞減1)和xSemaphoreGive()(將使信號(hào)量遞增1)。這兩個(gè)函數(shù)有兩種形式:一種是可以從中斷服務(wù)程序內(nèi)部調(diào)用(xSemaphoreTakeFromISR()和SemaphoreGiveFromThread())的形式,另一種則是上述可以在線程的正常上下文中調(diào)用的形式。
我們需要討論的最后一個(gè)術(shù)語是隊(duì)列,即使在本練習(xí)中不使用隊(duì)列,下一章的練習(xí)中也會(huì)使用。報(bào)文隊(duì)列是線程間通信的主要方法,它允許在任務(wù)之間或中斷與任務(wù)之間發(fā)送消息。消息隊(duì)列中可以有一條或多條消息。數(shù)據(jù)(也可以是指向更大緩沖區(qū)的指針)會(huì)復(fù)制到隊(duì)列中,即,它不存儲(chǔ)引用而是消息本身。新消息通常置于隊(duì)列的末尾,但也可以直接發(fā)送到開頭。接收到的消息將從前面開始刪除。
允許的消息大小可在設(shè)計(jì)時(shí)通過FSP配置器指定。默認(rèn)項(xiàng)大小為4個(gè)字節(jié),默認(rèn)隊(duì)列長度(表示隊(duì)列中可存儲(chǔ)的項(xiàng)數(shù))為20。所有項(xiàng)的大小必須相同。FreeRTOS中的隊(duì)列數(shù)沒有限制;惟一的限制是系統(tǒng)中可用的存儲(chǔ)空間。使用xQueueSend()函數(shù)將消息放入隊(duì)列中,并通過xQueueReceive()從隊(duì)列中讀取消息。與信號(hào)量一樣,函數(shù)有兩種版本:一種可以從線程的上下文調(diào)用,另一種可以從ISR內(nèi)部調(diào)用。
4.2 使用e2 studio將線程添加到FreeRTOS中
接下來的練習(xí)也是基于CPK-RA6M4評(píng)估板。這次,我們將使用電路板下方的用戶按鈕S1向應(yīng)用程序傳輸事件,應(yīng)用程序?qū)⑶袚Q紅色LED的狀態(tài)進(jìn)行響應(yīng)。為實(shí)現(xiàn)目標(biāo),我們將使用FreeRTOS,事件的處理將在線程內(nèi)進(jìn)行,并通過信號(hào)量進(jìn)行通知。
第一步是使用項(xiàng)目配置器創(chuàng)建一個(gè)新項(xiàng)目。首先,轉(zhuǎn)到“File → New →“RenesasRAC/C++ Project””(文件→新建→Renesas C/C++ 項(xiàng)目)。單擊“Next”(下一步)并在出現(xiàn)的屏幕上輸入項(xiàng)目名稱,例如CPK_RA6M4_RtosProject。再次單擊“Next”(下一步)。此操作將轉(zhuǎn)到“Device and Tools Selection”(器件和工具選擇)窗口。首先,選擇一個(gè)電路板。選擇CPK-RA6M4并將相應(yīng)的器件設(shè)置為R7FA6M4AF3CFB(如果尚未列出)。查看工具鏈:它應(yīng)顯示為GCC Arm Embedded。單擊“Next”(下一步)繼續(xù)操作。
在當(dāng)前出現(xiàn)的屏幕中,可以在非TrustZone與安全和非安全TrustZone項(xiàng)目之間進(jìn)行選擇。保持“Flat(Non-TrustZone)Project”(扁平化(非TrustZone)項(xiàng)目)處于選中狀態(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)到下一個(gè)名為“Project Template Selection”(項(xiàng)目模板選擇)的屏幕。在此,選擇“FreeRTOS – Minimal – Static Allocation”(FreeRTOS–最小化–靜態(tài)分配)。
最后,單擊“Finish”(完成),在配置器生成項(xiàng)目后,e2 studio將詢問您是否切換到“FSP Configuration”(FSP配置)透視圖。透視圖出現(xiàn)后,直接轉(zhuǎn)到“Stacks”(堆)選項(xiàng)卡。該選項(xiàng)卡將在“Threads”(線程)窗格中顯示“HAL/Common”(HAL/通用)線程的單個(gè)條目,其中包含I/O端口的驅(qū)動(dòng)程序。單擊窗格頂部的“New Thread”(新線程)圖標(biāo)(請(qǐng)參見圖4-1添加新線程)。
圖4-1:在FSP配置器出現(xiàn)之后,將僅顯示一個(gè)線程。選擇“New Thread”(新線程)按鈕,添加另一個(gè)線程
現(xiàn)在,在“Properties”(屬性)視圖中更改新線程的屬性:將“Symbol”(符號(hào))重命名為led_thread,將“Name”(名稱)重命名為LED Thread。其他屬性保持默認(rèn)值。在“LED Thread Stack”(LED線程堆)窗格中,單擊“New Stack”(新線程)按鈕圖標(biāo),選擇“Driver → Input → External IRQ Driver on r_icu”(驅(qū)動(dòng)程序→輸入→r_icu上的外部IRQ驅(qū)動(dòng)程序)(請(qǐng)參見圖4-2)。
圖4-2:添加新驅(qū)動(dòng)程序只需單擊幾下鼠標(biāo)
此操作將為外部中斷添加驅(qū)動(dòng)程序。查看新驅(qū)動(dòng)程序的“Properties”(屬性):
首先,請(qǐng)確?!癈hannel”(通道)為0,因?yàn)镾1所連引腳連接到IRQ00。出于相同的原因,將名稱更改為g_external_irq00或您喜歡的任何名稱。
為中斷分配優(yōu)先級(jí)12,啟動(dòng)期間FSP將不會(huì)允許該中斷。也可以選擇任何其他優(yōu)先級(jí),但開始時(shí)最好選擇優(yōu)先級(jí)12,因?yàn)榧词乖谳^大的系統(tǒng)中,也很少會(huì)遇到中斷優(yōu)先級(jí)沖突。請(qǐng)注意,優(yōu)先級(jí)15是為系統(tǒng)時(shí)鐘節(jié)拍定時(shí)器(systick)保留的,因此不應(yīng)被其他中斷使用。
圖4-3:堆元素的灰色條表示此驅(qū)動(dòng)程序是模塊實(shí)例,只能由另一個(gè)FSP模塊實(shí)例引用
將“Trigger”(觸發(fā)器)從“Rising”(上升)更改為“Falling”(下降)以捕捉按鈕激活操作,并將“Digital Filtering”(數(shù)字濾波)從“Disabled”(禁用)更改為“Enabled”(啟用)。始終將“Digital Filtering Sample Clock”(數(shù)字濾波采樣時(shí)鐘)設(shè)置為PCLK/64。這將有助于對(duì)按鈕去抖。最后,用external_irq00_callback替換Callback行中的NULL。每次按下S1都會(huì)調(diào)用此函數(shù)。在稍后創(chuàng)建應(yīng)用程序時(shí),我們將為回調(diào)函數(shù)本身添加代碼。圖4-4 給出了必要設(shè)置的摘要。
圖4-4:應(yīng)用程序所需的IRQ驅(qū)動(dòng)程序的屬性
現(xiàn)在,只需要執(zhí)行幾個(gè)步驟,即可編譯和下載程序。下一步是添加信號(hào)量。
為此,請(qǐng)?jiān)凇癓ED Thread Objects”(LED線程對(duì)象)窗格中單擊“New Object”(新對(duì)象)按鈕。如果看到的不是此窗格,而是“HAL/Common Objects”(HAL/通用對(duì)象)窗格,則突出顯示“Threads”(線程)窗格中的“LED Thread”(LED線程),隨即將顯示此窗格。添加一個(gè)二進(jìn)制信號(hào)量,我們需要在按下按鈕時(shí)通知LED線程。將信號(hào)量的“Symbol”(符號(hào))屬性更改為g_s1_semaphore,并將“Memory Allocation”(存儲(chǔ)器分配)保留為“Static”(靜態(tài))?,F(xiàn)在,F(xiàn)SP配置器中的“Stacks”(堆)選項(xiàng)卡的外觀應(yīng)類似于圖4-5。
圖4-5:這是添加LED線程和信號(hào)量后“Stacks”(堆)選項(xiàng)卡應(yīng)呈現(xiàn)的外觀
FSP配置器中的最后一步是將S1連接的I/O引腳配置為IRQ00輸入。為此,請(qǐng)激活配置器中的“Pins”(引腳)選項(xiàng)卡,展開“Ports → P1”(端口→P1),然后選擇P105。在CPK-RA6M4評(píng)估板上,這是S1連接的端口。在右側(cè)的“Pin Configuration”(引腳配置)窗格中,為其指定符號(hào)名稱SW1,并確保其他設(shè)置與圖4-6中的設(shè)置相同。通常,配置器應(yīng)該已為您完成了相關(guān)設(shè)置。如果沒有完成,請(qǐng)相應(yīng)調(diào)整。請(qǐng)注意,右側(cè)的封裝查看器將突出顯示引腳103/P105,這樣便可獲得引腳位置的圖形參考。
圖4-6:應(yīng)已為IRQ00正確配置了端口P105
完成此操作后,即完成了配置器中的設(shè)置。保存更改,然后單擊其頂部的“Generate Project Content”(生成項(xiàng)目內(nèi)容)圖標(biāo)以創(chuàng)建必要的文件、文件夾和設(shè)置。
需要執(zhí)行的最后一項(xiàng)任務(wù)是添加初始化Leds結(jié)構(gòu)體所需的代碼,編寫幾行代碼來切換LED并讀取信號(hào)量,然后創(chuàng)建將設(shè)置信號(hào)量的回調(diào)函數(shù)??梢栽诒菊履┪膊榭赐暾a。
由于我們正在使用LED線程處理按鈕和切換LED的狀態(tài),因此本次需要將相關(guān)代碼添加到led_thread_entry.c文件中。在“Project Explorer”(項(xiàng)目資源管理器)中雙擊文件名以在編輯器中將其打開。如果未顯示文件,請(qǐng)展開項(xiàng)目文件夾,然后展開src錄。與第3章中的練習(xí)一樣,為LED添加結(jié)構(gòu)體并對(duì)其進(jìn)行初始化。需要定義用戶LED(紅色)所連I/O引腳的電平的另一個(gè)變量。將其命名為led_level。該變量的類型需要采用ioport_level_t,并且應(yīng)初始化為IOPORT_LEVEL_HIGH(在CPK-RA6M4上,“高”電平對(duì)應(yīng)于“開啟”)。
下一步將是打開并啟用連接到板上S1的IRQ00。為此,請(qǐng)使用IRQ FSP驅(qū)動(dòng)程序的打開和使能功能。完成后,初始化即完成。
在while(1)循環(huán)內(nèi)部,需要添加一些語句并刪除vTaskDelay(1);語句。先使用函數(shù)調(diào)用將led_level的值寫入用戶LED(紅色)的I/O引腳的輸出寄存器,然后執(zhí)行相關(guān)語句切換該引腳的電平。
有幾種方法可以實(shí)現(xiàn)這一點(diǎn)。自行實(shí)現(xiàn),回顧第3章的練習(xí)或查看本章結(jié)尾的代碼。不要忘記e2 studio的智能手冊(cè)功能,它會(huì)提供很大幫助!
While(1)循環(huán)中的最后一條語句是調(diào)用xSemaphoreTake(),將信號(hào)量的地址和常量portMAX_DELAY作為參數(shù)。后i一個(gè)參數(shù)將通知RTOS無限期地暫停線程,直到從IRQ00中斷服務(wù)程序調(diào)用的回調(diào)函數(shù)中釋放信號(hào)量為止。
最后要執(zhí)行的操作是添加回調(diào)函數(shù)本身。該函數(shù)應(yīng)盡可能短,因?yàn)樗鼘⒃谥袛喾?wù)程序的上下文中執(zhí)行。編寫此函數(shù)十分簡(jiǎn)單:只需轉(zhuǎn)到“Project Explorer”(項(xiàng)目資源管理器)中的“Developer Assistance →LED Thread → g_external_irq00 External IRQ Driver on r_icu”(開發(fā)人員幫助 →LED線程 → r_icu 上的g_external_irq00外部IRQ驅(qū)動(dòng)程序),然后將所出現(xiàn)列表末尾的回調(diào)函數(shù)定義拖放到源文件中。
在回調(diào)函數(shù)內(nèi),添加以下兩行代碼:
第一行中的宏將告知編譯器回調(diào)函數(shù)不使用參數(shù)p_args,從而避免編譯器發(fā)出警告,而第二行中的宏則在每次按下按鈕S1時(shí)釋放信號(hào)量。注意,必須使用give系列函數(shù)的中斷保存版本,因?yàn)榇撕瘮?shù)調(diào)用發(fā)生在ISR的上下文內(nèi)。此調(diào)用的第二個(gè)參數(shù)是*pxHigherPriorityTaskWoken。如果可能有一個(gè)或多個(gè)任務(wù)由于信號(hào)量發(fā)生阻塞并等待該信號(hào)量變?yōu)榭捎脿顟B(tài),并且其中一個(gè)任務(wù)的優(yōu)先級(jí)高于發(fā)生中斷時(shí)執(zhí)行的任務(wù),則此參數(shù)將在調(diào)用xSemaphoreGiveFromISR()后變?yōu)閠rue。在這種情況下,應(yīng)在退出中斷之前執(zhí)行上下文切換。由于在我們的示例中,沒有其他任務(wù)依賴于此信號(hào)量,因此可以將此參數(shù)設(shè)置為NULL。
完成所有代碼編寫后,單擊“Build”(編譯)圖標(biāo)(“錘子”),編譯項(xiàng)目。如果編譯后存在錯(cuò)誤,請(qǐng)返回程序,借助“Problems”(問題)視圖中顯示的編譯器反饋修復(fù)問題。
如果項(xiàng)目編譯成功,請(qǐng)單擊“Debug”(調(diào)試)圖標(biāo)旁的小箭頭,選擇“Debug Configurations”(調(diào)試配置),然后展開“Renesas GDB Hardware Debugging”(瑞薩GDB硬件調(diào)試)。選擇MyRtosProject Debug_Flat,或者為項(xiàng)目指定的名稱,然后單擊“Debug”(調(diào)試)。這樣便可啟動(dòng)調(diào)試器。如果您需要更多相關(guān)信息,請(qǐng)回顧第3章中的相關(guān)部分。調(diào)試器啟動(dòng)并運(yùn)行后,單擊“Resume”(恢復(fù))兩次?,F(xiàn)在程序正在執(zhí)行,每次按下CPK上的S1時(shí),用戶LED(紅色)都應(yīng)切換狀態(tài)。
最后一點(diǎn):在實(shí)際應(yīng)用中,應(yīng)執(zhí)行錯(cuò)誤檢查以確保程序正確運(yùn)行。為了清楚和簡(jiǎn)潔起見,本示例中將其省略。
您已成功完成本練習(xí)!
本章要點(diǎn)
通過使用全面的API,可以輕松使用FSP的各個(gè)函數(shù)。
FSP將處理大多數(shù)與用戶代碼無關(guān)的內(nèi)容。
使用FreeRTOS十分簡(jiǎn)單,因?yàn)镕SP配置器的使用非常直觀,添加線程和信號(hào)量也相當(dāng)輕松。
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17123瀏覽量
350973 -
瑞薩
+關(guān)注
關(guān)注
35文章
22308瀏覽量
86238 -
評(píng)估板
+關(guān)注
關(guān)注
1文章
537瀏覽量
29304 -
RA6M4
+關(guān)注
關(guān)注
0文章
51瀏覽量
441
原文標(biāo)題:CPK-RA6M4評(píng)估板入門指南-第4章
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論