女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在單片機中使用的RTOS代碼框架

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

最近在進行一個項目的開發和調試,使用的是單片機 + freeRTOS進行開發,通過一段時間的碼代碼和調試,各個方面都已經調通,功能也順利的實現,也在掛機測試了。

在這次開發中,也是遇到了很多的問題,主要的感想是關于代碼的框架。在單片機開發中,特別是使用了RTOS的時候,一個良好的代碼框架真的是相當的必要的。

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

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

  1. 創建任務

當開始一個項目代碼的編寫之前,都要考慮這份代碼要實現一些什么樣的功能,并將要實現的功能進行分類,根據功能的各自屬性可以歸納出幾個Module,然后想想在代碼中哪些功能要放在一塊,哪些功能要區分開等等的細節問題。

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

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

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

freeRTOS中創建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);

    // 發送消息的處理線程
   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);

消息接收隊列、消息發送隊列的創建,如下:

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




// 消息發送隊列
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中,查詢接收的話,要考慮消息接收是否及時,接收消息的線程優先級要比較高,否則容易造成處理的動作的延遲。

2.2、消息的處理線程

消息處理的線程任務函數如下:

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

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

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

  1. 消息的發送線程

消息的發送如下:

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

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6061

    文章

    44866

    瀏覽量

    645981
  • 框架
    +關注

    關注

    0

    文章

    404

    瀏覽量

    17771
  • RTOS
    +關注

    關注

    24

    文章

    838

    瀏覽量

    120682
  • 代碼
    +關注

    關注

    30

    文章

    4886

    瀏覽量

    70175
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    單片機為什么要用RTOS

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

    聊聊我對單片機程序的整體框架設計的一些思路體會

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

    RT0SMCS-51系列單片機中的應用

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

    開源RTOSSTM32單片機中的應用

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

    單片機資源少但是不能拒絕RTOS

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

    單片機資源這么少為什么還要用RTOS

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

    淺述單片機程序的整體框架設計的思路體會

    一些初學單片機的同學,剛剛入手做單片機開發,還沒有涉及到使用RTOS,且剛入手直接上RTOS可能會有些難度,有的使用的相對較老單片機資源還有
    的頭像 發表于 06-27 11:34 ?4597次閱讀
    淺述<b class='flag-5'>單片機</b>程序的整體<b class='flag-5'>框架</b>設計的思路體會

    單片機程序框架

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

    單片機就那點資源,為啥還要用RTOS

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

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

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

    新唐單片機代碼評審總結

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

    如何在單片機中使用malloc函數

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

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

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

    51單片機可以移植RTOS嗎?

    說起RTOS移植,我們首先會想到32位單片機
    發表于 05-23 17:09 ?2600次閱讀

    單片機解析g代碼的方法

    單片機是一種完整的計算機系統,它集成了處理器、存儲器、輸入輸出接口等基本的計算機組成部分。單片機應用廣泛,可以用于控制各種電子設備。單片機中,G
    的頭像 發表于 12-22 14:15 ?2424次閱讀