哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

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

汽車電子技術(shù) ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-02-10 14:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

  1. 創(chuàng)建任務

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

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

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

但是,考慮到項目中使用的是CAN通信的方式,接收消息就可以考慮使用CAN接收中斷的方式,能夠做到及時的響應接收消息,所以這個時候只需要3個線程即可。并且消息的接收使用隊列的方式接收,方便管理消息和進行線程之間的同步。消息的發(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、消息的處理線程

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

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

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

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

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

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

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

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

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

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

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

    關注

    6078

    文章

    45565

    瀏覽量

    673166
  • 框架
    +關注

    關注

    0

    文章

    404

    瀏覽量

    18486
  • RTOS
    +關注

    關注

    25

    文章

    868

    瀏覽量

    123200
  • 代碼
    +關注

    關注

    30

    文章

    4975

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    單片機為什么要用RTOS

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

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

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

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

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

    開源RTOSSTM32單片機中的應用

    開源RTOSSTM32單片機中的應用
    發(fā)表于 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?單片機就這一點資源,使用
    的頭像 發(fā)表于 03-19 15:10 ?6042次閱讀

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

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

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

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

    單片機程序框架

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

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

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

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

    1. 單片機與電腦,代碼運行空間的區(qū)別單片機與 電腦/Linux嵌入式 代碼運行空間上不同。
    發(fā)表于 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>運行位置跟電腦有什么不同?

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

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

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

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

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

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

    51單片機可以移植RTOS嗎?

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

    單片機解析g代碼的方法

    單片機是一種完整的計算機系統(tǒng),它集成了處理器、存儲器、輸入輸出接口等基本的計算機組成部分。單片機應用廣泛,可以用于控制各種電子設備。單片機中,G
    的頭像 發(fā)表于 12-22 14:15 ?3637次閱讀
    福安市| 土默特右旗| 望都县| 大渡口区| 陆良县| 石林| 东乡| 六枝特区| 大姚县| 安多县| 江津市| 南漳县| 上饶县| 绥中县| 辛集市| 凯里市| 霍山县| 综艺| 六盘水市| 浦北县| 盱眙县| 东丽区| 成都市| 浦城县| 车险| 柳州市| 合肥市| 徐水县| 天全县| 万年县| 曲周县| 即墨市| 巍山| 武陟县| 云林县| 河南省| 榆中县| 唐山市| 梨树县| 新沂市| 无为县|