在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

在單片機(jī)中使用的RTOS代碼框架

汽車電子技術(shù) ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-02-10 14:21 ? 次閱讀

最近在進(jìn)行一個(gè)項(xiàng)目的開發(fā)和調(diào)試,使用的是單片機(jī) + freeRTOS進(jìn)行開發(fā),通過一段時(shí)間的碼代碼和調(diào)試,各個(gè)方面都已經(jīng)調(diào)通,功能也順利的實(shí)現(xiàn),也在掛機(jī)測(cè)試了。

在這次開發(fā)中,也是遇到了很多的問題,主要的感想是關(guān)于代碼的框架。在單片機(jī)開發(fā)中,特別是使用了RTOS的時(shí)候,一個(gè)良好的代碼框架真的是相當(dāng)?shù)谋匾摹?/p>

如果一開始沒有仔細(xì)的考慮好該怎么搭載一個(gè)代碼框架,寫代碼時(shí)想寫什么就寫什么,有什么功能要加找個(gè)地方就隨便插入進(jìn)入,當(dāng)代碼量大的時(shí)候就會(huì)看起來很亂。甚至將來接手代碼的人,估計(jì)內(nèi)心一萬個(gè)***從心中飛過,時(shí)刻游走在崩潰的邊緣,即使是想改點(diǎn)什么功能也不知道從哪里開始著手,估計(jì)會(huì)煩躁到喜提地中海!!!

本文就想分享一個(gè)我個(gè)人使用的單片機(jī)+freeRTOS的代碼框架,框架涉及到消息接收、消息處理、消息發(fā)送、其他動(dòng)作的處理。下面一步步說明代碼框架的搭建過程。

  1. 創(chuàng)建任務(wù)

當(dāng)開始一個(gè)項(xiàng)目代碼的編寫之前,都要考慮這份代碼要實(shí)現(xiàn)一些什么樣的功能,并將要實(shí)現(xiàn)的功能進(jìn)行分類,根據(jù)功能的各自屬性可以歸納出幾個(gè)Module,然后想想在代碼中哪些功能要放在一塊,哪些功能要區(qū)分開等等的細(xì)節(jié)問題。

并且還需要考慮代碼的耦合性,好的代碼是要能夠做到高內(nèi)聚低耦合的,各個(gè)功能模塊之間能夠獨(dú)立區(qū)分開,需要產(chǎn)生聯(lián)系的功能代碼,要通過某些通信手段實(shí)現(xiàn)(共享內(nèi)存、信號(hào)量、消息隊(duì)列等等),不要互相拉扯,像你中有我,我中有你這種情況要盡可能的避免。

比如,我手上的項(xiàng)目通過功能歸類劃分,就可以分為接收消息、處理消息、發(fā)送消息、其他功能處理,由此便可以考慮劃分出4個(gè)線程去處理。

但是,考慮到項(xiàng)目中使用的是CAN通信的方式,接收消息就可以考慮使用CAN接收中斷的方式,能夠做到及時(shí)的響應(yīng)接收消息,所以這個(gè)時(shí)候只需要3個(gè)線程即可。并且消息的接收使用隊(duì)列的方式接收,方便管理消息和進(jìn)行線程之間的同步。消息的發(fā)送也采用先壓入隊(duì)列再發(fā)送的方式。

freeRTOS中創(chuàng)建3個(gè)線程如下:

#define OTHER_HANDLE_TASK_PRIO         2
#define OTHER_HANDLE_STK_SIZE          256 
TaskHandle_t OtherHandleTask_Handler;


#define CAN_HANDLE_MSG_TASK_PRIO     3 
#define CAN_HANDLE_MSG_STK_SIZE      256  
TaskHandle_t Can_HandleMsgTask_Handler;


