EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2008/6/26 22:41:11

2

关于投票

4种实时操作系统实时性的分析对比(转贴)

4种实时操作系统实时性的分析对比
来源:转载  作者:合肥工业大学机汽学院 合肥荣事达电冰箱有 时间:2007-03-02 发布人:

  本文分析了适用于测控领域的4种实时操作系统,并对比了它们实时性能的重要指标,归纳了实时性设计和实现中的若干问题。
 
  20世纪70年代以来嵌入式系统的硬件和软件技术的飞速进步,使得嵌入式应用得到了蓬勃发展,在这些应用中实时操作系统起着决定性的作用。

  在复杂测控应用中,必须使用对实时性要求非常高的实时操作系统。例如在工业控制、交通管理、机器人、航空航天、武器装备等领域,系统事件的响应如果不能准时或超时,就可能导致巨大的损失和灾难。因而,选择操作系统时,对实时性的仔细考虑至关重要。本文从实时性的角度细致的分析对比了适用于此类有苛刻实时性要求的4种操作系统——VxWorks、mC/OS-II、RT-Linux、QNX,为系统选型提供一定参考。

实时性能主要实现技术

  实时操作系统的实时性是第一要求,需要调度一切可利用的资源完成实时任务。根据响应时间在微秒、毫秒和秒级的不同,可分为强实时、准实时和弱实时三种。强实时系统必须是对即时的事件作出反应,绝对不能错过事件处理时限。例如测控领域就是要求强或接近强实时系统。在机顶盒、PDA、信息家电等应用领域,系统负荷较重的时候,允许发生错过时限的情况而且不会造成太大的危害,准和弱实时系统就可满足应用。一个强实时的操作系统通常使用以下技术:

● 占先式内核

  当系统时间响应很重要时,要使用占先式内核。当前最高优先级的任务一旦就绪,总能立即得到CPU的控制权,而CPU的控制权是可知的。使用占先式内核使得任务级响应时间得以最优化。

● 调度策略分析

  任务调度策略是直接影响实时性能的因素。强实时系统和准实时系统的实现区别主要在选择调度算法上。选择基于优先级调度的算法足以满足准实时系统的要求,而且可以提供高速的响应和大的系统吞吐率。当两个或两个以上任务有同样优先级,通常用时间片轮转法进行调度。对硬实时系统而言,需要使用的算法就应该是调度方式简单,反应速度快的实时调度算法了。尽管调度算法多种多样,但大多由单一比率调度算法(RMS)和最早期限优先算法(EDF)变化而来。前者主要用于静态周期任务的调度,后者主要用于动态调度,在不同的系统状态下两种算法各有优劣。在商业产品中采用的实际策略常常是各种因素的折中。

● 任务优先级分配

  每个任务都有其优先级。任务越重要,赋予的优先级应越高。应用程序执行过程中诸任务优先级不变,则称之为静态优先级。在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。反之,应用程序执行过程中,任务的优先级是可变的,则称之为动态优先级。

● 时间的可确定性

  强实时操作系统的函数调用与服务的执行时间应具有可确定性。系统服务的执行时间不依赖于应用程序任务的多少。系统完成某个确定任务的时间是可预测的。

实时性能重要指标

  衡量实时操作系统实时性能的重要指标有:
● 任务切换时间

  当多任务内核决定运行另外的任务时,它把正在运行任务的当前状态(即CPU寄存器中的全部内容)保存到任务自己的栈区之中。然后把下一个将要运行的任务的当前状态从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。CPU的寄存器越多,额外负荷就越重。

● 中断响应时间(可屏蔽中断)

  计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。对于占先式内核,要先调用一个特定的函数,该函数通知内核即将进行中断服务,使得内核可以跟踪中断的嵌套。占先式内核的中断响应时间由下式给出:

