打印

小菜之单片机多任务系统"RTOS"与"裸奔"之论

[复制链接]
楼主: singleywy
手机看帖
扫描二维码
随时随地手机跟帖
21
singleywy|  楼主 | 2010-10-13 22:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
16# c+++
我个人觉得任务切换的堆栈空间最好放在内部的RAM中,以及一些实时性要求高的任务变量,而一些不重要的任务,全局变量等可以放在外存中,这样既保证了实时性,又保证空间的整体利用效率

使用特权

评论回复
22
c+++| | 2010-10-13 22:38 | 只看该作者
如果把任务堆栈放入内部ram中, 那么任务转换很简单,切换sp, push pop任务寄存器, 我也能把耗时降下来。但是8051内部ram实在太小了, 做不了几个任务。如果任务不多, 还不如直接用裸奔。任务多了, 就得用外部ram, 这样一来, 很大一部分cpu时间空耗在任务转换上。

使用特权

评论回复
23
singleywy|  楼主 | 2010-10-13 22:50 | 只看该作者
22# c+++
恩,可能是我保存的寄存器少吧,我在128字节的空间就可以做6个任务,完成了键盘扫描,数据计算,时钟控制部分,以及显示,四部分,另两个任务空闲,还有一定空间剩余,如果256字节的话,还可以做的更多,其实只要根据需要不一定要保存所有的寄存器的,有的可以作为共享资源,当然,这是根据个人项目需要,裸奔肯定有它的优越性哈

使用特权

评论回复
24
singleywy|  楼主 | 2010-10-13 22:54 | 只看该作者
18# huangqi412
我个人感觉写操作系统必须用到汇编,因为要用到结构体与数组,在C语言中索引的效率比较低,不如自己在汇编中设计的效率高,有些代码,C语言中没法体现

使用特权

评论回复
25
singleywy|  楼主 | 2010-10-13 22:55 | 只看该作者
17# fzu_csc
KEILL内部的RTXTINY,可以学习,很不错的说

使用特权

评论回复
26
singleywy|  楼主 | 2010-10-14 09:21 | 只看该作者
本帖最后由 singleywy 于 2010-10-14 09:40 编辑

今天我验证了一下,发现,采用动态任务堆栈管理方式,任务切换平均耗时在200-300US,并不是我前面说的1MS多,所以依然满足,实时性要求,前提条件5个任务,保存5个寄存器,涉及到任务堆栈搬迁,我的测试条件是,(比较苛刻)RAM:128B,ROM:2KB,frequence:12MHZ,如图所示:

使用特权

评论回复
27
singleywy|  楼主 | 2010-10-14 09:24 | 只看该作者
开始运行到最低级任务TASK4,前面初始化花了468US

使用特权

评论回复
28
singleywy|  楼主 | 2010-10-14 09:28 | 只看该作者
本帖最后由 singleywy 于 2010-10-14 09:30 编辑

TASK4任务切换结束,下一任务为优先级最高的TASK0,运行时间状态为727US,花费时间727-468=259US

使用特权

评论回复
29
singleywy|  楼主 | 2010-10-14 09:29 | 只看该作者
TASK0,因等待而挂起,切换下一个任务的开始状态:

使用特权

评论回复
30
singleywy|  楼主 | 2010-10-14 09:31 | 只看该作者
上面时间状态为,740

使用特权

评论回复
31
singleywy|  楼主 | 2010-10-14 09:32 | 只看该作者
TASK0放弃CPU后,切换到下一个优先级高的任务,如TASK1,(在就绪队列中):

使用特权

评论回复
32
singleywy|  楼主 | 2010-10-14 09:37 | 只看该作者
TASK0,切换完后,时间状态为877US,切换时间为,877-740=137US,时间是如此短,可以保证实时性,
接下来的任务切换,我没有一一上传,我算了一下,平均时间也就在200US,左右,与只占预计切换时间1MS的1/5,所以说在51上切换任务还是可取的

使用特权

评论回复
33
singleywy|  楼主 | 2010-10-14 09:41 | 只看该作者
我设计的总汇编代码代码已及内存所占空间如图:

使用特权

评论回复
34
singleywy|  楼主 | 2010-10-14 09:41 | 只看该作者
内存占一半,代码占1/4

使用特权

评论回复
35
singleywy|  楼主 | 2010-10-14 09:46 | 只看该作者
继续,。。。。。。。。。

使用特权

评论回复
36
sunzone| | 2010-10-14 09:57 | 只看该作者
路过,拿分下载!

使用特权

评论回复
37
sunzone| | 2010-10-14 09:58 | 只看该作者
路过,拿分下载!

使用特权

评论回复
38
c+++| | 2010-10-14 10:00 | 只看该作者
顶singleywy, 做得不错。
你的os好像是一个非抢占协作式的os, 而且得用汇编。我认为应用了os后还要使用汇编,os作用大减, 还不如裸奔的c方便。如果用c来做任务, 就得把a, psw, r0-r7, dptr, b 这些寄存器都要保存起来, 比不上汇编可以自主决定使用和保存哪些寄存器。如果你的os能改成支持c, 我想用途更大。

使用特权

评论回复
39
singleywy|  楼主 | 2010-10-14 11:53 | 只看该作者
38# c+++
我设计的是抢占式的,图片中是为了检测故意让每个任务自动等待延时的,任务挂起之后,任务进入了挂起状态,不在就绪队列中,只能查找就绪队列中最高优先级的来运行,造成了由优先级高TASK0到优先级低TASK4运行的现象,
其次我也在编写C语言版本,或者将汇编C化,呵呵

使用特权

评论回复
40
反质子| | 2010-10-14 15:45 | 只看该作者
不转成C版本的  怎么普及啊

LZ的操作系统和UCOSii相比有哪些优势?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则