色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐ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ā)中,也是遇到了很多的問題,主要的感想是關(guān)于代碼的框架。在單片機開發(fā)中,特別是使用了RTOS的時候,一個良好的代碼框架真的是相當(dāng)?shù)谋匾摹?/p>

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

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

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

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

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

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

但是,考慮到項目中使用的是CAN通信的方式,接收消息就可以考慮使用CAN接收中斷的方式,能夠做到及時的響應(yīng)接收消息,所以這個時候只需要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、消息的處理線程

消息處理的線程任務(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ù)實際的項目情況進行安排。另外各個線程的優(yōu)先級也要根據(jù)情況進行安排,確保重要的功能部分能被及時的執(zhí)行到!

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

    關(guān)注

    6039

    文章

    44575

    瀏覽量

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

    關(guān)注

    0

    文章

    403

    瀏覽量

    17510
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    817

    瀏覽量

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

    關(guān)注

    30

    文章

    4801

    瀏覽量

    68735
收藏 人收藏

    評論

    相關(guān)推薦

    單片機為什么要用RTOS

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

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

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

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

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

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

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

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

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

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

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

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

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

    單片機程序框架

    單片機程序框架
    發(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ù)單片機程序設(shè)計中的一些看法。 本文并不是要說明單片
    的頭像 發(fā)表于 04-24 09:50 ?2589次閱讀
    如何在<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 ?1128次閱讀

    51單片機可以移植RTOS嗎?

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

    單片機解析g代碼的方法

    單片機是一種完整的計算機系統(tǒng),它集成了處理器、存儲器、輸入輸出接口等基本的計算機組成部分。單片機應(yīng)用廣泛,可以用于控制各種電子設(shè)備。單片機中,G
    的頭像 發(fā)表于 12-22 14:15 ?1836次閱讀
    主站蜘蛛池模板: 美女被男人撕衣舔胸| 欧美巨大xxxx做受高清| 国产电影三级午夜a影院| 国产国拍亚洲精品av麻豆| 国产成人在线免费| 国产全部视频列表支持手机| 国语自产视频在线| 九九在线精品视频| 美女被艹网站| 欧美日韩高清一区二区三区| 日日操日日射| 亚洲AV中文字幕无码久久| 亚洲精品视频在线播放| 永久免费无码AV国产网站| 中文字幕专区高清在线观看| AV97最新无码喷水叫床| 第一会所欧美无码原创| 国产婷婷色一区二区三区在线| 好色美女小雅| 久久无码AV亚洲精品色午夜| 嗯呐啊唔高H兽交| 神马电影我不卡国语版| 亚洲精品国产品国语在线试看| 伊人久久大香线蕉综合网站| 99国产在线视频有精品视频| 东热rq大乱交| 精品国产99久久久久久麻豆| 男人吃奶摸下弄进去好爽| 日久精品不卡一区二区| 亚洲嫩草影院久久精品| 69日本人xxxx16—18| 大地影院在线播放| 精品国产国产综合精品| 内射少妇36P亚洲区| 偷拍亚洲色自拍| 一区二区三区毛AAAA片特级| BL文高H强交| 国语92电影网午夜福利| 欧美 日韩 无码 有码 在线| 午夜向日葵高清在线观看| 最近中文字幕2019免费版日本|