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

[复制链接]
11567|47
 楼主| singleywy 发表于 2010-10-13 22:25 | 显示全部楼层
16# c+++
我个人觉得任务切换的堆栈空间最好放在内部的RAM中,以及一些实时性要求高的任务变量,而一些不重要的任务,全局变量等可以放在外存中,这样既保证了实时性,又保证空间的整体利用效率
c+++ 发表于 2010-10-13 22:38 | 显示全部楼层
如果把任务堆栈放入内部ram中, 那么任务转换很简单,切换sp, push pop任务寄存器, 我也能把耗时降下来。但是8051内部ram实在太小了, 做不了几个任务。如果任务不多, 还不如直接用裸奔。任务多了, 就得用外部ram, 这样一来, 很大一部分cpu时间空耗在任务转换上。
 楼主| singleywy 发表于 2010-10-13 22:50 | 显示全部楼层
22# c+++
恩,可能是我保存的寄存器少吧,我在128字节的空间就可以做6个任务,完成了键盘扫描,数据计算,时钟控制部分,以及显示,四部分,另两个任务空闲,还有一定空间剩余,如果256字节的话,还可以做的更多,其实只要根据需要不一定要保存所有的寄存器的,有的可以作为共享资源,当然,这是根据个人项目需要,裸奔肯定有它的优越性哈
 楼主| singleywy 发表于 2010-10-13 22:54 | 显示全部楼层
18# huangqi412
我个人感觉写操作系统必须用到汇编,因为要用到结构体与数组,在C语言中索引的效率比较低,不如自己在汇编中设计的效率高,有些代码,C语言中没法体现
 楼主| singleywy 发表于 2010-10-13 22:55 | 显示全部楼层
17# fzu_csc
KEILL内部的RTXTINY,可以学习,很不错的说
 楼主| singleywy 发表于 2010-10-14 09:21 | 显示全部楼层
本帖最后由 singleywy 于 2010-10-14 09:40 编辑

今天我验证了一下,发现,采用动态任务堆栈管理方式,任务切换平均耗时在200-300US,并不是我前面说的1MS多,所以依然满足,实时性要求,前提条件5个任务,保存5个寄存器,涉及到任务堆栈搬迁,我的测试条件是,(比较苛刻)RAM:128B,ROM:2KB,frequence:12MHZ,如图所示:
 楼主| singleywy 发表于 2010-10-14 09:24 | 显示全部楼层
开始运行到最低级任务TASK4,前面初始化花了468US

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| singleywy 发表于 2010-10-14 09:28 | 显示全部楼层
本帖最后由 singleywy 于 2010-10-14 09:30 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| singleywy 发表于 2010-10-14 09:29 | 显示全部楼层
TASK0,因等待而挂起,切换下一个任务的开始状态:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| singleywy 发表于 2010-10-14 09:31 | 显示全部楼层
上面时间状态为,740
 楼主| singleywy 发表于 2010-10-14 09:32 | 显示全部楼层
TASK0放弃CPU后,切换到下一个优先级高的任务,如TASK1,(在就绪队列中):

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| singleywy 发表于 2010-10-14 09:37 | 显示全部楼层
TASK0,切换完后,时间状态为877US,切换时间为,877-740=137US,时间是如此短,可以保证实时性,
接下来的任务切换,我没有一一上传,我算了一下,平均时间也就在200US,左右,与只占预计切换时间1MS的1/5,所以说在51上切换任务还是可取的
 楼主| singleywy 发表于 2010-10-14 09:41 | 显示全部楼层
我设计的总汇编代码代码已及内存所占空间如图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| singleywy 发表于 2010-10-14 09:41 | 显示全部楼层
内存占一半,代码占1/4
 楼主| singleywy 发表于 2010-10-14 09:46 | 显示全部楼层
继续,。。。。。。。。。
sunzone 发表于 2010-10-14 09:57 | 显示全部楼层
路过,拿分下载!
sunzone 发表于 2010-10-14 09:58 | 显示全部楼层
路过,拿分下载!
c+++ 发表于 2010-10-14 10:00 | 显示全部楼层
顶singleywy, 做得不错。
你的os好像是一个非抢占协作式的os, 而且得用汇编。我认为应用了os后还要使用汇编,os作用大减, 还不如裸奔的c方便。如果用c来做任务, 就得把a, psw, r0-r7, dptr, b 这些寄存器都要保存起来, 比不上汇编可以自主决定使用和保存哪些寄存器。如果你的os能改成支持c, 我想用途更大。
 楼主| singleywy 发表于 2010-10-14 11:53 | 显示全部楼层
38# c+++
我设计的是抢占式的,图片中是为了检测故意让每个任务自动等待延时的,任务挂起之后,任务进入了挂起状态,不在就绪队列中,只能查找就绪队列中最高优先级的来运行,造成了由优先级高TASK0到优先级低TASK4运行的现象,
其次我也在编写C语言版本,或者将汇编C化,呵呵
反质子 发表于 2010-10-14 15:45 | 显示全部楼层
不转成C版本的  怎么普及啊

LZ的操作系统和UCOSii相比有哪些优势?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部