關鍵詞:嵌入式,OS,實時
RT-Thread 是一個集核心、中間件元件于一體的實時作業系統(RTOS),具有極小核心、穩定可靠、簡單易用、高度可伸縮、元件豐富等特點。
設計理念
RT-Thread 試圖遵循更多 Linux/Unix 優雅、明快的風格。
簡單、松耦合的設計是軟體代碼可維護性的一方面。
抽象外設驅動,形成簡單、獨立子產品。一份 BSP(Board Support Package 闆級支援包) 移植主要的工作是兩個方面,晶片架構移植和外設支援。
RT-Thread 可以适配小型微控制器(主要保留核心部分,3kB Flash,1.2kB SRAM),到一個攜帶完整 POSIX 環境,包括複雜 UI,多媒體,物聯網等相關功能的微處理器。
原理分析
實時性能名額:
- 任務切換時間。
- 中斷響應時間。
- 消息傳送時間。
- 線程排程
rt-thread的排程算法為基于優先級排程和基于時間片輪轉排程共存的政策。
- 不同優先級的線程,采用可搶占的方式:就緒的高優先級的線程會“立刻”搶占低優先級的線程。
- 同線程優先級别的多個線程則采用時間片輪轉,同級線程依次獲得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代表一個事件。若幹個事件構成一個事件集。
• 事件僅用于同步,不提供資料傳輸功能。
• 事件無排隊性,即多次向線程發送同一事件(如果線程還未來得及讀走),其效果等同于隻發送一次。
事件可使用于多種場合,它能夠在一定程度上替代信号量,用于線程間同步。
消息隊列
消息隊列是另一種常用的線程間通訊方式,它能夠接收來自線程或中斷服務例程中不固定長度的消息,并把消息緩存在自己的記憶體空間中。
消息隊列可以應用于發送不定長消息的場合,包括線程與線程間的消息交換,以及中斷服務例程中發送給線程的消息(中斷服務例程不可能接收消息)。消息隊列和郵箱的明顯不同是消息的長度并不限定在4個位元組以内,另外消息隊列也包括了一個發送緊急消息的函數接口。但是當建立的是一個所有消息的最大長度是4位元組的消息隊列時,消息隊列對象将蛻化成郵箱。
消息隊列控制塊
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