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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#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);

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

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




// 消息發(fā)送隊列
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);
}

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

2.2、消息的處理線程

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

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

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

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

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

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

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

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

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

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

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

    關(guān)注

    6063

    文章

    44916

    瀏覽量

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

    關(guān)注

    0

    文章

    404

    瀏覽量

    17790
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    841

    瀏覽量

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

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70253
收藏 人收藏

    評論

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

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

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

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

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

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

    RT0SMCS-51系列單片機(jī)中的應(yīng)用:嵌入式應(yīng)用中使用實時操作系統(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

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

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

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

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

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

    單片機(jī)程序框架

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    單片機(jī)是一種完整的計算機(jī)系統(tǒng),它集成了處理器、存儲器、輸入輸出接口等基本的計算機(jī)組成部分。單片機(jī)應(yīng)用廣泛,可以用于控制各種電子設(shè)備。單片機(jī)中,G
    的頭像 發(fā)表于 12-22 14:15 ?2494次閱讀
    主站蜘蛛池模板: 亚洲精品综合网在线8050影院 | 国产成人综合日韩精品婷婷九月 | 稀缺资源呦视频在线网站 | 日本三黄色大 | 免费看特级淫片日本 | 成人a级特黄毛片 | 午夜撸 | 天天干天天插 | 人人操在线播放 | 特黄视频免费看 | 一区二区美女视频 | 成在线人视频免费视频 | 日本免费精品视频 | 亚洲一区二区视频 | 免费看18污黄 | 人人射人人草 | 欧美特黄三级在线观看 | 视频一区二区三区在线观看 | 欧美xxxxxbbbb| 免费观看成年欧美1314www色 | 欧美性另类69xxx | 国产全黄三级三级 | 首页 亚洲 欧美 制服 丝腿 | 精品伊人久久大线蕉色首页 | h版欧美一区二区三区四区 h网站亚洲 | 国产三级久久久精品三级 | 五月激情六月 | 欧美成网站 | 啪啪午夜免费 | 五月亭亭免费高清在线 | 欧美色一级 | 你懂的手机在线观看 | 黄色视屏免费看 | 欧美成人午夜视频 | 日韩乱轮 | 成年人黄色免费网站 | 国产精品久久久久久久久齐齐 | 国产精品永久免费 | 免费爱做网站在线看 | 国产免费糟蹋美女视频 | 欧美一级片网址 |