中断响应时间=关中断的最长时间
+保护CPU内部寄存器的时间
+进入中断服务函数的执行时间
+开始执行中断服务例程(ISR)的第一条指令时间

  中断响应时间是系统在最坏情况下响应中断的时间,某系统100次中有99次在50ms之内响应中断,只有一次响应中断的时间是250ms,只能认为中断响应时间是250ms。

  表2列出了部分体现实时性能重要指标的典型值,它们的测试平台和测试方法不完全相同,影响了数据的可比性,但我们仍可作为参考。

  另外,还有系统响应时间(系统发出处理要求到系统给出应答信号的时间)、最长关中断时间、非屏蔽中断响应时间等辅助的衡量指标。

若干问题

  虽然当今的实时操作系统已日臻完善,但仍有一些问题存在并干扰着强实时的实现。我们应充分的重视,并通过合理的安排程序减少它们的危害。

● 优先级反转

  这是实时系统中出现得最多的问题。优先级反转是指一个任务等待比它优先级低的任务释放资源而被阻塞,如果这时有中等优先级的就绪任务,阻塞会进一步恶化。它严重影响了实时任务的完成。

  为防止发生优先级反转,一些商业内核(如VxWorks)使用了优先级继承技术,当优先级反转发生时,优先级较低的任务被暂时地提高它的优先级,使得该任务能尽快执行,释放出优先级较高的任务所需要的资源。但它也不能完全避免优先级反转,只能称其减轻了优先级反转的程度,减轻了优先级反转对实时任务完成的影响。

  优先权极限是另一种解决方案,系统把每一个临界资源与1个极限优先权相联系,这个极限优先权等于系统此时最高优先权加1。当这个任务退出临界区后,系统立即把它的优先权恢复正常,从而保证系统不会出现优先权反转的情况。采用这种方案的另一个有利之处,是仅仅通过改变某个临界资源的优先级就可以使多个任务共享这个临界资源。

● 任务执行时间的抖动

  各种实时内核都有将任务延时若干个时钟节拍的功能。优先级的不同、延时请求发生的时间、发出延时请求的任务自身的运行延迟,都会造成被延时任务执行时间不同程度的提前或滞后,称之为任务执行时间的抖动。可能的解决方案有:

a. 增加微处理器的时钟频和时钟节拍的频率;b. 重新安排任务的优先级;c. 避免使用浮点运算等。

  强实时系统中,我们必须综合考虑,充分利用各种手段,尽量减少任务执行时间的抖动。

● 任务划分

  程序在CPU中是以任务的方式在运行,所以我们要将系统的处理框图转化为多任务流程图,对处理进行任务划分。任务划分存在这样一对矛盾:如果任务太多,必然增加系统任务切换的开销;如果任务太少,系统的并行度就降低了,实时性就比较差。在任务划分时要遵循H.Gomma原则:

a. I/O原则:不同的外设执行不同任务;
b. 优先级原则:不同优先级处理不同的任务;
c. 大量运算:归为一个任务;
d. 功能耦合:归为一个任务;
e. 偶然耦合:归为一个任务;
f. 频率组合:对于周期时间,不同任务处理不同的频率。

  如果我们在具体分析一个系统的时候发生原则冲突的话,则要为每一个原则针对具体的系统设定“权重”,必要的时候可以通过计算“权重”来最终确定如何去划分任务。

总结

  VxWorks、mC/OS-II、RT-Linux、QNX都是优秀的强实时操作系统,各有特色:VxWorks的衡量指标值最好;mC/OS-II最短小精悍;RT-Linux支持调度策略的改写;QNX支持分布式应用。当我们充分理解和掌握它们实现技术、衡量指标的不同,注意所存在的问题,就能在实时性应用中游刃有余。

系统分类: 嵌入式  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(723) | 回复(2)

发表于 2008/6/26 22:35:33

0

关于投票

什么是强实时操作系统?(转贴)

5 楼zgz(时光飞逝)回复于 2002-10-21 10:19:51 得分 15

实时有两个含义:  
  一是响应时间短,实时系统的响应时间通常在微妙级。  
  二是响应时间确定,这一点特别重要。响应时间确定意味着每次响应的时间误差非常小,有的实时系统甚至能做到相差不过一两条指令,如ucos,在关掉cache的情况下理论上没有误差!  
   
  强实时系统的实时性是可以证明的,而且有一个明确的指标,在确定性方面有很严格的要求。  
  软实时系统只是表明实时性比较高,响应时间快,但是在确定性方面相对教差。  
 