#define CAN_SEND_MSG_TASK_PRIO         2
#define CAN_SEND_MSG_STK_SIZE          256  
TaskHandle_t Can_SendMsgTask_Handler;




    // 其他功能的管理線程
    xTaskCreate((TaskFunction_t )OtherHandle_Task,
                (const char *   )"OtherHandle_Task",
                (uint16_t       )OTHER_HANDLE_STK_SIZE,
                (void *         )NULL,
                (UBaseType_t    )OTHER_HANDLE_TASK_PRIO,
                (TaskHandle_t * )&OtherHandleTask_Handler);




    // 接收消息的處理線程
   xTaskCreate((TaskFunction_t )Can_HandleMsg_Task,
               (const char *   )"Can_HandleMsg_Task",
               (uint16_t       )CAN_HANDLE_MSG_STK_SIZE,
               (void *         )NULL,
               (UBaseType_t    )CAN_HANDLE_MSG_TASK_PRIO,
               (TaskHandle_t * )&Can_HandleMsgTask_Handler);

    // 發(fā)送消息的處理線程
   xTaskCreate((TaskFunction_t )Can_SendMsg_Task,
               (const char *   )"Can_SendMsg_Task",
               (uint16_t       )CAN_SEND_MSG_STK_SIZE,
               (void *         )NULL,
               (UBaseType_t    )CAN_SEND_MSG_TASK_PRIO,
               (TaskHandle_t * )&Can_SendMsgTask_Handler);

消息接收隊(duì)列、消息發(fā)送隊(duì)列的創(chuàng)建,如下:

// 消息接收隊(duì)列
QueueHandle_t CanRxQueue;
CanRxQueue = xQueueCreate(xxxxxx, xxxxxx);




// 消息發(fā)送隊(duì)列
QueueHandle_t CanTxQueue;
CanTxQueue = xQueueCreate(xxxxxx, xxxxxx);
  1. CAN中斷接收消息 & 消息處理線程

2.1、CAN中斷接收消息如下:

void CAN1_RX0_IRQHandler(void)
{
    BaseType_t xHigherPriorityTaskWoken;

    /* 其他代碼 */

    xResult = xQueueSendFromISR(CanRxQueue, &ptwCanRxMsg, &xHigherPriorityTaskWoken);




    portYIELD_FROM_ISR (xHigherPriorityTaskWoken);
}

注意:接收很多時(shí)候不一定要使用中斷的方式,用查詢的方式也是可以的,只是在RTOS中,查詢接收的話,要考慮消息接收是否及時(shí),接收消息的線程優(yōu)先級(jí)要比較高,否則容易造成處理的動(dòng)作的延遲。

2.2、消息的處理線程

消息處理的線程任務(wù)函數(shù)如下:

void Can_HandleMsg_Task(void *pvParameters)
{
    while (1)
    {
        xQueueReceive(CanRxQueue, xxxxxx, portMAX_DELAY);
        /*
            處理部分
        */
     }
}

消息處理中使用了消息隊(duì)列的阻塞的特性,在隊(duì)列為空的時(shí)候阻塞掛起線程,可以減少CPU調(diào)度線程的壓力;當(dāng)消息隊(duì)列不為空的時(shí)候,隊(duì)列不再阻塞,線程從掛起中恢復(fù),參與調(diào)度并處理任務(wù)。

注意:在freeRTOS中可以用于阻塞的還有信號(hào)量、事件標(biāo)志組、消息郵箱。

  1. 消息的發(fā)送線程

消息的發(fā)送如下:

void Can_SendMsg_Task(void *pvParameters)
{
    while (1)
    {
        xQueueReceive(CanTxQueue, xxxxxx, portMAX_DELAY);
        /*
            處理部分
        */
     }
}

消息的發(fā)送中也使用了消息隊(duì)列,需要發(fā)送的消息可以先壓入隊(duì)列,然后由發(fā)送線程去發(fā)送。同樣使用隊(duì)列的阻塞特性,在隊(duì)列為空的時(shí)候阻塞掛起發(fā)送線程,減少CPU調(diào)度線程的壓力;當(dāng)發(fā)送消息的隊(duì)列不為空的時(shí)候,隊(duì)列不再阻塞,線程從掛起中恢復(fù),參與調(diào)度并將消息發(fā)送出去。

  1. 其他功能的處理線程
void OtherHandle_Task(void *pvParameters)
{
    while (1)
    {
          /*
            處理部分
          */
     }
}

