RT-Thread/LM3S 0.3.0 RC1版发布

发布于 2010-01-04 10:08:39
实时线程操作系统是一款面向实时领域的操作系统,这个和通常的通用操作系统有着很大的不同。通用操作系统通常面对的是日常应用,例如打开浏览器上网,播放音乐,采用字处理软件编辑文档。

在古老的时代,通用操作系统一般只能处理一件事,而随着计算机技术日新月异的发展,硬件更新换代,上GHz主频、上GB内存、多核技术走进普通人的生活中,通用操作系统也就朝着并行化计算的方向发展。通用操作系统更多讲究的是,对这并行事务处理的公平性上,例如一个个民工在不同的窗口进行排队购买火车票,好的调度系统能够保证每个民工的公平性。

实时系统和这种通用系统有很大的差别。实时系统指的是,当外界有系统关注的相应事件发生时,系统能够在指定的时间内(deadline)进行正确的响应。用于实时系统的操作系统就叫做实时操作系统。从系统的定义也可以看得出,实时操作系统和通用操作系统在事务的处理上有明显的区别,实时操作系统有非常强的针对性,对相应的事件力求做到这固定的时间内进行响应;而通用操作系统则需要努力地做到各个事务的公平性(某些系统也会非常注意数据的吞吐量,例如网络服务器)。

实时线程操作系统(英文名RT-Thread)面向的正是这么一类的实时系统,因为其小型的特点也可以看成是一个嵌入式操作系统(嵌入式系统一般是针对一些专有目的而存在,比较吝啬于成本。而基于专有目的的特点,也注定了嵌入式系统或多或少的具有一些实时性的特点)。这种系统可以用于自动售票机,税控机,移动通信设备,mp3/mp4等便携式音乐设备,飞行器控制,车体导航控制,打印机,复印机,各类监控设备,路由器,ADSL,机顶盒等网络设备,医疗设备等等。

TI流明LM3S系列芯片是基于ARM Cortex M3 v7构架的32位芯片,其中LM3S S6000,S8000,S9000系列芯片携带网络功能。RT-Thread的标准内核可以运行在除LM3S S100系列外的所有系列芯片上。这次RT-Thread针对于LM3S进行移植验证并经过压力测试的是LM3S6918芯片,芯片携带64K片内静态内存,256K闪存,频率是50MHz。在这个平台上,RT-Thread支持的特性包括:

? 完善的实时核心
- 面向对象方式的实时核心(但依然保留了C语言的优雅、小巧风格);
- 默认32线程优先级的全抢占式实时内核(亦可配置成256线程优先级);相同优先级线程时间片轮转调度;
- 相同优先级线程实施时间片可配置的分时时间片轮转调度;
- 线程间同步机制:信号量和防止优先级翻转的互斥锁;
- 完善高效的线程间通信机制,包括邮箱,消息队列和事件;
- 支持线程挂起和唤醒的固定内存块管理及线程安全的动态内存堆管理;
- 向上层提供基于名字的统一接口设备驱动模型;

? FinSH shell命令行
- 命令即C代码的命令行方式;
- 直接在命令行中调用系统内核函数;
- 直接在命令行中访问系统全局变量;
- 历史记录及命令自动补全;

? 面向小型设备的虚拟文件系统
- 向上层应用提供POSIX风格的API接口;
- 支持多种具体文件系统实现;
- LM3S分支内置SD卡驱动程序;

? LwIP轻型TCP/IP协议栈
- 标准的BSD Socket接口;
- IP、ICMP、UDP、TCP标准协议支持;
- DNS,DHCP,PPP协议支持;
- TFTP、HTTP、FTP应用协议支持(见netutil组件);
- LM3S分支内置以太网驱动;

? 开发环境支持:
- GNU GCC (scons做为构建工具)
- Keil MDK


以上是RT-Thread/LM3S 0.3.0的特性,这些特性在RT-Thread 0.3.x分支中不会有大的改变。

技术指标及优势
看完RT-Thread的特性后,看看一些其他有吸引力的地方。

