免费咨询热线
020-88888888章节:随着各种应用于电子系统的变得复杂和系统实时性市场需求的提升,并预示应用软件朝着系统化方向发展的加快,在16位/32位单片机中普遍用于了嵌入式实时操作系统。然而实际用于中却不存在着大量8位单片机,从经济性考虑到,对某些应用于场合,在8位MCU上用于操作系统是不切实际的。从自学操作系统角度,uC/OS-IIfor51即非常简单又全面,自学成本便宜,有一点推展。
结语:C/OS-II具备免费、非常简单、可靠性低、实时性好等优点,但也有缺少便捷研发环境等缺点,特别是在不像商用嵌入式系统那样获得普遍用于和持续的研究改版。但开放性又使得开发人员可以自行削减和加到所需的功能,在许多应用领域充分发挥着独有的起到。
当然,否在单片机系统中映射C/OS-II应视所研发的项目而以定,对于一些非常简单的、低成本的项目来说,就没有适当用于嵌入式操作系统了。 uC/OS-II原理: uCOSII还包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、消息队列)四大部分,没文件系统、网络接口、输入输出界面。
它的重制只与4个文件涉及:编撰文件(OS_CPU_A.ASM)、处理器涉及C文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。有64个优先级,系统闲置8个,用户可创立56个任务,不反对时间片当此。它的基本思路就是近似于地每时每刻总是让优先级最低的准备就绪任务正处于运营状态。
为了确保这一点,它在调用系统API函数、中断完结、定点中断完结时总是继续执行调度算法。原作者通过事前计算出来好数据,修改了运算量,通过精心设计准备就绪表格结构,使得延时可预知。
任务的转换是通过仿真一次中断构建的。 uCOSII工作核心原理是:近似于地让最低优先级的准备就绪任务正处于运营状态。
操作系统将在下面情况中展开任务调度:调用API函数(用户主动调用),中断(系统闲置的时间片中断OsTimeTick(),用户用于的中断)。 调度算法书上谈得很确切,我主要谈一下整体思路。 (1)在调用API函数时,有可能引发堵塞,如果系统API函数察觉到运营条件不符合,必须转换就调用OSSched()调度函数,这个过程是系统自动已完成的,用户没参予。
OSSched()辨别否转换,如果必须转换,则此函数调用OS_TASK_SW()。这个函数仿真一次中断(在51里没软中断,我用子程序调用仿真,效果完全相同),好象程序被中断停下来了,只不过是OS蓄意生产的假象,目的是为了任务转换。
既然是中断,那么回到地址(即座落在OS_TASK_SW()的下一条编撰指令的PC地址)就被自动压入堆栈,接着在中断程序里留存CPU寄存器(PUSHALL)。堆栈结构不是给定的,而是严苛按照uCOSII规范处置。
OS每次转换都会留存和完全恢复全部现场信息(POPALL),然后用RETI返回任务断点继续执行。这个断点就是OSSched()函数里的座落在OS_TASK_SW()的下一条编撰指令的PC地址。
转换的整个过程就是,用户任务程序调用系统API函数,API调用OSSched(),OSSched()调用软中断OS_TASK_SW()即OSCtxSw,回到地址(PC值)压栈,转入OSCtxSw中断处置子程序内部。反之,转换程序调用RETI回到座落在OS_TASK_SW()的下一条编撰指令的PC地址,进而回到OSSched()下一句,再行回到API下一句,即用户程序断点。因此,如果任务从运营到准备就绪再行到运营,它就是指调度前的断点处运营。 (2)中断不会引起条件变化,在解散前必需展开任务调度。
uCOSII拒绝中断的堆栈结构符合规范,以便准确协商中断解散和任务转换。前面早已说道到任务转换实际是仿真一次中断事件,而在确实的中断里省却了仿真(本身就是中断嘛)。只要规定中断堆栈结构和uCOSII仿真的堆栈结构一样,就能确保在中断里展开准确的转换。
任务转换再次发生在中断解散前,此时还没回到中断断点。仔细观察中断程序和转换程序最后两句,它们是一模一样的,POPALL+RETI。即要么必要从中断程序解散,回到断点;要么再行留存现场到TCB,等到完全恢复现场时再行从转换函数回到原本的中断断点(由于中断和转换函数遵循联合的堆栈结构,所以解散操作者完全相同,效果也完全相同)。用户撰写的中断子程序必需按照uCOSII规范书写。
任务调度再次发生在中断解散前,是十分及时的,会等到下一时间片才处置。OSIntCtxSw()函数对堆栈指针做到了非常简单调整,以确保所有悬挂起任务的栈结构看上去是一样的。
(3)在uCOSII里,任务必需写两种形式之一(《uCOSII中文版》p99页)。在有些RTOS研发环境里没拒绝显式调用OSTaskDel(),这是因为研发环境自动做到了处置,实际原理都是一样的。uCOSII的研发依赖编译器,目前没专用研发环境,所以经常出现这些不便之处是可以解读的。 重制过程: (1)拷贝书后附送光盘sourcecode目录下的内容到C:\YY下,移除不必要的文件和EX1L.C,只只剩p187(《uCOSII》)上所列的文件。
(2)重写最简单的OS_CPU.H 数据类型的原作闻C51.PDF第176页。留意BOOLEAN要定义成unsignedchar类型,因为bit类型为C51特有,无法用在结构体里。
EA=0关中断;EA=1进中断。这样定义即增加了程序行数,又防止了解散临界区后关口中断导致的死机。
MCS-51堆栈从下往上快速增长(1=向上,0=向下),OS_STK_GROWTH定义为0 #defineOS_TASK_SW()OSCtxSw()因为MCS-51没软中断指令,所以用程序调用替换。两者的堆栈格式完全相同,RETI指令废黜中断系统,RET则没。实践中指出,对于MCS-51,用子程序调用进栈,用中断回到指令RETI出有栈是没问题的,反之中断进栈RET出栈则敢。
总之,对于进栈,子程序调用与中断调用效果是一样的,可以混用。在没中断再次发生的情况下废黜中断系统也会影响系统长时间运营。
本文来源:博鱼体育app官方网站-www.zxhbjj.com
Copyright © 2001-2023 www.zxhbjj.com. 博鱼体育app官方网站科技 版权所有 备案号:ICP备29769135号-5