系统分类: 嵌入式  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(760) | 回复(0)

发表于 2008/6/26 20:54:19

0

关于投票

关于HotBIOS强实时的讨论和菜农的解释

http://bbs.21ic.com/club/bbs/list.asp?boardid=11&t=3011849

hotpower 发表于 2008-6-26 20:51 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖


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

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

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

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

那么如何判断切换呢?

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

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

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

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

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

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

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

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

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

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

处理过多的事情。

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

OS....

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1291) | 回复(0)

发表于 2008/6/26 0:55:26

1

关于投票

万事俱备,不知为何一直不忍心对HotBIOS痛下杀手

我的第六感一直很强,有些奇特,有时连自己都不知道为何...

有时真怀疑自己的脑浆有问题~~~曾多次怀疑是否有病???

长期以来俺一直以裸奔MCU为自豪,虽然也在ARM/DSP上用过小型的OS,

也看到人们以移植成功某个OS为兴奋和自豪,但我总以为这些OS肯定在

任务切换上有毛病...虽然都没细研究,但第六感觉得肯定如此...因为"地球人"

都是一样的思路和想法,跑不出去什么"怪圈"~~~

最近传播裸奔时遇到阻击,C++的推销也不利,十分之郁闷~~~

俺觉得现在是该出手OS的时候了~~~因为现在的"行情"是:

"节约是最大的浪费"!!!

在旧社会我们那一代曾是多么地简朴,有多少人为了一个字节发过愁???

俺就曾十年4K字节每年几十个版本地发布,可是硬件一直如此~~~

如果俺不简朴,那么一年都过不去~~~

现在是"新社会"了,ARM/DSP,以及各种豪华的MCU...大量的RAM,令人羡慕的

FLASH...让人眼晕的附加模块...

速度增加了数倍乃至几百倍...可是还有人在追求旧社会时代所谓的效率???

令俺这个旧日子过惯的人都大惑不解...难道为400MHz的DSP来规划1uS的效率吗???

为512KB节省1个字节而自豪吗????空出的数KB的FLASH为何不去指责浪费呢???

C++不好!!!为何不好???

难道要我拿出当初被人指责而将C++改为C反而空间不够的证据吗???

俺无奈~~~

只好再举起COM这个PC后时代的大旗来继续C的征程...

俺晕~~~眼前一片茫然...当俺鼓足勇气请问那些阻止俺脚步的人为什么时,他说:

书上写的...我晕呀~~~

当年写书的人估计现在在菜农面前也不敢再重复一句!!!但他播下的恶种确深深

地毒害了一代和一代~~~

看看PC界吧...有几个还在用C???有几个不是用C++???

问问他们离了类及对象他们能继续存活吗???

难道MCU的进步不是PC的过去吗???MCU的再进步不是PC的今天吗???

井底之蛙...天太小了~~~

为此,俺要出手OS...俺要和裸奔PK!!!

可是当俺论证PK成功后,不知为何一直不忍心对HotBIOS痛下杀手...

这几天一直在外围忧郁...万幸搞顺了汇编数组及COM在MCU上的应用...

俺可叹苍天让俺晚生20年也过过好日子,再也不过令人悲伤的苦日子~~~

俺那时流行"浪费是最大的犯罪!!!",俺觉得现在"节约非最大的光荣!!!"

菜农HotPower@126.com       2008.6.26 郁闷于菜地

系统分类: DSP  |  用户分类: HotBIOS  |  标签: dsp  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(920) | 回复(1)

发表于 2008/6/25 23:13:07

1

关于投票

汇编数组的C++和COM的两种实现方式

hotpower 发表于 2008-6-25 23:09 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

25楼: 程序所能访问的任意区域~~~真有事求助IceAge老师~~~

下午求助了几位年轻的C++村民:

我用C++和COM都出现了数据指针和函数指针不规范或不标准转换的警告.