首先是体积。看网上有网友说,RT-Thread是否是基于Linux,或者直接使用Linux,这里不得不说,Linux并不是任何事情都做得到,它做不到在数KByte的内存占用上依然能够非常好的运行,而这类设备非常多。例如LM3S这类芯片,本身只有大约64K或更少的片内静态内存,另外就是闪存(通常在128K - 512K之间)。外扩内存基本上不太可能,这类芯片是完全的成本敏感型芯片,硬件决定了它已经不能外扩内存(LM3S最新款的已经支持能够外扩内存了,不过手上还没拿到)。

看几个体积指标:
RT-Thread标准Kernel(标准Kernel指得是没经过剪裁的内核):
9.5K只读数据和执行代码占用,1.5K内存占用(通常只读数据和执行代码放置在闪存中)

包括上面说的完整组件,即标准Kernel,finsh shell,文件系统,网络协议栈:
80K只读数据和执行代码占用,13.5K内存占用,当运行时,会有5K左右的动态内存占用。即当系统运行时,大约剩余45K内存给用户使用。

和LM3S提供的无操作系统LwIP,FatFS文件系统比较:
120K只读数据和执行代码占用,35K内存占用。即当系统运行时,大约剩余20K内存给用户使用。

再看看针对网络的一些性能指标
对比情况采用了相同的netio测试得到的数据统计
RT-Thread/LM3S
NETIO - Network Throughput Benchmark, Version 1.26
(C) 1997-2005 Kai Uwe Rommel
TCP connection established.
Packet size 1k bytes: 704 KByte/s Tx, 5131 Byte/s Rx.
Packet size 2k bytes: 704 KByte/s Tx, 1950 KByte/s Rx.
Packet size 4k bytes: 704 KByte/s Tx, 2197 KByte/s Rx.
Packet size 8k bytes: 704 KByte/s Tx, 2200 KByte/s Rx.
Packet size 16k bytes: 706 KByte/s Tx, 2196 KByte/s Rx.
Packet size 32k bytes: 709 KByte/s Tx, 2136 KByte/s Rx.
Done.

TI/无操作系统情况下的LwIP
NETIO - Network Throughput Benchmark, Version 1.26
(C) 1997-2005 Kai Uwe Rommel
TCP connection established.
Packet size 1k bytes: 870 KByte/s Tx, 5187 Byte/s Rx.
Packet size 2k bytes: 870 KByte/s Tx, 2463 KByte/s Rx.
Packet size 4k bytes: 870 KByte/s Tx, 3322 KByte/s Rx.
Packet size 8k bytes: 870 KByte/s Tx, 3239 KByte/s Rx.

(上面的是PC端NETIO输出的结果,Tx对应LM3S开发板上的接收,Rx对应LM3S开发板上的发送)
从上面可以看出,在大数据块发送时,RT-Thread/LM3S的移植会有一些损耗,但总的来说损耗不算太大,特别是报文在1k - 2k范围时数据相差不大。如何看待这个差异:通常没有操作系统时,系统能够更专注的做一件事。而有操作系统的情况下,它能够额外的做一些事务,这些事务在进行切换时,会产生一定的系统资源开销。总的来说,体积上的改善一定程度上弥补了性能的差距(例如RT-Thread/LM3S能够支持16k、32k bytes大小的网络包发送接收,而无操作系统的LwIP则不能)。

最后看看一些实时性能指标
这组数据是与著名的开源实时操作系统ecos的比较。测试代码完全相同,硬件平台相同(采用的是PXA310),编译器相同(GNU GCC),编译参数相同:
基本任务测试 RTT/ecos 1.40倍
协作调度测试 RTT/ecos 1.20倍
抢占调度测试 RTT/ecos 1.33倍
同步处理测试 RTT/ecos 1.86倍
内存分配测试 RTT/ecos 2.50倍

当一个实时操作系统能够做到稳定运行、性能比拟普遍运行的系统有一定优势、后续能够稳定发展时,那么她将是一款能够得到普遍使用的系统,而事实也正是如此:在中国,已经有十来家公司采用RT-Thread运用于他们的产品中,而后续打算在产品中采用RT-Thread的公司还有更多。