其他功能的處理就放在其他任務(wù)線程中處理,比如GUI顯示、按鍵掃描、和傳感器通信等等的。具體需要幾個(gè)線程管理需要根據(jù)實(shí)際的項(xiàng)目情況進(jìn)行安排。另外各個(gè)線程的優(yōu)先級(jí)也要根據(jù)情況進(jìn)行安排,確保重要的功能部分能被及時(shí)的執(zhí)行到!

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

    關(guān)注

    6063

    文章

    44916

    瀏覽量

    646914
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    17790
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    841

    瀏覽量

    120758
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70253
收藏 人收藏

    評(píng)論

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

    單片機(jī)為什么要用RTOS

    對(duì)于搞單片機(jī)的特別用8051系列工程師來說,談到單片機(jī)RTOS,很多時(shí)候會(huì)問一句:“為什么要用RTOS?單片機(jī)就這一點(diǎn)資源,使用
    發(fā)表于 12-09 08:29

    聊聊我對(duì)單片機(jī)程序的整體框架設(shè)計(jì)的一些思路體會(huì)

    RTOS。或者使用RTOS整體思路上比較迷茫,不知從何入手,所以本文來聊聊我對(duì)單片機(jī)程序的整體框架設(shè)計(jì)的一些思路體會(huì)。為啥要討論架構(gòu)
    發(fā)表于 02-23 07:30

    RT0SMCS-51系列單片機(jī)中的應(yīng)用

    RT0SMCS-51系列單片機(jī)中的應(yīng)用:嵌入式應(yīng)用中使用實(shí)時(shí)操作系統(tǒng)(RTOS),已成為單片機(jī)
    發(fā)表于 12-03 22:38 ?24次下載

    開源RTOSSTM32單片機(jī)中的應(yīng)用

    開源RTOSSTM32單片機(jī)中的應(yīng)用
    發(fā)表于 09-25 09:50 ?20次下載
    開源<b class='flag-5'>RTOS</b><b class='flag-5'>在</b>STM32<b class='flag-5'>單片機(jī)</b>中的應(yīng)用

    單片機(jī)資源少但是不能拒絕RTOS

    對(duì)于搞單片機(jī)的特別用8051系列工程師來說,談到單片機(jī)RTOS,很多時(shí)候會(huì)問一句:為什么要用RTOS?單片機(jī)就這一點(diǎn)資源,使用
    的頭像 發(fā)表于 03-19 15:10 ?5739次閱讀

    單片機(jī)資源這么少為什么還要用RTOS

    對(duì)于搞單片機(jī)的特別用8051系列工程師來說,談到單片機(jī)RTOS,很多時(shí)候會(huì)問一句:“為什么要用RTOS單片機(jī)就這一點(diǎn)資源,使用
    發(fā)表于 07-11 17:39 ?1次下載
    <b class='flag-5'>單片機(jī)</b>資源這么少為什么還要用<b class='flag-5'>RTOS</b>

    淺述單片機(jī)程序的整體框架設(shè)計(jì)的思路體會(huì)

    一些初學(xué)單片機(jī)的同學(xué),剛剛?cè)胧肿?b class='flag-5'>單片機(jī)開發(fā),還沒有涉及到使用RTOS,且剛?cè)胧种苯由?b class='flag-5'>RTOS可能會(huì)有些難度,有的使用的相對(duì)較老單片機(jī)資源還有
    的頭像 發(fā)表于 06-27 11:34 ?4637次閱讀
    淺述<b class='flag-5'>單片機(jī)</b>程序的整體<b class='flag-5'>框架</b>設(shè)計(jì)的思路體會(huì)

    單片機(jī)程序框架

    單片機(jī)程序框架
    發(fā)表于 11-13 14:21 ?16次下載
    <b class='flag-5'>單片機(jī)</b>程序<b class='flag-5'>框架</b>

    單片機(jī)就那點(diǎn)資源,為啥還要用RTOS

    對(duì)于搞單片機(jī)的特別用8051系列工程師來說,談到單片機(jī)RTOS,很多時(shí)候會(huì)問一句:“為什么要用RTOS?單片機(jī)就這一點(diǎn)資源,使用
    發(fā)表于 11-26 14:36 ?1次下載
    <b class='flag-5'>單片機(jī)</b>就那點(diǎn)資源,為啥還要用<b class='flag-5'>RTOS</b>?

    為什么單片機(jī)代碼Flash中運(yùn)行,單片機(jī)代碼運(yùn)行位置跟電腦有什么不同?

    1. 單片機(jī)與電腦,代碼運(yùn)行空間的區(qū)別單片機(jī)與 電腦/Linux嵌入式 代碼運(yùn)行空間上不同。
    發(fā)表于 12-01 16:06 ?6次下載
    為什么<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>代碼</b><b class='flag-5'>在</b>Flash中運(yùn)行,<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>代碼</b>運(yùn)行位置跟電腦有什么不同?

    新唐單片機(jī)代碼評(píng)審總結(jié)

    昨晚上,我們一個(gè)同事組織了一個(gè)小會(huì)議,大家一起討論了一個(gè)項(xiàng)目的單片機(jī)代碼,這個(gè)單片機(jī)用的是新唐單片機(jī),期間大家也討論了一些問題,總結(jié)一下,希望對(duì)寫
    發(fā)表于 12-01 16:06 ?15次下載
    新唐<b class='flag-5'>單片機(jī)</b><b class='flag-5'>代碼</b>評(píng)審總結(jié)

    如何在單片機(jī)中使用malloc函數(shù)

    但是每個(gè)嵌入式 RTOS 都會(huì)有自己的內(nèi)存管理方式,本文就來聊聊我對(duì) malloc 函數(shù)單片機(jī)程序設(shè)計(jì)中的一些看法。 本文并不是要說明單片
    的頭像 發(fā)表于 04-24 09:50 ?2892次閱讀
    如何在<b class='flag-5'>單片機(jī)</b><b class='flag-5'>中使</b>用malloc函數(shù)

    分享一個(gè)單片機(jī)中使用的RTOS代碼框架

    最近在進(jìn)行一個(gè)項(xiàng)目的開發(fā)和調(diào)試,使用的是單片機(jī) + freeRTOS進(jìn)行開發(fā),通過一段時(shí)間的碼代碼和調(diào)試,各個(gè)方面都已經(jīng)調(diào)通,功能也順利的實(shí)現(xiàn),也掛機(jī)測(cè)試了。
    發(fā)表于 05-20 15:44 ?1405次閱讀

    51單片機(jī)可以移植RTOS嗎?

    說起RTOS移植,我們首先會(huì)想到32位單片機(jī)
    發(fā)表于 05-23 17:09 ?2636次閱讀

    單片機(jī)解析g代碼的方法

    單片機(jī)是一種完整的計(jì)算機(jī)系統(tǒng),它集成了處理器、存儲(chǔ)器、輸入輸出接口等基本的計(jì)算機(jī)組成部分。單片機(jī)應(yīng)用廣泛,可以用于控制各種電子設(shè)備。單片機(jī)中,G
    的頭像 發(fā)表于 12-22 14:15 ?2494次閱讀
    主站蜘蛛池模板: 久久婷婷国产一区二区三区 | 日本黄色视| 国产高清成人 | 久久视频免费看 | 国内一级特黄女人精品片 | 色老头影院 | 在线好吊色视频98gao | 亚洲精品91香蕉综合区 | 青青青草国产 | 四虎在线电影 | 色综合天天色综合 | 久草福利在线播放 | 亚洲成人免费在线观看 | 俺去啦最新网址 | 日本护士撒尿 | 五月婷婷色播 | 毛片站| 九九碰 | 久久亚洲视频 | 国内精品免费视频自在线 | 欧美黄色大片免费观看 | 四虎国产精品永久在线 | 四虎884tt紧急大通知 | 凹凸福利视频导航 | 男人的天堂视频网站清风阁 | 免费一级网站 | 国产免费一区二区三区在线 | 在线观看免费黄视频 | 久久综合久久久 | 九色中文| 国产成人精品影视 | 狠狠色综合色综合网络 | 亚洲第一中文字幕 | 国产色综合一区二区三区 | 免费一级牲交毛片 | 日日夜夜天天久久 | 午夜视频一区二区 | 中文天堂| 中文字幕一区二区三区乱码aⅴ | 亚洲成年人免费网站 | 四虎国产精品永久在线网址 |