RT-Thread实时操作系统介绍
RT-Thread是发展中的下一代微内核嵌入式实时操作系统,被设计成一个宽范围可用的系统,从资源极度紧张的小型系统,到一个带内存管理单元,网络功能的基本计算单元。目前发布的是单内核v0.0.2版本,包含如下功能:
- 多线程,线程数不变,线程具备0 - 254优先级
- 基于优先级抢占的实时多线程调度器,相同优先级线程采用时间片轮转调度
- 线程间同步机制:sempahore,mutex
- 线程间通信机制:event/fast event,mailbox,message queue
- 一次及周期性定时器
- 静态内存管理,动态内存管理
- 内核对象管理系统 及 内核Hook机制
* Shell采用FinSH 0.4,可支持C语言表达式计算(包含简单C语言指针计算)
* lumit4510 BSP,亦支持skyeye模拟运行
IA32,NDS(任天堂掌上游戏机)的移植正在进行中。
许可证当前采用GPL发布,未来可能采用BSD发布。 体积技术指标:(lumit4510硬件环境下)
最小配置指标:正文段 13960字节,数据段 256字节,BSS段 3284字节
基本配置指标:正文段 14156字节,数据段 256字节,BSS段 3508字节
+ FinSH指标:正文段 43480字节,数据段 680字节,BSS段 7220字节 RT-Thread技术白皮书(单内核版本)
非飞 2006-07-30
RT-Thread单内核版本是RT-Thread实时操作的实时核心,然而它也是一个比较独立的面向极限嵌入式系统的实时操作系统,适合于资源极度紧张的小型系统。
内核
* 内核对象系统
系统具备内核对象管理系统,能够访问/管理所有内核对象。内核对象包含了内核中绝大部分设施,而这些内核对象可以是静态分配的静态对象,也可以是从系统内存堆中分配的动态对象。通过内核对象系统,RT-Thread可以做到不依赖于具体的内存分配方式,伸缩性得到极大的加强。
* 任务/线程调度
支持以线程为调度单位的多任务系统。调度算法是基于优先级的全抢占式线程调度,支持256个线程优先级,0优先级代表最高优先级,255优先级留给空闲线程使用;支持创建同优先级线程,相同优先级的线程采用可设置时间片的轮转调度;调度器寻找下一个最高优先级就绪线程的时间是恒定的(O(1))。系统不限制线程数量的多少,只和物理平台的具体内存相关。
* 同步机制
系统支持semaphore,mutex等线程间同步机制。mutex采用优先级继存方式以防止优先级翻转。semaphore释放动作可安全用于中断服务例程中。同步机制支持线程按优先级等待或按先进先出方式获取信号量或互斥锁。
* 通信机制
系统支持event/fast event,mailbox,message queue通信机制等。event支持多事件"或触发"及"与触发",适合于线程等待多个事件情况。fast event支持事件队列,确定事件阻塞线程的时间值固定。mailbox中一个mail的长度固定为4字节,效率较messagequeu高。通信设施中的发送动作可安全用于中断服务例程中。通信机制支持线程按优先级等待或按先进先出方式获取。
* 时钟,定时器
系统默认使用时钟节拍来完成同优先级任务的时间片轮转调度;线程对内核对象的时间敏感性是通过系统定时器来实现的,此外,定时也支持一次定时及周期性定时。
* 内存管理
系统支持静态内存池管理及动态内存堆管理。从静态内存池中获取内存块时间恒定,而当内存池空时,可把申请内存块的线程阻塞(或立刻返回,或等待一段时间仍未获得返回,取决于内存块申请时设置的等待时间),当其他线程释内存块到内存池时,将把阻塞线程唤醒。
FinSH
FinSH是RT-Thread内核中的shell系统,通过它能够直接在shell中调用系统函数,访问系统变量;接受C语言中大多数运算符(包括指针运算符)进行简单计算;通过定义指针(函数)变量并指向某特定地址,可以完成匿名函数调用的功能。
诊断
通过系统提供的FinSH shell系统,能够观测线程,信号量,互斥锁,事件,邮箱,消息队列的运行情况,能够获得各个线程的栈使用情况。
内核对象管理器中也提供了Hook机制,可以用于辅助纪录/跟踪内核对象的使用情况。
可移植性
系统采用核心与BSP分离的方式,其中内核采用100%标准C编写,具备优秀的可移植性,适合于多种体系结构多种编译器。抽象出的BSP层采用标准C和汇编混合编写。
RT-Thread的启动画面
http://openlab.rt-thread.com/rtt-download/rt-thread.jpg"finsh>>"是finsh shell的提示符号
finsh>>list_thread();
调用list_thread函数显示当前系统线程情况,信息分别是:
thread: 线程名称
pri: 线程优先级
status: 线程状态
sp: 线程当前的栈指针
stack size: 线程配置的栈大小
max used: 线程使用栈的最大值
left tick: 线程剩余的时钟节拍
error: 线程错误值
从上面可以追踪线程的运行状况,特别是栈的使用情况,基本上就不用担心线程栈分配小了而导致栈溢出了。 不错,支持 event/fast event
这两个的区别是什么? 是个人写的?还是公司写的? 恭喜!望取得更大成功! 同喜! 终于发布了,加油啊!:P 多谢鼓励!
BTW,lumit44b0什么时候可以发布?发布了,我可以考虑做一版RT-Thread for lumit44b0的移植。 event/fast event
这两个的区别是什么?
event是RTOS中比较传统的event flag
一个事件就是一个二进制位,一个event对象是一个32位整数,所以一个event对象最多可以容纳32个事件。目标线程可以按照"与"或者"或"位的方式来接收事件,适合于接收多事件的情况。
fast event对象也是32位整数,一个事件也是一个二进制位,每个事件位会拥有一个线程队列,当事件到来时,直接从队列中获得等待的线程并唤醒[所以寻找等待线程的时间是确定的]。fast event对于通常的RTOS而言优势并不大,但会用于微内核中断处理中。 刚刚下了稍微看了下比看RTLINUX轻松多了,不错go on.顺便问下这个系统是个人开发的吗? 为什么很多人对于是否个人开发很关心呢?
OK,这里我大致说明一下RT-Thread的开发过程、历史:
2006.2 开始着手RT-Thread的开发,当初的设想是,这应该是一个全新的系统,在某些方面应该和传统的RTOS不一样。另外,刚好在这个时候有一个项目:手持终端,可能需要一个比较完整的方案(OS + GUI + IDE环境)。
2006.5 由于有些围绕着那个手持终端而做,所以希望能够在结构上先求稳,在5月时发布了第一个版本0.0.1,这是针对一个极限资源环境(内存资源少,成本低)的操作系统,所以依然维持着现有RTOS的架构。
2006.6 发布RT-Thread 0.0.2版本。同时,手持终端项目因为各种原因没能到位,所以这个时候也就完全不考虑这个项目而单独发展。
2006.8 基于RT-Thread 0.0.2版本,调整整个操作系统的方向,命名为RT-Thread单内核分支,版本变为0.2.1,也就是现在的开源版本。
整个系统,从零到0.0.1,到0.2.1的版本升级,基本上都是我一个人独立完成。但是,目前,非常感谢几位热心的朋友加入进来参与以后的升级及移植工作。所以,以后的RT-Thread也不是我一个人的,而是大家的,而我本人,在0.2.2版本以后主要的工作将放在,
- RT-Thread 0.2系列版本的技术支持,这点我会尽力而为,请相信我,论坛上有什么问题,我也会尽力回答
- RT-Thread微内核版本的开发
同样,我也会一直坚持RT-Thread操作系统以后都采取开源的道路,并在条件满足时,转向BSD许可证(也就是说,可完全自由商用,只需要标识出采用了这个系统)。
good
希望加入开发团队[email protected] 已加,期待更多的爱好者加入到RT-Thread开发者行列!
页:
[1]
2