99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【飛凌嵌入式】基于i.MX9352開發(fā)板M核的FreeRTOS設(shè)計例程

飛凌嵌入式 ? 2025-06-13 16:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式系統(tǒng)領(lǐng)域,嵌入式實(shí)時操作系統(tǒng)(RTOS) 的應(yīng)用正日益廣泛,采用RTOS能夠更合理、更高效地利用CPU資源,FreeRTOS作為一款輕量級且成熟的實(shí)時操作系統(tǒng)內(nèi)核,其核心功能完備,包括任務(wù)管理、時間管理(如延時、定時器)、同步機(jī)制(信號量、互斥鎖)、進(jìn)程間通信(消息隊列)等等。這些特性使其能夠很好地滿足資源相對有限的中小型嵌入式系統(tǒng)的需求。

i.MX 9352作為NXP 推出的新一代輕量級邊緣AI處理器,集成2個Cortex-A55核和1個Cortex-M33實(shí)時核,其架構(gòu)設(shè)計充分體現(xiàn)了對實(shí)時性與復(fù)雜任務(wù)處理能力的兼顧。為了幫助開發(fā)者充分利用i.MX 9352 M33核的實(shí)時能力,其配套的M核SDK包提供的FreeRTOS例程分為兩類,一類介紹FreeRTOS系統(tǒng)組件特性,如信號量、互斥量、隊列等,另一類是介紹外設(shè)接口如何在FreeRTOS使用,我們分別挑選這兩類下的例程進(jìn)行演示。

演示平臺:飛凌嵌入式OK-MX9352-C開發(fā)板

947ec1d118914d02ad1aa7e1e4e7710a~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1750406773&x-signature=8X4xOjMgo7JENGAUiQ7QpbXJQVc%3D

1、FreeRTOS-generic

飛凌嵌入式OK-MX9352-C開發(fā)板支持FreeRTOS功能特性示例代碼如下:

  • freertos_event:任務(wù)事件演示例程
  • freertos_queue:隊列消息實(shí)現(xiàn)任務(wù)間通信的演示例程
  • freertos_mutex:互斥鎖使用例程
  • freertos_sem:信號量使用例程
  • freertos_swtimer:軟件計數(shù)器及其回調(diào)的用法。
  • freertos_tickless:使用 LPTMR 延時喚醒或者硬件中斷喚醒例程
  • freertos_generic:task、queue、swtimer、tick hook 、semaphore 組合利用演示例程。

因FreeRTOS_generic例程使用的FreeRTOS特性較多,我們重點(diǎn)分析此例程。

(1)軟件實(shí)現(xiàn)

示例程序內(nèi)容包括:任務(wù)創(chuàng)建、隊列、軟定時器、系統(tǒng)節(jié)拍時鐘、信號量、異常處理。具體如下:

任務(wù)創(chuàng)建:

主函數(shù)創(chuàng)建了隊列發(fā)送、接收,信號量三個任務(wù)。

// 創(chuàng)建隊列接收任務(wù) if(xTaskCreate(prvQueueReceiveTask,"Rx",configMINIMAL_STACK_SIZE+166,NULL,mainQUEUE_RECEIVE_TASK_PRIORITY,NULL)!=pdPASS) // 創(chuàng)建隊列發(fā)送任務(wù) if(xTaskCreate(prvQueueSendTask,"TX",configMINIMAL_STACK_SIZE+166, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL) !=pdPASS) // 創(chuàng)建信號量任務(wù) if(xTaskCreate(prvEventSemaphoreTask,"Sem",configMINIMAL_STACK_SIZE+166,NULL,mainEVENT_SEMAPHORE_TASK_PRIORITY, NULL) != pdPASS)

隊列:

隊列發(fā)送任務(wù),阻塞200ms后向隊列發(fā)送數(shù)據(jù);隊列接收任務(wù),任務(wù)阻塞讀取隊列,數(shù)據(jù)讀取正確,則打印此時的隊列接收數(shù)量。