许可证
作为一套基础组件,就例如电脑中的中文输入法一样,它不应该收费,因此它能够免费的使用于商业产品中(0.3.x系统仅需要在我们这边进行产品信息备案,更换GPLv2许可证为商业许可证!0.4.x将更换产品许可证为BSD或Apache开源许可证)。
下载附件[RT-Thread 0.3.0 概述.pdf]
下载附件[rt-thread lm3s 0.3.0 rc1.zip]
下载附件[LM3S配置指南.pdf]
RT_Thread错误截图.JPG

查看更多

关注者
0
被浏览
25.8k
24 个回答
shaolin
shaolin 2010-01-04
1 RT-Thread/LM3S配置指南
1.1 LM3S系列芯片概述
LM3S系列芯片是美国德州仪器(TI)为汽车电子,工业控制,医疗电子等低成本嵌入式领域设计的32位计算能力的高性能芯片。
LM3S平台包括S100,S300,S600,S800,S1000,S2000,S3000,S5000,S6000,S8000,S9000几大系列芯片,除S100和S300系列最大支持主频分别在20MHz和25MHz以外,其他所有系列芯片支持最大主频均为50MHz。LM3S系列芯片片内FLASH一般在8KByte,16KByte,32KByte,64KByte,128KByte,256KByte,片内SRAM一般在2Kbyte,8Kbyte,16Kbyte,32Kbyte,64Kbyte不等。此外,S6000,S8000,S9000系列集成了100MHz以太网控制器。
1.2 RT-Thread的典型体积要求
下面看下RT-Thread几组典型的体积要求:
1)RT-Thread/LM3S标准Kernel(标准Kernel指得是没经过剪裁的内核):
Program Size: Code=9150 RO-data=478 RW-data=120 ZI-data=1440
9.5K只读数据和执行代码占用,1.5K内存占用(通常只读数据和执行代码放置在闪存中)
从以上数据看出,RT-Thread/LM3S标准Kernel可以运行在除S100系列以外的所有LM3S系列芯片中。
2)RT-Thread/LM3S标准Kernel + Lwip协议栈
Program Size: Code=45654 RO-data=838 RW-data=308 ZI-data=6372
46K只读数据和执行代码占用,7K内存占用,另外,运行时会有5K左右动态内存占用。
从以上数据可以看出,RT-Thread/LM3S标准Kernel + Lwip协议栈可以运行在所有集成以太网控制器的LM3S系列芯片上。
2)RT-Thread/LM3S标准Kernel + Lwip协议栈 + File System + Finsh Shell + LM3S Lib
Program Size: Code=78826 RO-data=2298 RW-data=700 ZI-data=12972
标准Kernel,Finsh Shell,文件系统,网络协议栈,需要80K只读数据和执行代码占用,13.5K内存占用,当运行时,会有5K左右的动态内存占用。即如果芯片有64K的SRAM,当系统运行时,大约剩余45K内存给用户使用。
1.3 LM3S芯片类型的配置
当您使用RT-Thread时,请先确定您使用的芯片型号,在软件的配置上主要是选择芯片型号(在工程的选项中):
fengzi
fengzi 2010-01-05
支持 [s:175]

LM3S 0.3.0 RC1中
serial.c中问题仍未修正
Line62:               UARTIntStatus(serial->hw_base, true);

应为
status = UARTIntStatus(serial->hw_base, true);
ffxz
ffxz 2010-01-05
呃,我以为shaolin会注意到这个问题,所以没提醒他,我的错。

fengzi你有代码提交权限吗?你来更新上去吧,大家多参与了,问题也就能够早发现早解决。
shaolin
shaolin 2010-01-05
这个问题没注意到,汗 [s:183]。
fengzi
fengzi 2010-01-05
呃,我以为shaolin会注意到这个问题,所以没提醒他,我的错。

fengzi你有代码提交权限吗?你来更新上去吧,大家多参与了,问题也就能够早发现早解决。


没有权限,fengzi.rtt@gmail.com,老大开一下吧
能力有限,但希望为RTT添砖加瓦
bernard
bernard 2010-01-05
呃,我以为shaolin会注意到这个问题,所以没提醒他,我的错。