在VC++下没问题,但在DSP的CCS3.1环境下就出现了警告.
我用所有C++或C的强制转换都未果,甚至用中间变量折腾一次也不行~~~

H文件:
typedef long HRESULT;
typedef interface IHotAsmArrayCom IHotAsmArrayCom;

typedef struct IHotAsmArrayComVtbl
{
    void (*comASMArray)(void);//定义数组可执行汇编的函数指针
    int  (*comintASMArray)(void);//定义数组可执行汇编的函数指针
    void (*comASMArrayInt)(int);//定义数组可执行汇编的函数指针
    int  (*comintASMArrayInt)(int);//定义数组可执行汇编的函数指针
}IHotAsmArrayComVtbl;

interface IHotAsmArrayCom
{
    struct IHotAsmArrayComVtbl *lpVtbl;
};

extern void HotCOMDemo(void);

C文件:
void HotCOMDemo(void)
{
TI_IREG __ASMCodeArray[]=
{//下面的"数据"实际为汇编代码
    __asm_push__(ASMCODE_REGS_AR6),
    __asm_push__(ASMCODE_REGS_AR7),
    __asm_frame__(-15),
    __asm_char_SetACC__(0x88),
    __asm_frame__(15),
    __asm_pop__(ASMCODE_REGS_AR7),
    __asm_pop__(ASMCODE_REGS_AR6),
    __asm_return__(),
};

TI_IREG __intASMCodeArray[]=
{//下面的"数据"实际为汇编代码
    __asm_push__(ASMCODE_REGS_AR6),
    __asm_push__(ASMCODE_REGS_AR7),
    __asm_frame__(-15),
    __asm_char_SetACC__(0x88),
    __asm_frame__(15),
    __asm_pop__(ASMCODE_REGS_AR7),
    __asm_pop__(ASMCODE_REGS_AR6),
    __asm_return__(),
};

TI_IREG __ASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
    __asm_push__(ASMCODE_REGS_AR6),
    __asm_push__(ASMCODE_REGS_AR7),
    __asm_frame__(-15),
    __asm_char_SetACC__(0x88),
    __asm_frame__(15),
    __asm_pop__(ASMCODE_REGS_AR7),
    __asm_pop__(ASMCODE_REGS_AR6),
    __asm_return__(),
};

TI_IREG __intASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
    __asm_push__(ASMCODE_REGS_AR6),
    __asm_push__(ASMCODE_REGS_AR7),
    __asm_frame__(-15),
    __asm_char_SetACC__(0x88),
    __asm_frame__(15),
    __asm_pop__(ASMCODE_REGS_AR7),
    __asm_pop__(ASMCODE_REGS_AR6),
    __asm_return__(),
};

TI_IREG result, parameter = 0x1234;
//申请COM接口指针
IHotAsmArrayCom *AsmArrayCom = new (IHotAsmArrayCom*)[sizeof(IHotAsmArrayCom)];
//挂接汇编数组代码到COM接口
    AsmArrayCom->lpVtbl->comASMArray = (ASMCodeArray_FPtr)__ASMCodeArray;
    AsmArrayCom->lpVtbl->comintASMArray = (intASMCodeArray_FPtr)__intASMCodeArray;
    AsmArrayCom->lpVtbl->comASMArrayInt = (ASMCodeArrayInt_FPtr)__ASMCodeArrayInt;
    AsmArrayCom->lpVtbl->comintASMArrayInt = (intASMCodeArrayInt_FPtr)__intASMCodeArrayInt;
//通过COM访问汇编数组中的汇编代码
    AsmArrayCom->lpVtbl->comASMArray();
    result = AsmArrayCom->lpVtbl->comintASMArray();
    AsmArrayCom->lpVtbl->comASMArrayInt(0x1234);
    result = AsmArrayCom->lpVtbl->comintASMArrayInt(0x1234);
    delete AsmArrayCom;
}


再一种:

H文件:
typedef void (*ASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针
typedef int (*intASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针
typedef void (*ASMCodeArrayInt_FPtr)(int);//定义数组可执行汇编的函数指针
typedef int (*intASMCodeArrayInt_FPtr)(int);//定义数组可执行汇编的函数指针
extern void HotASMDemo(void);

C文件:

void ASMObj::ArrayProcess(ASMCodeArray_FPtr process)
{
    process();//
}


__TI_IREG ASMObj::ArrayFunction(intASMCodeArray_FPtr function)
{
    return function();
}


void ASMObj::ArrayProcess(ASMCodeArrayInt_FPtr process, __TI_IREG arg)
{
    process(arg);//
}


__TI_IREG ASMObj::ArrayFunction(intASMCodeArrayInt_FPtr function, __TI_IREG arg)
{
    return function(arg);
}


void HotASMDemo(void)
{
TI_IREG __ASMCodeArray[]=
{//下面的"数据"实际为汇编代码
    __asm_pushACC__(),
    __asm_char_SetACC__(0x88),
    __asm_popACC__(),
    __asm_return__(),
};

TI_IREG __intASMCodeArray[]=
{//下面的"数据"实际为汇编代码
    __asm_char_SetACC__(0x88),
    __asm_return__(),
};

TI_IREG __ASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
    __asm_char_SetACC__(0x88),
    __asm_return__(),
};

TI_IREG __intASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
    __asm_char_SetACC__(0x88),
    __asm_return__(),
};

TI_IREG result, parameter = 0x1234;
    ASM.ArrayProcess((ASMCodeArray_FPtr)(__ASMCodeArray));
    result = ASM.ArrayFunction((intASMCodeArray_FPtr)__intASMCodeArray);
    ASM.ArrayProcess((ASMCodeArrayInt_FPtr)__ASMCodeArrayInt, parameter);
    result = ASM.ArrayFunction((intASMCodeArrayInt_FPtr)__intASMCodeArrayInt, parameter);
}




都是一样~~~

我想是CCS太聪明了~~~
hotpower 发表于 2008-6-25 23:17 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

26楼: 哈哈~~~上帖源码收入文潭~~~以后和老师要悄悄地交流了~~~

哈哈~~~没留意暴露了全部源码~~~

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(773) | 回复(0)

发表于 2008/6/25 1:19:15

1

关于投票

HotBIOS之零耗时任务切换的研究论证及大略实现方法

hotpower 发表于 2008-6-25 01:18 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: HotBIOS之零耗时任务切换的研究论证及大略实现方法

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如果不靠其他中断源在退出前产生的额外任务切换,就只能每节拍中断
及切换一次.


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

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

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

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






HotPower三角及冗余校验密码技术
点击看大图

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(700) | 回复(0)

发表于 2008/6/24 0:23:03

1

关于投票

在MCU/ARM/DSP上实现动态链接梦成真~~~

hotpower 发表于 2008-6-24 00:21 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

7楼: 在MCU/ARM/DSP上实现动态链接梦成真~~~

哈哈~~~小RAM,大FLASH的普遍现象下图即可随手解决~~~

它是PC的动态链接技术的翻版,不过是以数组为单位.

它可以将动态连接的汇编或C/C++程序动态地调入内存.

可以随意删除...

下图是在一个函数或任务里调入RAM事先没有但在外部FLASH中有的程序代码(ASM/C/C++)

即汇编数组.

再用COM接口技术得到函数的出入参数,即可正确调用~~~

所以,它在ARM/DSP等需要程序在RAM中运行的程序是个好事情~~~

若再嵌入文件系统,那么和PC即工控单板有何区别???

哈哈~~~汇编数组---它随函数来,也可随函数去,妙哉~~~

* - 本贴最后修改时间:2008-6-24 0:23:08 修改者:hotpower

点击看大图

工程师的收藏夹


俺的地盘俺做主

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(924) | 回复(0)

发表于 2008/6/20 13:07:54

0

关于投票

菜农颠覆OS理论---学前班也能成为OS高手,特发帖自贺

hotpower 发表于 2008-6-20 13:06 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 菜农颠覆OS理论---学前班也能成为OS高手,特发帖自贺

哈哈~~~什么"OS"理论???俺已把它划归为幼教普及类~~~

