下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 第10章

第10章.doc

第10章

linwhwylb
2018-09-05 0人阅读 举报 0 0 暂无简介

简介:本文档为《第10章doc》,可适用于IT/计算机领域

第章从µCOS升级到µCOSII本章描述如何从µCOS升级到µCOSII。如果已经将µCOS移植到了某类微处理器上移植µCOSII所要做的工作应当非常有限。在多数情况下用户能够在个小时之内完成这项工作。如果用户熟悉µCOS的移植可隔过本章前一部分直接参阅节。目录和文件用户首先会注意到的是目录的结构主目录不再叫SOFTWAREuCOS。而是叫SOFTWAREuCOSII。所有的µCOSII文件都应放在用户硬盘的SOFTWAREuCOSII目录下。面向不同的微处理器或微处理器的源代码一定是在以下两个或三个文件中:OSCPUH,OSCPUCC或许还有OSCPUAASM。汇编语言文件是可有可无的因为有些C编译程序允许使用在线汇编代码用户可以将这些汇编代码直接写在OSCPUCC中。与微处理器有关的特殊代码即与移植有关的代码在µCOS中是放在用微处理器名字命名的文件中的例如Intelx的实模式(RealMode)在大模式下编译(LargeModle)时文件名为IxLHIxLCC和IxLAASM。表L在µCOSII中重新命名的文件SOFTWAREuCOSIxLSOFTWAREuCOSIIIxLIxLHOSCPUHIxLAASMOSCPUAASMIxLCCOSCPUCC升级可以从这里开始:首先将µCOS目录下的旧文件复制到µCOSII的相应目录下并改用新的文件名这比重新建立一些新文件要容易许多。表给出来几个与移植有关的新旧文件名命名法的例子。表L对不同微处理器从µCOS到µCOSII要重新命名的文件SOFTWAREuCOSISOFTWAREuCOSIIIIHOSCPUHICOSCPUCCSOFTWAREuCOSMxSOFTWAREuCOSIIMxMxHOSCPUHMxCOSCPUCCSOFTWAREuCOSMHCSOFTWAREuCOSIIMHCMHCHOSCPUHMHCCOSCPUCCSOFTWAREuCOSZSOFTWAREuCOSIIZZHOSCPUHZAASMOSCPUAASMZCCOSCPUCCINCLUDESH用户应用程序中的INCLUDESH文件要修改。以x实模式在大模式下编译为例用户要做如下修改:•变目录名µCOS为µCOSII•变文件名IXLH为OSCPUH•变文件名UCOSH为uCOSIIH新旧文件如程序清单L和L所示OSCPUHOSCPUH文件中有与微处理器类型及相应硬件有关的常数定义、宏定义和类型定义。与编译有关的数据类型s为了实现µCOSII用户应定义个新的数据类型:INTU、INTS、INTU、NTS、INTU、和INTS。这些数据类型有分别表示有符号和无符号位、位、位整数。在µCOS中相应的数据类型分别定义为:UBYTE、BYTE、UWORD、WORD、ULONG和LONG。用户所要做的仅仅是复制µCOS中数类型并修改原来的UBYTE为INTU将BYTE为INTS将UWORD修改为INTU等等如程序清单L所示。程序清单LµCOS中的INCLUDESH*****************************************************************INCLUDESH****************************************************************#include<STDIOH>#include<STRINGH>#include<CTYPEH>#include<STDLIBH>#include<CONIOH>#include<DOSH>#include"SOFTWAREUCOSIXLIXLH"#include"OSCFGH"#include"SOFTWAREUCOSSOURCEUCOSH"程序清单LµCOSII中的INCLUDESH*****************************************************************INCLUDESH****************************************************************#include<STDIOH>#include<STRINGH>#include<CTYPEH>#include<STDLIBH>#include<CONIOH>#include<DOSH>#include"SOFTWAREuCOSIIIXLOSCPUH"#include"OSCFGH"#include"SOFTWAREuCOSIISOURCEuCOSIIH"程序清单LµCOS到µCOSII数据类型的修改*uCOSdatatypes:*typedefunsignedcharUBYTE*Unsignedbitquantity*typedefsignedcharBYTE*Signedbitquantity*typedefunsignedintUWORD*Unsignedbitquantity*typedefsignedintWORD*Signedbitquantity*typedefunsignedlongULONG*Unsignedbitquantity*typedefsignedlongLONG*Signedbitquantity**uCOSIIdatatypes*typedefunsignedcharINTU*Unsignedbitquantity*typedefsignedcharINTS*Signedbitquantity*typedefunsignedintINTU*Unsignedbitquantity*typedefsignedintINTS*Signedbitquantity*typedefunsignedlongINTU*Unsignedbitquantity*typedefsignedlongINTS*Signedbitquantity*在µCOS中任务栈定义为类型OSSTKTYPE而在µCOSII中任务栈要定义类型OSSTK为了免于修改所有应用程序的文件可以在OSCPUH中建立两个数据类型以Intelx为例如程序清单L所示。程序清单LµCOS和µCOSII任务栈的数据类型#defineOSSTKTYPEUWORD*在uCOS中*#defineOSSTKINTU*在uCOSII中*OSENTERCRITICAL()和OSEXITCRITICAL()µCOSII和µCOS一样分别定义两个宏来开中断和关中断:OSENTERCRITICAL()和OSEXITCRITICAL()。在µCOS向µCOSII升级的时候用户不必动这两个宏。OSSTKGROWTH大多数微处理器和微处理器的栈都是由存储器高地址向低地址操作的然而有些微处理器的工作方式正好相反。µCOSII设计成通过定义一个常数OSSTKGROWTH来处理不同微处理器栈操作的取向:对栈操作由低地址向高地址增长设OSSTKGROWTH为对栈操作由高地址向低地址递减设OSSTKGROWTH为有些新的常数定义(#defineconstants)在µCOS中是没有的故要加到OSCPUH中去。OSTASKSW()OSTASKSW()是一个宏从µCOS升级到µCOSII时这个宏不需要改动。当µCOSII从低优先级的任务向高优先级的任务切换时要用到这个宏OSTASKSW()的调用总是出现在任务级代码中。OSFAR因为Intelx的结构特点在µCOS中使用过OSFAR。这个定义语句(#define)在µCOSII中去掉了因为这条定义使移植变得不方便。结果是对于Intelx如果用户定义在大模式下编译时所有存储器属性都将为远程(FAR)在µCOSII中任务返回值类型定义如程序清单L所示。用户可以重新编辑所有OSFAR的文件或者在µCOSII中将OSFAR定义为空去掉OSFAR以实现向µCOSII的升级。程序清单L在µCOS中任务函数的定义voidOSFARtask(void*pdata){pdata=pdatawhile(){}}OSCPUAASM移植µCOS和µCOSII需要用户用汇编语言写个相当简单的函数。OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()OSStartHighRdy()在µCOSII中OSStartHighRdy()要调用OSSTaskSwHook()。OSTaskSwHook()这个函数在µCOS中没有。用户将最高优先级任务的栈指针装入CPU之前要先调用OSTaskSwHook()。还有OSStartHighRdy要在调用OSTaskSwHook()之后立即将OSRunning设为。程序清单L给出OSStartHighRdy()的示意代码。µCOS只有其中最后三步。程序清单LOSStartHighRdy()的示意代码OSStartHighRdy:CallOSTaskSwHook()调用OSTaskSwHook()SetOSRunningto置OSRunning为LoadtheprocessorstackpointerwithOSTCBHighRdy>OSTCBStkPtr将OSTCBHighRdy>OSTCBStkPtr装入处理器的栈指针POPalltheprocessorregistersfromthestack从栈中弹出所有寄存器的值ExecuteaReturnfromInterruptinstruction执行中断返回指令OSCtxSw()在µCOSII中任务切换要增作两件事首先将当前任务栈指针保存到当前任务控制块TCB后要立即调用OSTaskSwHook()。其次在装载新任务的栈指针之前必须将OSPrioCur设为OSPrioHighRdy。OSCtxSw()的示意代码如程序清单L所示。µCOSII加上了步骤L()和()。程序清单LOSCtxSw()的示意代码OSCtxSw:PUSHprocessorregistersontothecurrenttask’sstack所有处理器寄存器的值推入当前任务栈SavethestackpointeratOSTCBCur>OSTCBStkPtrCallOSTaskSwHook())OSTCBCur=OSTCBHighRdyOSPrioCur=OSPrioHighRdy()LoadtheprocessorstackpointerwithOSTCBHighRdy>OSTCBStkPtr将OSTCBHighRdy>OSTCBStkPtr装入处理器的栈指针POPalltheprocessorregistersfromthestack从栈中弹出所有寄存器的值ExecuteaReturnfromInterruptinstructionOSIntCtxSw()如同上述函数一样在µCOSII中OSCtxSw()也增加了两件事。首先将当前任务的栈指针保存到当前任务的控制块TCB后要立即调用OSTaskSwHook()。其次在装载新任务的栈指针之前必须将OSPrioCur设为OSPrioHighRdy。程序清单L给出OSIntCtxSw()的示意代码。µCOSII中增加了L()和()。程序清单LOSIntCtxSw()的示意代码OSIntCtxSw():AdjustthestackpointertoremovecalltoOSIntExit(),localsinOSIntExit()andthecalltoOSIntCtxSw()调整由于调用上述子程序引起的栈指针值的变化SavethestackpointeratOSTCBCur>OSTCBStkPtr保存栈指针到OSTCBCur>OSTCBStkPtrCallOSTaskSwHook()调用OSTaskSwHook()()OSTCBCur=OSTCBHighRdyOSPrioCur=OSPrioHighRdy()LoadtheprocessorstackpointerwithOSTCBHighRdy>OSTCBStkPtr将OSTCBHighRdy>OSTCBStkPtr装入处理器的栈指针POPalltheprocessorregistersfromthestack从栈中弹出所有寄存器的值ExecuteaReturnfromInterruptinstruction执行中断返回指令OSTickISR()在µCOSII和µCOS中这个函数的代码是一样无须改变。OSCPUCC移植µCOSII需要用C语言写个非常简单的函数:OSTaskStkInit()OSTaskCreateHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTimeTickHook()其中只有一个函数OSTaskStkInit()是必不可少的。其它个只需定义而不包括任何代码。OSTaskStkInit()在µCOS中OSTaskCreate()被认为是与使用的微处理器类型有关的函数。实际上这个函数中只有一部分内容是依赖于微处理器类型的。在µCOSII中与使用的微处理器类型有关的那一部分已经从函数OSTaskCreate()中抽出来了放在一个叫作OSTaskStkInit()的函数中。OSTaskStkInit()只负责设定任务的栈使之看起来好像中断刚刚发生过所有的CPU寄存器都被推入堆栈。作为提供给用户的例子程序清单L给出Intelx实模式在大模式下编译的µCOS的OSTaskCreate()函数的代码。程序清单L是同类微微处理器的µCOSII的OSTaskStkInit()函数的代码。比较这两段代码可以看出:从L()OSEXITCRIITICAL()到L()调用OSTaskStkInit()都抽出来并移到了OSTaskStkInit()中。程序清单LµCOS中的OSTaskCreate()UBYTEOSTaskCreate(void(*task)(void*pd),void*pdata,void*pstk,UBYTEp){UWORDOSFAR*stkUBYTEerrOSENTERCRITICAL()if(OSTCBPrioTblp==(OSTCB*)){OSTCBPrioTblp=(OSTCB*)OSEXITCRITICAL()()stk=(UWORDOSFAR*)pstk*stk=(UWORD)FPOFF(pdata)*stk=(UWORD)FPSEG(task)*stk=(UWORD)FPOFF(task)*stk=(UWORD)x*stk=(UWORD)FPSEG(task)*stk=(UWORD)FPOFF(task)*stk=(UWORD)x*stk=(UWORD)x*stk=(UWORD)x*stk=(UWORD)x*stk=(UWORD)x*stk=(UWORD)x*stk=(UWORD)x*stk=(UWORD)x*stk=(UWORD)x*stk=DSerr=OSTCBInit(p,(voidfar*)stk)()if(err==OSNOERR){if(OSRunning){OSSched()}}else{OSTCBPrioTblp=(OSTCB*)}return(err)}else{OSEXITCRITICAL()return(OSPRIOEXIST)}}程序清单LµCOSII中的OSTaskStkInit()void*OSTaskStkInit(void(*task)(void*pd),void*pdata,void*ptos,INTUopt){INTU*stkopt=optstk=(INTU*)ptos*stk=(INTU)FPSEG(pdata)*stk=(INTU)FPOFF(pdata)*stk=(INTU)FPSEG(task)*stk=(INTU)FPOFF(task)*stk=(INTU)x*stk=(INTU)FPSEG(task)*stk=(INTU)FPOFF(task)*stk=(INTU)xAAAA*stk=(INTU)xCCCC*stk=(INTU)xDDDD*stk=(INTU)xBBBB*stk=(INTU)x*stk=(INTU)x*stk=(INTU)x*stk=(INTU)x*stk=(INTU)x*stk=DSreturn((void*)stk)}OSTaskCreateHook()OSTaskCreateHook()在µCOS中没有如程序清单L所示在由µCOS向µCOSII升级时定义一个空函数就可以了。注意其中的赋值语句如果不把Ptcb赋给Ptcb有些编译器会产生一个警告错误说定义的Ptcb变量没有用到。程序清单µCOSII中的OSTaskCreateHook()#ifOSCPUHOOKSENOSTaskCreateHook(OSTCB*ptcb){ptcb=ptcb}#endif用户还应该使用条件编译管理指令来处理这个函数。只有在OSCFGH文件中将OSCPUHOOKSEN设为时OSTaskCreateHook()的代码才会生成。这样做的好处是允许用户移植时可在不同文件中定义钩子函数。OSTaskDelHook()OSTaskDelHook()这个函数在µCOS中没有如程序清单所示从µCOS到µCOSII只要简单地定义一个空函数就可以了。注意如果不用赋值语句将ptcb赋值为ptcb有些编译程序可能会产生一些警告信息指出定义的ptcb变量没有用到。程序清单LµCOSII中的OSTaskDelHook()#ifOSCPUHOOKSENOSTaskDelHook(OSTCB*ptcb){ptcb=ptcb}#endif也还是要用条件编译管理指令来处理这个函数。只有把OSCFGH文件中的OSCPUHOOKSEN设为OSTaskDelHook()的代码才能生成。这样做的好处是允许用户移植时在不同的文件中定义钩子函数。OSTaskSwHook()OSTaskSwHook()在µCOS中也不存在。从µCOS向µCOSII升级时只要简单地定义一个空函数就可以了如程序清单L所示。程序清单LµCOSII中的OSTaskSwHook()函数#ifOSCPUHOOKSENOSTaskSwHook(void){}#endif也还是要用编译管理指令来处理这个函数。只有把OSCFGH文件中的OSCPUHOOKSEN设为OSTaskSwHook()的代码才能生成。OSTaskStatHook()OSTaskStatHook()在µCOS中不存在从µCOS向µCOSII升级时只要简单地定义一个空函数就可以了如程序清单L所示。也还是要用编译管理指令来处理这个函数。只有把OSCFGH文件中的OSCPUHOOKSEN设为OSTaskSwHook()的代码才能生成。程序清单LµCOSII中的OSTaskStatHook()函数#ifOSCPUHOOKSENOSTaskStatHook(void){}#endifOSTimeTickHook()OSTimeTickHook()在µCOS中不存在从µCOS向µCOSII升级时只要简单地定义一个空函数就可以了如程序清单L所示。也还是要用编译管理指令来处理这个函数。只有把OSCFGH文件中的OSCPUHOOKSEN设为OSTimeTickHook()的代码才能生成。程序清单LµCOSII中的OSTimeTickHook()#ifOSCPUHOOKSENOSTimeTickHook(void){}#endif总结表T总结了从µCOS向µCOSII升级需要改变得地方。其中processorname是µCOS中移植范例程序的文件名。表T升级µCOS到µCOSI要修改的地方µCOSµCOSIIProcessornameHOSCPUH数据类型:UBYTEBYTEUWORDWORDULONGLONG数据类型:INTUINTSINTUINTSINTUINTSOSSTKTYPEOSSTKOSENTERCRITICAL()不变OSEXITCRITICAL()不变增加了OSSTKGROWTHOSTASKSW()不变OSFAR定义OSFAR为空或删除所有的OSFARProcessornameASMOSCPUAASMOSStartHighRdy()增加了调用OSTaskSwHook()置OSRunning为(bits)OSCtxSw()增加了调用OSTaskSwHook()拷贝OSPrioHighRdy到OSPrioCur(bits)OSIntCtxSw()增加了调用OSTaskSwHook()拷贝OSPrioHighRdy到OSPrioCur(bits)OSTickISR()不变ProcessornameCOSCPUCCOSTaskCreate()抽出栈初始部分放在函数OSTaskStkInit()中增加了空函数OSTaskCreateHook()增加了空函数OSTaskDelHook()增加了空函数OSTaskSwHook()增加了空函数OSTaskStatHook()增加了空函数OSTimeTickHook()

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/14

第10章

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利