fengzi你有代码提交权限吗?你来更新上去吧,大家多参与了,问题也就能够早发现早解决。


没有权限,fengzi.rtt@gmail.com,老大开一下吧
能力有限,但希望为RTT添砖加瓦


done!

开发者在使用google svn中需要注意的两点:
1. 提交代码,svn链接是以https开头,而不是http。
2. svn提交密码需要到自己google帐号的profile中获得(一个复杂的密码,自己不能修改,只能重新生成)
chenbm2008
chenbm2008 2010-01-10
在你的MDK项目中,选择LM3S6432 ,我自己做的LM3S6432的开发板,编译成功后,下载,校验都没有问题,但是, 接着运行马上提示错误,JTAG 被 锁了。
需要解锁后,才能烧写!
bernard
bernard 2010-01-10
估计6432和6918的某些pin刚好冲突,所以直接切换过去有些问题,建议仔细比较下不同。另外,也可以从最基础的组件一个个添加:先Kernel,然后finsh shell,。。。
aozima
aozima 2010-01-10
STM32这方面要好得多.
只是IO的分布太锤子了....
31617105
31617105 2010-01-21
流明的启动startup.s没添加吗 难道没有用到中断??
jake666
jake666 2010-01-22
可不可以支持at91sam9260
shaolin
shaolin 2010-01-22
流明的启动startup.s没添加吗 难道没有用到中断??


libcpu目录下有start_rvds.s和start_gcc.s文件,对应了MDK和GCC编译环境下的启动代码,中断是在这里面配置的。
guolh
guolh 2010-01-26
需要学习,老大们太厉害了!!!!!!!!!
freelinuxer
freelinuxer 2010-03-15
我在 ek-lm3s8962 板子上刷了也出现 jtag 被锁.
还有代码目录有关cpu 多平台的 能否仿一下 freertos 的组织模式,移植以及多平台接口都清晰.

刚学习rtos,愚见,望请见谅.
netelf
netelf 2010-03-20
LM3S6432 需要将 board.c 中 SYSCTL_XTAL_6MHZ 改为 SYSCTL_XTAL_8MHZ , board.h 中 LM3S_SRAM_SIZE 改为32 , 不然工作不正常。
bernard
bernard 2010-03-20
LM3S6432 需要将 board.c 中 SYSCTL_XTAL_6MHZ 改为 SYSCTL_XTAL_8MHZ , board.h 中 LM3S_SRAM_SIZE 改为32 , 不然工作不正常。


好像这个频率的更改非常重要,8962中也需要修改,否则就会像freelinuxer说的会把JTAG锁死。SRAM_SIZE肯定需要配合芯片规格进行修改的,因为芯片的参数已经变化了。
oldsheepf
oldsheepf 2010-03-21
下载了,要花时间学习,希望在以后的教学中派用处。 [s:157]
ningmeng7294
ningmeng7294 2010-04-04
在LM3S8962上要如何修改呢?呜呜
chiening
chiening 2010-04-06
刚找到一个这么好的地方,我也想加入。 [s:154]
snowy
snowy 2010-08-27
您好,我在Ubuntu GCC下编译通不过的问题及对策:
我在Ubuntu下编译无法链接成功,后来发现原因是LINUX区分大小写,需要将/libcpu下的SConscript文件作如下修改:
if rtconfig.PLATFORM == 'gcc':

src_local = Glob(path + '/*.c') + Glob(path + '/*_gcc.s') + Glob(path + '/*_gcc.S') + Glob(comm + '/*.c')

因为在LINUX下 *.s 与*.S是不一样的文件,在WINDOWS下不存在这个问题。
不知道其它分支有没有这个问题,希望开发人员对应一下。

编译环境:Ubuntu 9.10 scons 1.2 python 2.6.4.rc2 arm-none-eabi-gcc (Sourcery G++ Lite 2009q3-68) 4.4.1
bernard
bernard 2010-08-27
请使用svn最新的版本,最新的版本应该不会有大小写的问题了。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友