// 隊列發(fā)送任務(wù),阻塞200ms后 向隊列發(fā)送數(shù)據(jù) static void prvQueueSendTask(void *pvParameters) { TickType_t xNextWakeTime; const uint32_t ulValueToSend = 100UL; xNextWakeTime = xTaskGetTickCount(); for (;;) { // 任務(wù)阻塞,直至200ms延時結(jié)束 vTaskDelayUntil(&xNextWakeTime, mainQUEUE_SEND_PERIOD_MS); // 向隊列發(fā)送數(shù)據(jù),阻塞時間為0表示當(dāng)隊列滿的時候就立即返回 xQueueSend(xQueue, &ulValueToSend, 0); } } // 隊列接收任務(wù),任務(wù)阻塞讀取隊列,數(shù)據(jù)讀取正確,則打印此時的隊列接收數(shù)量。 static void prvQueueReceiveTask(void *pvParameters) { uint32_t ulReceivedValue; for (;;) { // 任務(wù)一直阻塞,知道隊列內(nèi)讀取到數(shù)據(jù) xQueueReceive(xQueue, &ulReceivedValue, portMAX_DELAY); // 隊列數(shù)據(jù)和發(fā)送一致,隊列接收數(shù)量+1 輸出此時的隊列接收數(shù)量 if (ulReceivedValue == 100UL) { ulCountOfItemsReceivedOnQueue++; PRINTF("Receive message counter: %d.\r\n", ulCountOfItemsReceivedOnQueue); } } }

軟定時器:

設(shè)置軟定時器周期1s,時間到后,調(diào)用回調(diào)函數(shù),記錄次數(shù)并串口打印。

// 創(chuàng)建軟件定時器任務(wù) 時間為1s,周期循環(huán) xExampleSoftwareTimer = xTimerCreate( "LEDTimer", mainSOFTWARE_TIMER_PERIOD_MS, pdTRUE, (void *)0, vExampleTimerCallback); // 啟動軟件定時器 xTimerStart(xExampleSoftwareTimer, 0); // 回調(diào)函數(shù) static void vExampleTimerCallback(TimerHandle_t xTimer) { // 每1s進(jìn)入一次回調(diào)函數(shù),計數(shù)增加 ulCountOfTimerCallbackExecutions++; PRINTF("Soft timer: %d s.\r\n", ulCountOfTimerCallbackExecutions); }

系統(tǒng)節(jié)拍時鐘:

通過設(shè)置文件 FreeRTOSConfig.h 中 configTICK_RATE_HZ 設(shè)置任務(wù)節(jié)拍中斷頻率, 在啟動任務(wù)調(diào)度器時,系統(tǒng)會根據(jù)另一個變量CPU的頻率configCPU_CLOCK_HZ計算對應(yīng)寫入節(jié)拍計數(shù)器的值,啟動定時器中斷。

// 設(shè)置系統(tǒng)時鐘節(jié)拍為 1000/200=5ms #define configTICK_RATE_HZ ((TickType_t)200)

信號量:

每個系統(tǒng)節(jié)拍時鐘中斷中,調(diào)用函數(shù)vApplicationTickHook,累積500次即500*5ms=2.5s后,發(fā)送信號量。信號量任務(wù)獲取信號后,計數(shù)并打印累積次數(shù)。

// 系統(tǒng)節(jié)拍為5ms,每個500*5ms=2.5s 釋放事件信號量 void vApplicationTickHook(void) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; static uint32_t ulCount = 0; ulCount++; if (ulCount >= 500UL) { // 在中斷中釋放事件信號量 xSemaphoreGiveFromISR(xEventSemaphore, &xHigherPriorityTaskWoken); ulCount = 0UL; } } // 任務(wù)阻塞等待信號量,收到后,接收次數(shù)增加,并通過串口打印 static void prvEventSemaphoreTask(void *pvParameters) { for (;;) { // 任務(wù)阻塞,直到能獲取信號量 if (xSemaphoreTake(xEventSemaphore, portMAX_DELAY) != pdTRUE) { PRINTF("Failed to take semaphore.\r\n"); } // 接收到信號量的次數(shù)累加 ulCountOfReceivedSemaphores++; PRINTF("Event task is running. Get semaphore :%d \r\n",ulCountOfReceivedSemaphores); } }