菜农之"OS"理论: 60年代英雄母亲们对多子女的红色教育及管理.

再整理:
队  列---手拉手排排座.
邮  箱---发送信息收垃圾
信号量---情人幽会关门勿打扰.


刚又论证了"时光回朔器","负耗时"切换,唐僧紧箍咒,黑客任务信息测试功能.

~~~~

上午演讲(对象---没做过软件的硬件工程师(会51汇编)):
半小时其自己说"菜鸟OS毕业"了~~~


哈哈~~~汗颜~~~

这就是菜农长期不出手"移植OS"的直接原因~~~

俺的第6感告诉俺---OS只是生活点滴的一部分,无什么而言.

俺裸奔只是为了等待---等待不是简单移植什么OS,而是等待颠覆它的"理论"~~~

俺真的出手OS应该是第3天~~~实际是2天半...

裸就要奔放,穿就要火热~~~

等几天俺来几个"农村版小黄段"给大家开开乐子~~~

前几天想写个:

"菜农红杏有出墙,误入魔道洗脑浆"~~~

只要第6感通知俺前进时,俺会---不抛弃,不放弃的~~~

而且放弃其他任何事...



工程师的收藏夹


俺的地盘俺做主

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(737) | 回复(2)

发表于 2008/6/20 7:25:04

1

关于投票

"红杏出墙"---菜农名词祥解~~~

hotpower 发表于 2008-6-20 07:24 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

4楼: "红杏出墙"---菜农名词祥解~~~

所谓"红杏出墙"---就是原来应该用汇编或C等正常编程的代码用数组表示.
                 这在x86里应用很广,因为编译器可能不支持新指令但
                 新硬件已经很普及,为了不购置新软件,故采用此手法的
                 很多~~~而且也可增加"同行"或"同事"以后接替此工作
                 的难度~~~虽然有些"卑鄙"~~~但是很"上流"~~~
                 它可以提供简洁的"代码"序列带补足和提升编译的都能力.

总之,"代码就是数据,数据就是程序,程序带来效率"---这就是"红杏出墙"的真谛~~~

菜农最近经典的"红杏出墙"---菜农搞残废启动过程汇编文件核心代码部分

哈哈~~~HotBIOS"红杏出墙"的地方就数不清了~~~



http://www.google.cn/search?complete=1&hl=zh-CN&newwindow=1&q=Keil+C51%E7%BA%A2%E6%9D%8F%E5%87%BA%E5%A2%99%E8%AE%B0&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f

工程师的收藏夹


俺的地盘俺做主

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(736) | 回复(0)

发表于 2008/6/20 6:51:16

0

关于投票

"花绵袄","黑心棉","零耗时切换"---菜农名词祥解~~~

hotpower 发表于 2008-6-20 06:51 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

2楼: "花绵袄","黑心棉","零耗时切换"---菜农名词祥解~~~

"零耗时切换"---即在任务切换时几乎不用额外的操作和规定就可完成对
               所有的任务统计及断点保护和恢复.
"花绵袄"-------切换任务环境只需扣押它的retf指令即可切换到其他任务.
               等该任务需要再次工作时只需一条retf指令即可回到断点处
               并归还"花绵袄"~~~
"黑心棉"-------此着是"零耗时切换"成功的关键的关键,它虽然手法歹毒,
               但它使任务切换更自如~~~

"黑心棉"是在菜农花棉袄16字节“规范”减半为8字节成功实现的,并具有安装任务采集各项任务指标的能力.
同时保留进入和退出的2个任务钩子,并能通过HotBIOS删除任务等诸多功能.

故"花绵袄"和"黑心棉"是"零耗时切换"理论论证的关键~~~



工程师的收藏夹


俺的地盘俺做主

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(616) | 回复(1)

发表于 2008/6/20 6:29:16

0

关于投票

菜农在OS上新论证=花绵袄+黑心棉="零耗时"任务切换

hotpower 发表于 2008-6-20 06:24 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 菜农在OS上新论证=花绵袄+黑心棉="零耗时"任务切换.

发帖祝贺~~~~不眠夜收获"黑心棉"~~~

