|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
Show一下我写的RockOS,相同之外,还有一些不同 |
作者:rockos 栏目:嵌入式系统 |
RockOS是在ARM上开发的,最初使用的是上海勤旺的ARM学习板,后来得到ITSN社区的资助,获得了一块功能比较完备的44b0学习板。 下面是启动界面: ![]() 启动输出很简单: 显示一组版权信息,系统的Tick频率,当前RTC时间,然后就开始测试CPU的基准性能,这个过程需要4秒种的时间。 |
2楼: | >>参与讨论 |
作者: rockos 于 2006/7/23 23:47:00 发布:
Show一下我写的RockOS (二) RockOS包含一个简单的Shell,在shell上输入help命令可以显示所有可用的命令。命令是由应用代码注册的,为了简化实现,命令没有进行分组,只是根据命令名进行排序: ![]() 这个是显示当前任务的命令输出: ![]() RockOS带有经典IPC算法的理发师问题和哲学家问题,在这个例子中,共有5个理发师任务(待理发的客户任务由Shell命令创建),5个哲学家任务。还有就是播放wave格式声音的tWavSound,和用于按键测试的tKeyTest任务。tTick, tShell, tSecPeriod和tIdle是系统任务,除tTick是必须的之外,其它三个系统任务都是可选的(是否可剔除tIdle任务还依赖于系统是否可以实现Halt功能)。 spy命令显示的当前的CPU占用率,这个版本中增加了每秒对所有“消息”的状态防挂死检查,CPU占用率在空转时上升为5%,如果去掉这部分检查,则CPU占用率为2%(实际上是1.7%,非常准确)。 |
3楼: | >>参与讨论 |
作者: rockos 于 2006/7/24 0:08:00 发布:
Show一下我写的RockOS (三) 按照help的命令例表,命令c可以创建一个等待理发的customer任务: ![]() 把这个图和上面的图对比一下,可以看出增加了第16号任务customer,同时6号任务barbor0也被激活,由pending态转为delay(转为delay只是为了模拟理发过程)。 理发结束后第16号任务退出,6号任务也回到pend态。这个图是接着上面那个图抓取的: ![]() 罗嗦这个例子只是为了表明RockOS完全支持返回式任务和动态的任务创建与删除,这两个功能有不少嵌入式OS不支持(包括知名的uC-OS II)。 |
4楼: | >>参与讨论 |
作者: rockos 于 2006/7/24 0:22:00 发布:
Show一下我写的RockOS (四) 贴一小段代码,这段代码对应RockOS的Shell命令fsm,用来显示系统中状态机的数量或详细信息,后面是这条命令的运行截图: /****************************************************************************** Function : int fsmShow(int argc, CHAR * argv[]) Params : argc - the argument count (including command NAME). : argv - the arguments (argv[0] is the command NAME) : : Return : always 0 DESCRIPTION : DISPLAY a special fsm's detail or all fsms' ADAPT information. : ******************************************************************************/ int fsmShow(int argc, CHAR * argv[]) { int i; HFSM hfsm; if (argc == 1) { fsmShowAll(); } else { for (i = 1; i < argc; i++) { hfsm = str2int(argv[i]); fsmShowSingle(hfsm); } } return 0; } 执行结果,三次分别是不带参数执行,带错误参数执行和带正确参数执行的结果: ![]() 这个状态机是RockOS系统的任务状态迁移图,在这个例子中我没有将各种值转换为可读的文本串。实际上,这个功能在RockOS中是提供的,只需要简单地向NAMETbl模块注册一下value-NAME对即可。 |
5楼: | >>参与讨论 |
作者: rockos 于 2006/7/24 0:45:00 发布:
Show一下我写的RockOS (四) 下面这幅图显示了RockOS中对消息状态的扫描功能,它允许系统强制性回收长时间处于ALLOCATED, Received两个状态的消息,并将其内容转储出来。如果消息长时间处于Sent状态,OS并不回收,因为有可能接收任务优先级较低,而在系统负荷过重时还来不及处理。 ![]() (1) 这个功能只适用于系统消息对象, 使用其它内容作为消息发送不受这个功能保护。使用系统消息可以避免在发送消息时进行内存复制,从而有效地提高系统的负荷能力(vxworks的消息就需要内存复制,所以如果消息的内容比较长时,系统效率会明显下降,解决的办法就是在消息中传递指针——这种做法在嵌入式系统中被认为是不太安全的)。 (2) 千万别小看这个功能,对于有HA要求的嵌入式系统来讲,“自愈”是一个十分优秀的能力,它可以使系统真正在无人值守的情况下运行,自动修复不太经常发生的错误。 顺便提一下,上面的截图是RockOS提供的哲学家就餐问题的DEMO过程,命令p使某个哲学家变得饥饿,但一个哲学家不能连续吃三次(哲学家任务使用只能容纳一条消息的消息队列,第一次收到消息开始饥饿,还在吃时,再发第二条消息,此时消息队列满,如果再发第三条消息,会因为消息队列溢出而失败。因为要演示消息包自动回收功能,所以我特意在这里留了一个错误。 * - 本贴最后修改时间:2006-7-24 1:18:16 修改者:rockos |
6楼: | >>参与讨论 |
作者: rockos 于 2006/7/24 0:59:00 发布:
Show一下我写的RockOS (五) 信号量是所有OS中最具有共同点的内容了,RockOS支持互斥信号量和同步信号量。互斥信号量又称为二进制信息量, 同步信号量就是传统的信号量, 这些OS的基础理论在这里就不罗嗦了,有兴趣的自己翻书回忆一下。 下面是RockOS的Shell中有关信号量的截图: ![]() * - 本贴最后修改时间:2006-7-24 1:02:41 修改者:rockos |
7楼: | >>参与讨论 |
作者: rockos 于 2006/7/24 1:12:00 发布:
最后列一下RockOS的Feature List RockOS的Feature List: * 真正的多任务环境 * 基于优先级的抢占式调度 * 任务可以在系统初始化后的任何时刻由任何任务创建(但不能由ISR创建) * 任务可以在创建时指定可抢占,不可抢占属性 * 可抢占任务在执行敏感代码时,可以使用任务锁,使任务暂时不可抢占,任务锁可以嵌套调用,只对单一的任务有效,不会对其它任务造成任何影响 * 任务优先级可以显式调整(留有自动优先级翻转的接口,但没有实现) * 任务入口函数可以返回(隐式删除,也就是自己删除自己) * 任务运行轨迹的转储接口,并提供简单转储DEMO * 自动侦测死锁环(deadlock loop) * 三种大小、数量均可配置的消息包 * 消息队列通信,消息可以从ISR向任务发送,也可以在任务间相互发送 * 互斥信号量(二进制信号量) * 同步信号量(计数型信号量) * 人机接口,提供简易的命令行Shell,提供命令注册和取消注册功能 * 通用状态机算法实现 * 软件运行安全指示(绝非类PWM驱动,纯软件实现,可指定为闪LED灯,清Watchdog等) * 设备轮循(tick周期和秒周期轮循) * 设备FIFO |
8楼: | >>参与讨论 |
作者: hqgboy 于 2006/7/24 7:54:00 发布:
和UCOUS-II有那些不同? |
9楼: | >>参与讨论 |
作者: rockos 于 2006/7/24 8:59:00 发布:
最起码有如下几点不同 (1) 动态创建/删除任务, 伴随地申请和释放内存 (2) 任务的优先级可以相同 (3) 任务数量从2~65535可以自己定义, 只要有足够的内存资源(RockOS的调度机是一个基于优先级的队列) (4) 任务入口函数可以返回 (5) 任务运行轨迹可以转储出来, 使用这个feature可以非常容易地实现系统的"临终遗言"功能 ^_^ (6) 自动侦测deadlock (7) 可以从中断服务例程中发送消息出来 (8) Shell功能 (9) 设备管理功能, 尽管RockOS的设备管理功能非常简单, 对于嵌入式应用而言还是够用的 ...... 楼上的, 试试在ucos-ii上实现哲学家就餐问题或理发师问题就会明白,由于ucos无法支持同一优先级的多个任务, 你被迫对问题的描述进行修改,从而失去了原问题的本来面目. |
10楼: | >>参与讨论 |
作者: hqgboy 于 2006/7/24 12:40:00 发布:
谢谢.在用UCOS-II. 您应该在有影响的杂志上发表啊... 学习UCOS-II的发迹史.呵呵. 人家UCOS-II全套好多大洋呢. 自己学习,可否提高源码看看. hqgboy@126.com |
11楼: | >>参与讨论 |
作者: Likeos 于 2006/7/27 16:13:00 发布:
恭喜恭喜啊,Rockos的功能越来越完善了啊 支持 |
12楼: | >>参与讨论 |
作者: yos 于 2006/7/31 11:53:00 发布:
内存管理 请教一下rockos是如何实现内存管理的,动态地删除和创建任务时间是否确定。在支持mmu和不支持mmu的机器上实现时有什么不同?请不吝赐教,我现在对这个问题比较头大,希望得到先知指点。 |
13楼: | >>参与讨论 |
作者: rockos 于 2006/7/31 13:19:00 发布:
to yos朋友 RockOS使用块状内存管理, 比较简单, 省去了使用内存链带来的内存碎片和潜在的内存链断裂危险. 动态删除和创建任务的执行时间是可确定的, 但是, 何时创建任务, 何时删除任务或任务退出, 则完全是应用本身的事情. RockOS在运行后对新建任务只做一个限制, 就是不能在中断服务程序中创建新的任务. RockOS是一种单地址空间OS, 任务不具有自己的内存空间, 所以在OS级不支持mmu. 如果在带有MMU支持的系统中运行, 则需要采用BootLoader + RockOS的方式运行. 在BootLoader准备向RockOS交权前, 配置并激活MMU, 然后一条跳转指令跳向RockOS的初始化地址就可以了. |
14楼: | >>参与讨论 |
作者: 平常芯 于 2006/8/23 0:09:00 发布:
嘿嘿 挺帅的 |
|
|
Copyright © 1998-2006 tgdrjb.cn 浙ICP证030469号 |