異常處理:

當(dāng)內(nèi)存分配失敗、堆棧發(fā)生錯誤或任務(wù)空閑時,進(jìn)入相應(yīng)的函數(shù),用戶可添加相應(yīng)的處理函數(shù)。

// 內(nèi)存分配失敗函數(shù),當(dāng)內(nèi)存分配失敗時,進(jìn)入此函數(shù) void vApplicationMallocFailedHook(void) { for (;;) ; } // 堆棧錯誤檢查函數(shù),當(dāng)堆棧發(fā)生溢出時,進(jìn)入此函數(shù) void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) { (void)pcTaskName; (void)xTask; for (;;) ; } // 空閑任務(wù),優(yōu)先級最低,沒有實(shí)際意義,只是讓CPU有事情做,用戶可以自己添加自己的函數(shù) void vApplicationIdleHook(void) { volatile size_t xFreeStackSpace; xFreeStackSpace = xPortGetFreeHeapSize(); if (xFreeStackSpace > 100) { } }

(2)實(shí)驗(yàn)現(xiàn)象

① 編譯程序:在uboot手動加載M核程序。

② 隊列:每隔200ms,隊列發(fā)送任務(wù)發(fā)送數(shù)據(jù),隊列接收任務(wù)獲取數(shù)據(jù),從阻塞態(tài)到運(yùn)行態(tài),打印計數(shù)。

③ 軟定時器:每隔1s,時間到達(dá),調(diào)用回調(diào)函數(shù),打印計數(shù)。

④ 信號量:每隔5ms,系統(tǒng)時鐘節(jié)拍中斷調(diào)用函數(shù),超過500次后,釋放信號量。信號量任務(wù)獲的信號量,從阻塞態(tài)到運(yùn)行態(tài),打印計數(shù)。

33843bd8361044e79919a58d36fdc4f0~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1750406773&x-signature=bnnvbawRXcHwr2ClIoJaxzxyoy4%3D

2、FreeRTOS-外設(shè)

飛凌嵌入式OK-MX9352-C開發(fā)板支持外設(shè)使用FreeRTOS完成相應(yīng)功能,示例代碼如下:

  • freertos_uart:freertos串口演示例程
  • freertos_lpi2c_b2b:freertos I2C演示例程
  • freertos_lpspi_b2b:freertos SPI演示例程

因freertos_uart例程使用的FreeRTOS特性比較典型,我們重點(diǎn)分析此例程。

(1)軟件實(shí)現(xiàn)

示例程序內(nèi)容包括:串口初始化任務(wù)、串口發(fā)送任務(wù)、串口接收任務(wù)。具體如下:

串口初始化任務(wù):

主要包含串口外設(shè)初始化,發(fā)送、接收互斥量,發(fā)送和接收事件組。串口外設(shè)初始化在裸跑串口例程中已展現(xiàn),此處不再詳述。

// 創(chuàng)建串口發(fā)送互斥量 handle->txSemaphore = xSemaphoreCreateMutex(); // 創(chuàng)建串口接收互斥量 handle->rxSemaphore = xSemaphoreCreateMutex(); // 創(chuàng)建發(fā)送事件標(biāo)志組 handle->txEvent = xEventGroupCreate(); // 創(chuàng)建接收事件標(biāo)志組 handle->rxEvent = xEventGroupCreate();

串口發(fā)送:

發(fā)送前獲取信號量,啟動發(fā)送流程,在中斷中置位發(fā)送完成事件標(biāo)志。發(fā)送任務(wù)獲取到事件后,釋放發(fā)送信號量。

// 1 獲取發(fā)送信號量 if (pdFALSE == xSemaphoreTake(handle->txSemaphore, 0)) { return kStatus_Fail; } handle->txTransfer.data = (uint8_t *)buffer; handle->txTransfer.dataSize = (uint32_t)length; // 2 阻塞式發(fā)送 status = UART_TransferSendNonBlocking(handle->base, handle->t_state, &handle->txTransfer); if (status != kStatus_Success) { (void)xSemaphoreGive(handle->txSemaphore); return kStatus_Fail; } // 3 等待發(fā)送完成的事件 ev = xEventGroupWaitBits(handle->txEvent, RTOS_UART_COMPLETE, pdTRUE, pdFALSE, portMAX_DELAY);// 等待并判斷多個事件位 if ((ev & RTOS_UART_COMPLETE) == 0U) { retval = kStatus_Fail; } // 4 發(fā)送完成,釋放發(fā)送信號量 if (pdFALSE == xSemaphoreGive(handle->txSemaphore)) // 釋放信號量 { retval = kStatus_Fail; }

串口接收:

接收前獲取信號量,調(diào)用串口接收函數(shù),在中斷中置位獲取事件標(biāo)志。接收任務(wù)獲取到事件后,釋放接收信號量。

// 1獲取接收信號量 if (pdFALSE == xSemaphoreTake(handle->rxSemaphore, portMAX_DELAY)) { return kStatus_Fail; } handle->rxTransfer.data = buffer; handle->rxTransfer.dataSize = (uint32_t)length; // 2 串口接收函數(shù) status = UART_TransferReceiveNonBlocking(handle->base, handle->t_state, &handle->rxTransfer, &n); if (status != kStatus_Success) { (void)xSemaphoreGive(handle->rxSemaphore); return kStatus_Fail; } // 3 獲取接收事件 ev = xEventGroupWaitBits(handle->rxEvent,RTOS_UART_COMPLETE | RTOS_UART_RING_BUFFER_OVERRUN | RTOS_UART_HARDWARE_BUFFER_OVERRUN, pdTRUE, pdFALSE, portMAX_DELAY); // 等待并判斷接收完成事件位 // 3.1 硬件接收錯誤 if ((ev & RTOS_UART_HARDWARE_BUFFER_OVERRUN) != 0U) { UART_TransferAbortReceive(handle->base, handle->t_state); (void)xEventGroupClearBits(handle->rxEvent, RTOS_UART_COMPLETE); // 將接收完成的事件位清零, retval = kStatus_UART_RxHardwareOverrun; local_received = 0; } // 3.2 接收緩沖區(qū)過載錯誤 else if ((ev & RTOS_UART_RING_BUFFER_OVERRUN) != 0U) { UART_TransferAbortReceive(handle->base, handle->t_state); (void)xEventGroupClearBits(handle->rxEvent, RTOS_UART_COMPLETE); // 將接收完成的事件位清零, retval = kStatus_UART_RxRingBufferOverrun; local_received = 0; } // 3.3 接收完成 else if ((ev & RTOS_UART_COMPLETE) != 0U) { retval = kStatus_Success; local_received = length; } else { retval = kStatus_UART_Error; local_received = 0; } // 4 釋放接收信號量 if (pdFALSE == xSemaphoreGive(handle->rxSemaphore)) { retval = kStatus_Fail; }

(2)實(shí)驗(yàn)現(xiàn)象

① 編譯程序,在uboot手動加載M核程序。

② 裝置上電后,串口打印程序信息,此時通過鍵盤輸入4個字符,M核調(diào)試串口將回顯,重復(fù)輸入和回顯字符,證明程序運(yùn)行成功。

