关键词:嵌入式,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