RT-Thread操作系统实时性分析

关键词:嵌入式,OS,实时

RT-Thread 是一个集内核、中间件组件于一体的实时操作系统(RTOS),具有极小内核、稳定可靠、简单易用、高度可伸缩、组件丰富等特点。

设计理念

RT-Thread 试图遵循更多 Linux/Unix 优雅、明快的风格。

简单、松耦合的设计是软件代码可维护性的一方面。

抽象外设驱动,形成简单、独立模块。一份 BSP(Board Support Package 板级支持包) 移植主要的工作是两个方面,芯片架构移植和外设支持。

    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代表一个事件。若干个事件构成一个事件集。

• 事件仅用于同步,不提供数据传输功能。

• 事件无排队性,即多次向线程发送同一事件(如果线程还未来得及读走),其效果等同于只发送一次。

事件可使用于多种场合,它能够在一定程度上替代信号量,用于线程间同步。

消息队列

消息队列是另一种常用的线程间通讯方式,它能够接收来自线程或中断服务例程中不固定长度的消息,并把消息缓存在自己的内存空间中。

消息队列可以应用于发送不定长消息的场合,包括线程与线程间的消息交换,以及中断服务例程中发送给线程的消息(中断服务例程不可能接收消息)。消息队列和邮箱的明显不同是消息的长度并不限定在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

 

 

 

猜你喜欢

转载自blog.csdn.net/cutter2002/article/details/89376258