打印

大叔的**俺咋就看不懂呢?

[复制链接]
4661|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2008-6-25 01:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HotBIOS之零耗时任务切换的研究论证及大略实现方法(HotPower@126.com)

菜农心目中的零耗时任务切换就是应该和裸奔一样不准折腾SP.否则违规.
那么切换时高就绪任务的搜索不算违规,因为这是必须做的.否则就不叫OS了.
OS的任务一般可划分为4个阶段或状态:
1.任务终止.
    一般常用于所有任务的初始化任务,它的初始化级别最高,但只运行一次即
自杀或他杀而进入任务终止状态.
    有些OS是有任务钩子函数来完成初始化工作的.方法不同效果是一样的.
而钩子函数效率应该高些.
    而在C++程序中,由于全局类的构造函数是可以抢在main()前运行的,它也可
用于初始化任务.
    虽然这些都可实现,但也是有些区别的,这里不想讨论,只是列举些实现的方法.
2.任务挂起.
    由于任务主动执行sleep(),sempend(),mbxpend()等函数,则该任务主动放弃即挂起对程序的控制权利,形成任务阻塞.主动出让控制权是协作式OS的要点.它和裸奔的性质
基本类同,这种编程思路在强实时的OS也是很重要也是一种良好的习惯.
3.任务就绪.
    由于节拍中断的到来,可能同时有几个任务挂起的时间到,由于任务级别
的不同(即使级别相同也只能有一个任务按时间片算法按顺序执行)
导致低级别任务在本次切换活动中得不到照顾,虽然处于就绪也不能执行.
4.任务运行
    在任务就绪后,本次任务级别最高或下次高级别任务挂起(发送sleep(),sempend(),mbxpend())
则该任务得以完成切换,即在退出节拍中断时OS修改中断返回PC值时原本该返回
被中断任务处的断点改成了该任务上次被中断或阻塞后的地方.
注意这里留了一个疑问,且听下面分解,切记!!!!!!!!!!
概念讲完了,现在讲述如何实现零耗时任务切换,即不需折腾SP.

一.线程池.
由于每个任务需要的RAM的大小不同,SP的大小也就不相同.
由于OS是随机切换的.不能俺顺序编程的思路来顺序的放置即依次调用程序.
函数的调用导致SP大小的伸缩变化,顺序编程是不会出现问题的.
但在OS中就不行了!!!
假使不为每个任务设置SP的指针即大小,俺常规编程手法是不需也很难控制SP的.
那么一个任务执行过程中,由于节拍中断导致该任务被切换到其他任务.此时
由于节拍中断退出时恢复现场的SP是被中断的SP值,故新的任务访问的是旧任务
的变量即RAM区域,所以必须为任务即线程分配独立间隔的区域.
前面留的疑问就是不能此时执行恢复中断现场,因为这是被中断任务的现场,应该把本次被切换任务上次被中断现场的恢复块的SP恢复后再执行中断恢复程序.
当遇到retf后,返回的PC是就是新任务上次被中断或被阻塞后的地方!!!

所以,我们完成最终切换只用了恢复上次的SP值(未一定SP内的任何数据),从而一举实现"零耗时任务切换".

二.任务切换来源及处理方法.
1.硬件节拍中断.
  它的工作其一主要是对所有任务的节拍计数,这里有+/-两种方法,主要为后面
任务就绪及运行提供切换依据.
2.软件节拍中断(菜农非典之法)
  由于任务阻塞即调用sleep(),sempend(),mbxpend()等函数后,若用软件中断
(51无,但可用无int0时拉低int0来实现"软件中断")调用节拍中断函数.
那么只要区分软硬件方式即可.注意只有硬件节拍中断才节拍任务计数!!!
因为他们调用和返回的路径和方法一样(只是节拍计数不同),所以任务切换的
算法和函数可以一样,这样就大大简化了切换算法的处理.
  在有多软件系统中,如DSP/ARM中,软硬件中断分开也可.
  用此法都好处是中断使切换只要还原SP寄存器即可~~~
3.外部或其他硬件中断(非硬件节拍中断)
  由于HWI的级别比任务高,故也可中断任务.HWI的体系和结构和节拍中断一样
的架构是一样的,联想到上面的任务阻塞用户发送软件中断的方法.
  所以它的算法也归类到前2中任务切换,所以这样代码和方法都不用动脑了~~~
4.软件中断.
  看起来有人会发问:这可能吗???软件中断可是由任务"手动"发送的,上面任务阻塞不是谈到过了吗???
  非也~~~因为在硬件中断HWI中,由于"理论"上说也在HWI不要干重活,故一般采用在HWI中发送SWI_Post()把中断级别即特权自己降低.有时可以再降到任务级.
所以它也归为前面的切换算法之中了~~~
5.硬件中断退出时激活切换
  "好的实时OS是硬件中断捣乱的结果"---菜农的歪论~~~
因为正常的OS是搞节拍实现任务切换的,如果运行任务阻塞,高级别任务此时未就绪.
OS切换到空闲任务,高级别由于定时未到也只能等下次节拍中断来获取对CPU的控制权.
所以其OS如果不靠其他中断源在退出前产生的额外任务切换,就只能每节拍中断
及切换一次.


