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