加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 裸機(jī)代碼遷移說(shuō)明
    • 遷移案例說(shuō)明
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

MCU裸機(jī)應(yīng)用程序遷移到RTOS案例說(shuō)明

11/11 09:10
411
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

微信公眾號(hào) | strongerHuang

之前有小伙伴大概問(wèn)了這樣一個(gè)問(wèn)題:我的單片機(jī)裸機(jī)代碼,在RTOS中怎么實(shí)現(xiàn)?如何拆分多任務(wù)?

不知道你們初學(xué)RTOS的時(shí)候,是不是也有這樣的疑問(wèn):MCU裸機(jī)應(yīng)用程序如何遷移到RTOS實(shí)時(shí)操作系統(tǒng)中?

裸機(jī)代碼遷移說(shuō)明

將MCU裸機(jī)應(yīng)用程序遷移到RTOS(實(shí)時(shí)操作系統(tǒng))應(yīng)用程序,它其實(shí)是涉及軟件系統(tǒng)架構(gòu)“重構(gòu)”的一個(gè)過(guò)程。

你裸機(jī)代碼的軟件架構(gòu),和RTOS中用的軟件架構(gòu)存在明顯的區(qū)別,我們要遷移裸機(jī)代碼,其中就需要考慮一些遷移的問(wèn)題。下面簡(jiǎn)單說(shuō)幾點(diǎn):

1、評(píng)估現(xiàn)有系統(tǒng):分析現(xiàn)有裸機(jī)應(yīng)用程序的功能、性能需求和資源使用情況等。

2、選擇合適的RTOS:根據(jù)系統(tǒng)需求選擇合適的RTOS,如μC/OS、FreeRTOS、RT-Thread、ThreadX等。

3、搭建RTOS環(huán)境:在開(kāi)發(fā)環(huán)境中配置RTOS系統(tǒng),包括任務(wù)創(chuàng)建、消息隊(duì)列、信號(hào)量等需要用到的組件。

4、重構(gòu)代碼:將裸機(jī)應(yīng)用程序中的功能模塊重構(gòu)為RTOS任務(wù),利用RTOS提供的資源管理機(jī)制實(shí)現(xiàn)資源分配和同步。

5、測(cè)試和驗(yàn)證:對(duì)遷移后的系統(tǒng)進(jìn)行測(cè)試和驗(yàn)證,確保功能正確性和性能滿足要求。

6、......

以上是針對(duì)裸機(jī)項(xiàng)目遷移的一些常見(jiàn)做法,具體還需要結(jié)合項(xiàng)目實(shí)際情況做出相應(yīng)調(diào)整。

遷移案例說(shuō)明

我們這里簡(jiǎn)單舉一個(gè)例子,將一個(gè)MCU從裸機(jī)應(yīng)用程序遷移到FreeRTOS實(shí)時(shí)操作系統(tǒng)。
比如裸機(jī)應(yīng)用程序:一個(gè)LED亮滅閃爍,(間隔一段時(shí)間)讀取一組傳感器(如溫度、濕度等)數(shù)據(jù)并顯示,然后通過(guò)串口發(fā)送出去。。。

uint8_t sensorData[2];
int?main(void){  while(1)  {????LED_TOGGLE();????????????//LED亮滅
????ReadSensor(&sensorData);?//讀取傳感器數(shù)據(jù)并顯示????DisplayData(&sensorData);????????UARTSend(&sensorData);???//發(fā)送數(shù)據(jù)    Delay(100);  }}

以上裸機(jī)代碼,在RTOS中實(shí)現(xiàn),可以拆分為:

任務(wù)1:LED閃爍

任務(wù)2:讀取傳感器數(shù)據(jù)并顯示任務(wù)3:串口發(fā)送

最好還需要?jiǎng)?chuàng)建一個(gè)消息隊(duì)列:任務(wù)2的數(shù)據(jù),發(fā)送給任務(wù)3

創(chuàng)建三個(gè)任務(wù):

xTaskCreate(Task1_LED, "Task1_LED", STACK1_LED, NULL, STASK1_LED, NULL);
xTaskCreate(Task2_READSENSOR, "Task2_READSENSOR", STACK2_READSENSOR, NULL, STASK2_READSENSOR, NULL);
xTaskCreate(Task3_SEND, "Task3_SEND", STACK3_SEND, NULL, STASK3_SEND, NULL);

創(chuàng)建消息隊(duì)列:

QueueHandle_t xSENSORSendQueue = NULL; 
xSENSORSendQueue = xQueueCreate(SENSORSEND_QUEUE_LEN, SENSORSEND_QUEUE_SIZE);

任務(wù)1,就比較簡(jiǎn)單:

void Task1_LED(void *pvParameters){  for(;;)  {    LED_TOGGLE();    vTaskDelay(500);  }}

任務(wù)2,讀取傳感器數(shù)據(jù)并顯示,然后發(fā)送數(shù)據(jù)至任務(wù)3:

void Task2_READSENSOR(void *pvParameters){  for(;;)  {    ReadSensor(&sensorData);    DisplayData(&sensorData);        xQueueSend(xSENSORSendQueue , &sensorData, 100)
    vTaskDelay(100);  }}

任務(wù)3,接收任務(wù)2消息隊(duì)列,檢測(cè)按鍵,并通過(guò)串口發(fā)送數(shù)據(jù):

static uint8_t sensorData[2];
void Task3_SEND(void *pvParameters){  for(;;)  {    if(xQueueReceive(xSENSORSendQueue, &sensorData, 100) == pdTRUE)    {      UARTSend(&sensorData);    }
    vTaskDelay(10);  }}

以上就是裸機(jī)遷移到RTOS的簡(jiǎn)單案例,其實(shí),主要是對(duì)裸機(jī)復(fù)雜的“結(jié)構(gòu)”進(jìn)行拆分。

最后,要說(shuō)明一下,舉例可能不是很準(zhǔn)確,同時(shí),實(shí)際項(xiàng)目?jī)?yōu)化的空間還很大。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

作者黃工,從事嵌入式軟件開(kāi)發(fā)工作8年有余,高級(jí)嵌入式軟件工程師,業(yè)余維護(hù)公眾號(hào)『strongerHuang』,分享嵌入式軟硬件、單片機(jī)、物聯(lián)網(wǎng)等內(nèi)容。