作文就到这里吧~~~说得容易做着难~~~等明天看球时好好做吧~~~

不过俺在这里可以大胆地忽悠---零耗时任务切换实现并不难~~~而且效率真可以和裸奔相比拼~~~

等俺的程序彻底实现后,俺从此将放弃裸奔的陋习~~~

哈哈~~~我的"零耗时"不是梦~~~~~~~~~~~~~  





相关链接:http://www.hotpage.net.cn/hotpower/HotPower三角及冗余校验密码技术.htm

相关帖子

沙发
lrzxc| | 2008-6-25 01:27 | 只看该作者

又拜读大作,谢谢

使用特权

评论回复
板凳
xwj| | 2008-6-25 01:39 | 只看该作者

呵呵,不错,慢慢看...

使用特权

评论回复
地板
hotpower|  楼主 | 2008-6-25 01:39 | 只看该作者

哈哈~~~HotBIOS将CRC密码,汇编数组和天下无贼论为一身~~~

哈哈~~~实际俺现在就可以宣布菜农挑战TI的DSP/BIOS成功~~~


哈哈~~~ucosii的思想俺不加评述...总之俺从来没用它~~~

为什么???哈哈~~~
相关链接:http://blog.**/hotpower/127735/message.aspx

使用特权

评论回复
5
hotpower|  楼主 | 2008-6-25 07:33 | 只看该作者

哈哈~~~testcode一条短信把俺1小时的早论冲没了~~~

忘了复制一下~~~

可惜俺的探讨"中断现场任务切换的保护深度和智能伸缩的实现"...

可惜可叹呀~~~

不过非常感谢testcode同志!!!

今天是个好日子...HotBIOS应该跑起来了~~~

使用特权

评论回复
6
testcode| | 2008-6-25 07:43 | 只看该作者

哈哈~~~

使用特权

评论回复
7
gyt| | 2008-6-25 10:17 | 只看该作者

辛苦辛苦

使用特权

评论回复
8
原野之狼| | 2008-6-25 10:27 | 只看该作者

大叔的**俺咋就看不懂呢?

唉。。。咋办?

使用特权

评论回复
9
zealane| | 2008-6-25 16:26 | 只看该作者

跟不上大叔的步伐。。。。。

使用特权

评论回复
10
zealane| | 2008-6-25 16:27 | 只看该作者

大叔,应该开个幼稚园小教班教教俺们啊。。。。

否则你的光辉思想怎能红遍中国?????????

使用特权

评论回复
11
fsaok| | 2008-6-25 16:49 | 只看该作者

理解有些难

读别人的作品总比起自己摸索强

使用特权

评论回复
12
gouki_s| | 2008-6-25 23:44 | 只看该作者

大哥解惑

仅靠中断能否保护所有寄存器?
能否提供源码帮助一下后进菜鸟

使用特权

评论回复
13
bird777| | 2008-6-26 00:21 | 只看该作者

?

每个任务的线程池保存技术,可能要依赖编译器的支持(硬数据栈指针?).和裸奔有的一拼,对照LZ的以前裸奔的框架风格,开销好象不会增加多少,但切换上肯定会花些时间,任务控制块TCB总少不了吧?否则SP放那里?!

使用特权

评论回复
14
wxj1952| | 2008-6-26 13:58 | 只看该作者

hotpower 朋友:能不能容我故意找茬?

我相信还有一个人看出了“零耗时任务切换”的思路弊端。——ayb_ice。
我想诚恳地邀请他来出面会讲的更清楚,为什么hotpower下面这几句话是概念理解错了:
(要不就是我理解错了,我会先向朋友说声“对不起,是我理解错了”。)

1、"好的实时OS是硬件中断捣乱的结果"---菜农的歪论~~~

2、所以其OS如果不靠其他中断源在退出前产生的额外任务切换,就只能每节拍中断及切换一次.

3、     2.软件节拍中断(菜农非典之法)
  由于任务阻塞即调用sleep(),sempend(),mbxpend()等函数后,若用软件中断
(51无,但可用无int0时拉低int0来实现"软件中断")调用节拍中断函数.
那么只要区分软硬件方式即可.注意只有硬件节拍中断才节拍任务计数!!!
因为他们调用和返回的路径和方法一样(只是节拍计数不同),所以任务切换的
算法和函数可以一样,这样就大大简化了切换算法的处理.

朋友的理论是建立在这样一个基础观点之上:传统OS的调度切换,只能由每次节拍中断/或HWI触发,或者说只能发生在每次系统心跳的边界点。而“零耗时任务切换”就是设法让“切换”(到下一就绪任务next)可以在当前任务current执行完毕时立即触发提前运行,而不必等待时隙节拍中断的到来。是吗?

还有SP的问题,(必须是协作式调度器)那是次要概念,现代OS都有快速切换和常规切换条件,某种设计确实可以不用场景交换,达到快速目的。另外再说。




使用特权

评论回复
15
dld2| | 2008-6-26 14:10 | 只看该作者

调度本质上是由中断触发的