菜农这次的成功是开始就时刻提醒不要按常规出牌,因为那样---地球人都知道~~~

俺不想受任何人的支配和劝说~~

这次俺先高举C++裸奔的"义旗"顶风作案~~~遭到了很强烈地阻击...

特别是有些看不起俺农民的人更为使菜农不舒心...

俺就琢磨着非的整出个"红杏出墙"的什么"丑事"来让这个高傲的人也戴戴"绿帽子"~~~

俺就琢磨着在那里开刀???

本来正在玩stm32和lm,后又玩了几天的430,最后换惦记着没完过的moto...

由于工作,被com接口困来一周时间,真是无奈呀~~~

求助无望+郁闷地想发疯~~~想打架,想战斗...故就开设了HotPower的武潭~~~

com被攻破,rtdx也实现,是该菜农穿花棉袄上阵了~~~

C++裸奔后俺又在dsp5402上实现了"dsp红杏出墙记"~~~抢在父亲节时发布了简化版普及部分...

不是有人知道或明白里面的技术内幕否~~~

C++花棉袄农家乐计划实施后,俺就完成并实现了dsp中断"防御系统",

中断控制块的架构,任务的集中管理调度,并在刚才又实现了OS难度最高的任务切换.

一切都是数字,一切都是链接,一切都没有理论~~~

就是这样,菜农才在OS上得到新论证=花绵袄+黑心棉="零耗时"任务切换

特发帖祝贺~~~闭关就是不错~~~欧洲杯给人带来激情和送别---葡萄牙人走好~~~

 

点击看大图

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(485) | 回复(0)

发表于 2008/6/20 1:05:22

0

关于投票

HotBIOS艳照两张,不日将彻底倒塌TI的DSP/BIOS

hotpower 发表于 2008-6-20 01:04 德州仪器(TI) ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

4楼: HotBIOS艳照两张,不日将彻底倒塌TI的DSP/BIOS

点击看大图


点击看大图

工程师的收藏夹


俺的地盘俺做主

系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(586) | 回复(0)

发表于 2008/6/18 23:28:37

1

关于投票

菜农很黄很暴力但很实用的HotBIOS代码“规范”

hotpower 发表于 2008-6-18 23:25 德州仪器(TI) ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 菜农很黄很暴力但很实用的HotBIOS代码“规范”

创建任务HotBIOS: TskHandle = CreateTsk(TskFunction,//任务函数
                                       SWINum,     //软中断号
                                       TskPriority,//任务级别
                                       InitTskHook,//初始化任务钩子
                                       QuitTskHook)//终止删除任务钩子
HotBIOS任务申请ICB代码
    0xXXX0  CallD          
    0xXXX1  NewHotBIOSTsk//呼叫HtBIOS_NewHotBIOSTsk()
    0xXXX2  Ld #SWINum, B//告诉HotBIOS以后该任务使用SWINum和SWINum+1
    0xXXX3  CrcPassword
    0xXXX4  TskFunction  //任务函数
    0xXXX5  TskPriority  //任务级别
    0xXXX6  InitTskHook  //初始化任务钩子
    0xXXX7  QuitTskHook  //终止删除任务钩子
HotBIOS任务分配ICB代码
    0xXXX0  CallD
    0xXXX1  InitTskHook  //void InitTskHook(unsigned int M, unsigned char N);
    0xXXX2  Ld #N, B
    0xXXX3  M
    0xXXX4  CallD
    0xXXX5  TskFunction  //int TskFunction(void);
    0xXXX6  Stl B,
    0xXXX7  #Sp(0h)
    0xXXX8  CallD
    0xXXX9  QuitTskHook  //void QuitTskHook(unsigned int M, unsigned char N);
    0xXXXA  Ld #N, B
    0xXXXB  M
    0xXXXC  CallD
    0xXXXD  DeleteTsk
    0xXXXE  Ld #N, B
    0xXXXF  M            //void DeleteTsk(unsigned int M, unsigned char N);



系统分类: DSP  |  用户分类: HotBIOS  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(627) | 回复(2)

Total , Page /