4353b0d8f34c483480f70cc3b602e913~tplv-tt-origin-web:gif.jpeg?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1750406773&x-signature=DnmR9MNzFFyT684zNG2BqZrJdN8%3D


以上就是在飛凌嵌入式i.MX 9352開發(fā)板M核上軟件設(shè)計FreeRTOS的例程演示,希望能夠?qū)Ω魑?a target="_blank">工程師朋友有所幫助。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9351

    瀏覽量

    377446
  • 嵌入式
    +關(guān)注

    關(guān)注

    5150

    文章

    19665

    瀏覽量

    317457
  • NXP
    NXP
    +關(guān)注

    關(guān)注

    61

    文章

    1347

    瀏覽量

    189336
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    493

    瀏覽量

    64323
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    i.MX9352開發(fā)板試用】+機(jī)械臂游戲3—游戲源代碼(開源)原創(chuàng)首發(fā)

    i.MX9352開發(fā)板試用】+機(jī)械臂游戲 3游戲操縱桿控制四自由度機(jī)械臂(開源)原創(chuàng)首發(fā) -
    的頭像 發(fā)表于 07-26 11:28 ?1391次閱讀

    5分鐘學(xué)會網(wǎng)絡(luò)服務(wù)搭建,i.MX9352 + Linux 6.1實(shí)戰(zhàn)示例

    本文將以嵌入式OK-MX9352-C開發(fā)板(搭載了在工業(yè)物聯(lián)網(wǎng)領(lǐng)域廣泛應(yīng)用的NXP i.MX9352
    的頭像 發(fā)表于 05-30 11:08 ?1695次閱讀
    5分鐘學(xué)會網(wǎng)絡(luò)服務(wù)搭建,<b class='flag-5'>飛</b><b class='flag-5'>凌</b><b class='flag-5'>i.MX9352</b> + Linux 6.1實(shí)戰(zhàn)示例

    嵌入式率先推出NXP i.MX6UL開發(fā)板

    6UltraLite處理器的OKMX6UL開發(fā)板,并于3月8日正式發(fā)布!嵌入式i.MX6UL核心
    發(fā)表于 03-12 15:11

    嵌入式 NXP i.MX6UL開發(fā)板

    嵌入式 NXP i.MX6UL開發(fā)板試用報告發(fā)布在哪里呢?
    發(fā)表于 01-15 15:10

    全球首發(fā)搭載i.MX 9352處理器的核心

    嵌入式正式全球首發(fā)搭載i.MX 9352處理器的FET-MX9352-C核心!?A
    發(fā)表于 12-28 10:27

    i.MX9352開發(fā)板試用】+ 開箱報告

    很幸運(yùn)的這次成為了i.MX9352開發(fā)板的試用者,今天收到快遞開始拆箱,做個簡單的點(diǎn)評吧。 拆開后還是很驚艷的,板子設(shè)計的很精良,而且從元器件上也能看得出
    發(fā)表于 06-05 16:41

    i.MX 9352新品開發(fā)板強(qiáng)勢來襲:高效安全的智能化升級,就用它!

    為了讓更多設(shè)備實(shí)現(xiàn)高能效、高安全性和智能化升級,恩智浦推出了全新的 i.MX 93x系列處理器 。恩智浦金牌合作伙伴之一,嵌入式技術(shù)有限公司在i
    的頭像 發(fā)表于 02-02 10:40 ?1349次閱讀

    【精選直播】嵌入式:NXP i.MX 9352處理器的I3C接口詳解

    直播簡介 為了讓更多設(shè)備實(shí)現(xiàn)高能效、高安全性和智能化升級,NXP推出了全新的i.MX 93x系列處理器。作為NXP的重要合作伙伴,嵌入式i.M
    的頭像 發(fā)表于 05-16 09:35 ?1617次閱讀

    首發(fā)!嵌入式i.MX9系列核心重磅發(fā)布

    嵌入式正式全球首發(fā)搭載i.MX 9352處理器的FET-MX9352-C核心
    的頭像 發(fā)表于 12-28 14:37 ?1543次閱讀
    首發(fā)!<b class='flag-5'>飛</b><b class='flag-5'>凌</b><b class='flag-5'>嵌入式</b><b class='flag-5'>i.MX</b>9系列核心<b class='flag-5'>板</b>重磅發(fā)布

    嵌入式技術(shù)帖——i.MX9352的GPIO怎么用?

    讓我們一起走近i.MX9352處理器,深入了解這位i.MX系列新成員的GPIO該如何操作,以及它與前輩i.MX6ULL處理器又有哪些異同。
    的頭像 發(fā)表于 05-16 15:07 ?1430次閱讀
    <b class='flag-5'>飛</b><b class='flag-5'>凌</b><b class='flag-5'>嵌入式</b>技術(shù)帖——<b class='flag-5'>i.MX9352</b>的GPIO怎么用?

    嵌入式i.MX9352開發(fā)板,讓通信安全又穩(wěn)定

    嵌入式OK-MX9352-C開發(fā)板特意增加了接口防護(hù)電路設(shè)計,除了作為設(shè)計參考之外,還可以保障使用過程中的安全和穩(wěn)定。
    的頭像 發(fā)表于 08-11 14:09 ?968次閱讀
    <b class='flag-5'>飛</b><b class='flag-5'>凌</b><b class='flag-5'>嵌入式</b><b class='flag-5'>i.MX9352</b><b class='flag-5'>開發(fā)板</b>,讓通信安全又穩(wěn)定

    OK-MX9352-C開發(fā)板 產(chǎn)品資料發(fā)布記錄-20230206

    嵌入式OK-MX9352-C開發(fā)板產(chǎn)品資料發(fā)布記錄-(20230206版)后續(xù)會有版本更新,請持續(xù)關(guān)注。
    發(fā)表于 02-13 09:04 ?9次下載

    3.1s啟動!嵌入式i.MX93開發(fā)板部署LVGL,打造更高效的GUI

    近期,嵌入式為基于NXP i.MX93系列處理器打造的OK-MX9352-C開發(fā)板成功移植了
    的頭像 發(fā)表于 01-16 11:52 ?762次閱讀
    3.1s啟動!<b class='flag-5'>飛</b><b class='flag-5'>凌</b><b class='flag-5'>嵌入式</b><b class='flag-5'>i.MX</b>93<b class='flag-5'>開發(fā)板</b>部署LVGL,打造更高效的GUI

    「2025恩智浦創(chuàng)新技術(shù)峰會」嵌入式亮相上海首站

    ,展示其在低成本人工智能、工業(yè)物聯(lián)網(wǎng)等領(lǐng)域的創(chuàng)新成果。此次峰會,嵌入式帶來了基于恩智浦i.MX95xx、i.MX9352、
    的頭像 發(fā)表于 05-15 13:38 ?680次閱讀
    「2025恩智浦創(chuàng)新技術(shù)峰會」<b class='flag-5'>飛</b><b class='flag-5'>凌</b><b class='flag-5'>嵌入式</b>亮相上海首站

    5分鐘學(xué)會網(wǎng)絡(luò)服務(wù)搭建!i.MX9352開發(fā)板 + Linux 6.1實(shí)戰(zhàn)示例

    本文就將以嵌入式OK-MX9352-C開發(fā)板(搭載了在工業(yè)物聯(lián)網(wǎng)領(lǐng)域廣泛應(yīng)用的NXP i.MX935
    的頭像 發(fā)表于 06-13 16:42 ?668次閱讀
    5分鐘學(xué)會網(wǎng)絡(luò)服務(wù)搭建!<b class='flag-5'>飛</b><b class='flag-5'>凌</b><b class='flag-5'>i.MX9352</b><b class='flag-5'>開發(fā)板</b> + Linux 6.1實(shí)戰(zhàn)示例