但不一定是时钟节拍中断。
例如,串口中断处理中,释放一个信号量,就会导致调度程序执行。

在两种情况下执行调度程序:
     应用程序访问OS的系统调用。
     时钟节拍中断。(在该中断中,会检查系统中是否有超时的定时器,是否需要进行任务切换。)

使用特权

评论回复
16
wxj1952| | 2008-6-26 14:30 | 只看该作者

支持15L。

在两种情况下执行调度程序:
     应用程序访问OS的系统调用。
     时钟节拍中断。(在该中断中,会检查系统中是否有超时的定时器,是否需要进行任务切换。)

1、应用程序可以通过sleep(),sempend(),mbxpend()等系统函数直接(立即提前)触发内核调度——切换程序,但绝不是一定需要通过任何中断或者软中断。这就是OS层次设计之间的概念关系,不是说谁可以自由想象出来的。它已经理论化了。

即:应用任务——>系统函数——>内核。
如果:应用任务——>内核,恐怕后果不一样。

2、如果由用户任务(提前)触发的调度程序运行期间发生了节拍中断,那么即使中断刷新出多个超时就绪任务,它们也得不到运行(调度器上锁)。抢占不一定好。

3、调度切换程序与节拍中断的关系,可以通过信号量关联或者独立,不一定由(任何)中断触发,goto  switching即可。也就是说,切换函数可以是独立的系统任务函数,与中断不关联的。这样使系统的实时效率大为改善。
他们嵌入式OS设计者已经考虑过这些问题,并把过去的缺陷改进了。看51_OS源代码,10年前的版本和最新版本在这一点已经大不相同。如果不是抢占式内核,新版本已经包含了零耗时切换模式。已经尽最大可能“零耗时”切换了。

    看一下现代汇编语言,用什么语句触发切换任务?call or jmp?也许都可以,但肯定结果不同。

使用特权

评论回复
17
kanprin| | 2008-6-26 15:32 | 只看该作者

顶一下

既然有中断,就需要有现场的保护。
看不出hot的理论有何零耗时的概念。
似乎看到大叔对UCOS的思想颇为满,
但从你提到的理论跟UCOS的也相差不大。
只不过你说不去折腾SP,而UCOS是有折腾SP而已。
但你所谓的不去折腾SP,其实只是偷懒
把折腾SP的事情交给了编译器而已。
而UCOS的SP是忽略编译器的折腾,一个naked 让你一切尽在掌握中。
至于强实时还是弱实时方面,想来应该在任务切换算法上下功夫了。

使用特权

评论回复
18
gouki_s| | 2008-6-26 16:11 | 只看该作者

小弟迷惑。。。

有没有一种编译选项能让中断保护所有寄存器?
倒是有选项能让他不保护,
不过这样和其他os切换也没啥区别,本质上还是要保护的,时间也省不掉

等着hotpower出幺蛾子。。。。。。

使用特权

评论回复
19
hotpower|  楼主 | 2008-6-26 20:51 | 只看该作者

感谢楼上各位参与技术讨论

我下午对研究生小朋友有陈述了一遍我的思路。
就一张联络图,里面根本没有任何思想。
因为我这次出手OS时接**抛开所有理论和它的束缚。

可以说思路是强实时的。因为它不经过任何切换的过程,只需
对PC和SP的管理。

当不切换时,原路返回。
切换时,保护该任务本次断点的SP,PC,取出需要切换到任务上次断点的SP,PC.
切换需要的就是这么简单的事。

那么如何判断切换呢?

用二叉树组成任务就绪表。(每次切换都自动刷新)
因为每次进入节拍中断时,都要对sleep进行节拍+1来判别是否定时就绪。
由于有sleep二叉树,可以加快和不搜索不需要节拍+1的节点。

当被中断的任务不是任务就绪表表头时,状态自动降级。
此时任务就绪表表头节点内的任务号就是需要切换的任务。

退出判断并散转自动切换到新任务上次的断点。

那么初始化时那个“上次的断点”该是什么呢???

由于菜农任务函数里规定格式隐藏了任务测试。
故提前已经计算好首次需要切换回的“断点”---实际是虚拟的。!!!

这样在任务开始启动工作时,就假定全部任务同时都在任务环的某一固定点!!!!!!!!

这2个假定使所有任务切换的方式都归结为一种(硬件退出也被归化了)

这样首次节拍中断时,全部的任务都在任务循环里了~~~

就先讲到这里,太多大家迷糊。

总之,我讲任务的走向或未来都事先归化好了,这样节拍中断时就不在需要

处理过多的事情。

所以,我准备有时间请教我写vxworks书的教授朋友,hotbios属于什么性质的

OS....

使用特权

评论回复
20
wxj1952| | 2008-6-26 21:48 | 只看该作者

朋友,你做的是对的。

我想告诉朋友的只是,你的思路,书上都写过了。而且有源代码。你只要拿来修改一下就事倍功半。本来就不是什么定式,只是一种模式。


也许我们又落后于他人了。

需要源代码和书名的话,告知。

使用特权

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

本版积分规则

1538

主题

21697

帖子

506

粉丝