《瑞薩RA產(chǎn)品家族初學(xué)者指南》系列文章已收錄成合集,歡迎點擊上方查看合集并訂閱!
9. 使用實時操作系統(tǒng)
本章目錄
9.2 使用e2 studio將線程添加到FreeRTOS中
接下來,只需要執(zhí)行幾個步驟,即可編譯和下載程序。
添加信號量。請在“LED Thread Objects”(LED線程對象)窗格中單擊“New Object”(新對象)按鈕。如果看到的不是此窗格,而是“HAL/Common Objects”(HAL/通用對象)窗格,則突出顯示“Threads”(線程)窗格中的“LED Thread”(LED線程),隨即將顯示此窗格。
添加一個二進(jìn)制信號量,我們需要在按下按鈕時通知LED線程。將信號量的“Symbol”(符號)屬性更改為g_s1_semaphore,并將“Memory Allocation”(存儲器分配)保留為“Static”(靜態(tài))。現(xiàn)在,F(xiàn)SP配置器中的“Stacks”(堆)選項卡的外觀應(yīng)類似于圖9-5。
圖9-5:這是添加LED線程和信號量后“Stacks”(堆)選項卡應(yīng)呈現(xiàn)的外觀
FSP配置器中的最后一步是將S1連接的I/O引腳配置為IRQ10輸入。為此,請激活配置器中的“Pins”(引腳)選項卡,展開“Ports → P0”(端口 → P0),然后選擇P005。在RA6M4評估板上,這是S1連接的端口。在右側(cè)的“Pin Configuration”(引腳配置)窗格中,為其指定符號名稱S1,并確保其他設(shè)置與圖9-6中的設(shè)置相同。通常,配置器應(yīng)該已為您完成了相關(guān)設(shè)置。如果沒有完成,請相應(yīng)調(diào)整。請注意,右側(cè)的封裝查看器將突出顯示引腳135/P005,這樣便可獲得引腳位置的圖形參考。
圖9-6:應(yīng)已為IRQ10正確配置了端口P005
完成此操作后,即完成了配置器中的設(shè)置。保存更改,然后單擊其頂部的“Generate Project Content”(生成項目內(nèi)容)圖標(biāo)以創(chuàng)建必要的文件、文件夾和設(shè)置。
需要執(zhí)行的最后一項任務(wù)是添加初始化Leds結(jié)構(gòu)體所需的代碼,編寫幾行代碼來切換LED并讀取信號量,然后創(chuàng)建將設(shè)置信號量的回調(diào)函數(shù)。可以在本章末尾查看完整代碼。
由于我們正在使用LED線程處理按鈕和切換LED,因此本次需要將相關(guān)代碼添加到led_thread_entry.c文件中。在“Project Explorer”(項目資源管理器)中雙擊文件名以在編輯器中將其打開。如果未顯示文件,請展開項目文件夾,然后展開src目錄。與第8章中的練習(xí)一樣,為LED添加結(jié)構(gòu)體并對其進(jìn)行初始化。需要定義LED2所連I/O引腳的電平的另一個變量。將其命名為led_level。該變量的類型需要采用ioport_level_t,并且應(yīng)初始化為IOPORT_LEVEL_HIGH(在EK-RA6M4上,“高”電平對應(yīng)于“開啟”)。
下一步將是打開并啟用連接到板上S1的IRQ10。為此,請使用IRQ FSP驅(qū)動程序的打開和使能功能。完成后,初始化即完成。
在while(1)循環(huán)內(nèi)部,需要添加一些語句并刪除vTaskDelay(1); 語句。先使用函數(shù)調(diào)用將led_level的值寫入LED2的I/O引腳的輸出寄存器,然后執(zhí)行相關(guān)語句切換該引腳的電平。有幾種方法可以實現(xiàn)這一點。自行實現(xiàn),回顧第8章的練習(xí)或查看本章結(jié)尾的代碼。不要忘記e2 studio的智能手冊功能,它會提供很大幫助!
While(1)循環(huán)中的最后一條語句是調(diào)用xSemaphoreTake(),將信號量的地址和常量portMAX_DELAY作為參數(shù)。后一個參數(shù)將通知RTOS無限期地暫停線程,直到從IRQ 10中斷服務(wù)程序調(diào)用的回調(diào)函數(shù)中釋放信號量為止。
最后要執(zhí)行的操作是添加回調(diào)函數(shù)本身。該函數(shù)應(yīng)盡可能短,因為它將在中斷服務(wù)程序的上下文中執(zhí)行。編寫此函數(shù)十分簡單:只需轉(zhuǎn)到“Project Explorer”(項目資源管理器)中的“Developer Assistance → LED Thread → g_external_irq10 External IRQ Driver on r_icu”(開發(fā)人員幫助 → LED線程 → r_icu 上的g_external_irq10外部IRQ驅(qū)動程序),然后將所出現(xiàn)列表末尾的回調(diào)函數(shù)定義拖放到源文件中。
在回調(diào)函數(shù)內(nèi),添加以下兩行代碼:
第一行中的宏將告知編譯器回調(diào)函數(shù)不使用參數(shù)p_args,從而避免編譯器發(fā)出警告,而第二行中的宏則在每次按下按鈕S1時釋放信號量。注意,必須使用give系列函數(shù)的中斷保存版本,因為此函數(shù)調(diào)用發(fā)生在ISR的上下文內(nèi)。此調(diào)用的第二個參數(shù)是*pxHigherPriorityTaskWoken。如果可能有一個或多個任務(wù)由于信號量發(fā)生阻塞并等待該信號量變?yōu)榭捎脿顟B(tài),并且其中一個任務(wù)的優(yōu)先級高于發(fā)生中斷時執(zhí)行的任務(wù),則此參數(shù)將在調(diào)用xSemaphoreGiveFromISR()后變?yōu)閠rue。在這種情況下,應(yīng)在退出中斷之前執(zhí)行上下文切換。由于在我們的示例中,沒有其他任務(wù)依賴于此信號量,因此可以將此參數(shù)設(shè)置為NULL。
完成所有代碼編寫后,單擊“Build”(編譯)圖標(biāo)(“錘子”),編譯項目。如果編譯后存在錯誤,請返回程序,借助“Problems”(問題)視圖中顯示的編譯器反饋修復(fù)問題。
如果項目編譯成功,請單擊“Debug”(調(diào)試)圖標(biāo)旁的小箭頭,選擇“Debug Configurations”(調(diào)試配置),然后展開“Renesas GDB Hardware Debugging”(瑞薩GDB硬件調(diào)試)。選擇MyRtosProject Debug_Flat,或者為項目指定的名稱,然后單擊“Debug”(調(diào)試)。這樣便可啟動調(diào)試器。如果您需要更多相關(guān)信息,請回顧第8章中的相關(guān)部分。調(diào)試器啟動并運行后,單擊“Resume”(恢復(fù))兩次。現(xiàn)在程序正在執(zhí)行,每次按下EK上的S1時,綠色LED2都相應(yīng)切換。
最后一點:在實際應(yīng)用中,應(yīng)執(zhí)行錯誤檢查以確保程序正確運行。為了清楚和簡潔起見,本示例中將其省略。
第9章 結(jié)束
原文標(biāo)題:瑞薩RA產(chǎn)品家族初學(xué)者指南-第9章(2)
文章出處:【微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
mcu
+關(guān)注
關(guān)注
146文章
17004瀏覽量
350335 -
瑞薩
+關(guān)注
關(guān)注
35文章
22293瀏覽量
86089
原文標(biāo)題:瑞薩RA產(chǎn)品家族初學(xué)者指南-第9章(2)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論