天天看點

RT-Thread作業系統實時性分析

關鍵詞:嵌入式,OS,實時

RT-Thread 是一個集核心、中間件元件于一體的實時作業系統(RTOS),具有極小核心、穩定可靠、簡單易用、高度可伸縮、元件豐富等特點。

設計理念

RT-Thread 試圖遵循更多 Linux/Unix 優雅、明快的風格。

簡單、松耦合的設計是軟體代碼可維護性的一方面。

抽象外設驅動,形成簡單、獨立子產品。一份 BSP(Board Support Package 闆級支援包) 移植主要的工作是兩個方面,晶片架構移植和外設支援。

RT-Thread作業系統實時性分析

    RT-Thread 可以适配小型微控制器(主要保留核心部分,3kB Flash,1.2kB SRAM),到一個攜帶完整 POSIX 環境,包括複雜 UI,多媒體,物聯網等相關功能的微處理器。

原理分析

實時性能名額:

  1. 任務切換時間。
  2. 中斷響應時間。
  3. 消息傳送時間。
  • 線程排程

rt-thread的排程算法為基于優先級排程和基于時間片輪轉排程共存的政策。

  1. 不同優先級的線程,采用可搶占的方式:就緒的高優先級的線程會“立刻”搶占低優先級的線程。
  2. 同線程優先級别的多個線程則采用時間片輪轉,同級線程依次獲得CPU時間。

rt-thread的核心排程算法采用位圖(bitmap)實作,算法時間複雜度為O(1)。

線程控制塊資料結構

struct rt_thread
{
    /* rt object */
    char        name[RT_NAME_MAX];                      /**< the name of thread */
    rt_uint8_t  type;                                   /**< type of object */
    rt_uint8_t  flags;                                  /**< thread's flags */

    rt_list_t   list;                                   /**< the object list */
    rt_list_t   tlist;                                  /**< the thread list */

    /* stack point and entry */
    void       *sp;                                     /**< stack point */
    void       *entry;                                  /**< entry */
    void       *parameter;                              /**< parameter */
    void       *stack_addr;                             /**< stack address */
    rt_uint32_t stack_size;                             /**< stack size */

    /* error code */
    rt_err_t    error;                                  /**< error code */

    rt_uint8_t  stat;                                   /**< thread status */


    /* priority */
    rt_uint8_t  current_priority;                       /**< current priority */
    rt_uint8_t  init_priority;                          /**< initialized priority */

    rt_uint32_t number_mask;

#if defined(RT_USING_EVENT)
    /* thread event */
    rt_uint32_t event_set;
    rt_uint8_t  event_info;
#endif

#if defined(RT_USING_SIGNALS)
    rt_sigset_t     sig_pending;                        /**< the pending signals */
    rt_sigset_t     sig_mask;                           /**< the mask bits of signal */

    void            *sig_ret;                           /**< the return stack pointer from signal */
    rt_sighandler_t *sig_vectors;                       /**< vectors of signal handler */
    void            *si_list;                           /**< the signal infor list */
#endif

    rt_ubase_t  init_tick;                              /**< thread's initialized tick */
    rt_ubase_t  remaining_tick;                         /**< remaining tick */

    struct rt_timer thread_timer;                       /**< built-in thread timer */

    void (*cleanup)(struct rt_thread *tid);             /**< cleanup function when thread exit */


    rt_uint32_t user_data;                             /**< private user data beyond this thread */
};
           
  • 線程同步和通信

實作方法,臨界區,互斥量和信号量,消息隊列。

事件

事件主要用于線程間的同步,與信号量不同,它的特點是可以實作一對多,多對多的同步。

RT-Thread定義的事件有以下特點:

• 事件隻與線程相關,事件間互相獨立:每個線程擁有32個事件标志,采用一個32 bit無符号整型數進行記錄,每一個bit代表一個事件。若幹個事件構成一個事件集。

• 事件僅用于同步,不提供資料傳輸功能。

• 事件無排隊性,即多次向線程發送同一事件(如果線程還未來得及讀走),其效果等同于隻發送一次。

RT-Thread作業系統實時性分析

事件可使用于多種場合,它能夠在一定程度上替代信号量,用于線程間同步。

消息隊列

消息隊列是另一種常用的線程間通訊方式,它能夠接收來自線程或中斷服務例程中不固定長度的消息,并把消息緩存在自己的記憶體空間中。

消息隊列可以應用于發送不定長消息的場合,包括線程與線程間的消息交換,以及中斷服務例程中發送給線程的消息(中斷服務例程不可能接收消息)。消息隊列和郵箱的明顯不同是消息的長度并不限定在4個位元組以内,另外消息隊列也包括了一個發送緊急消息的函數接口。但是當建立的是一個所有消息的最大長度是4位元組的消息隊列時,消息隊列對象将蛻化成郵箱。

RT-Thread作業系統實時性分析

消息隊列控制塊

struct rt_messagequeue
{
struct rt_ipc_object parent;

void* msg_pool; /* 存放消息的消息池開始位址 */

rt_uint16_t msg_size; /* 每個消息的長度*/
rt_uint16_t max_msgs; /* 最大能夠容納的消息數*/

 rt_uint16_t entry; /* 隊列中已有的消息數*/

 void* msg_queue_head; /* 消息連結清單頭*/
 void* msg_queue_tail; /* 消息連結清單尾*/
 void* msg_queue_free; /* 空閑消息連結清單*/
 };
 typedef struct rt_messagequeue* rt_mq_t;
           

參考

智能傳感器工業 4.0 的基礎

RT-Thread 簡介https://www.rt-thread.org/document/site/

基于RT-Thread的無人機資料記錄儀設計與實作  2018年電子技術應用第4期

https://github.com/RT-Thread/rtthread-manual-doc

RT-Thread的核心排程算法  www.cnblogs.com/shirleyxu/p/9468080.html