zip51部曲之一任务创建和系统启动

zip51部曲之一任务创建和系统启动

ID:41885728

大小:237.54 KB

页数:16页

时间:2019-09-04

zip51部曲之一任务创建和系统启动_第1页
zip51部曲之一任务创建和系统启动_第2页
zip51部曲之一任务创建和系统启动_第3页
zip51部曲之一任务创建和系统启动_第4页
zip51部曲之一任务创建和系统启动_第5页
资源描述:

《zip51部曲之一任务创建和系统启动》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、今天生日了一个人过的孤孤单单的。。。别的不想做发一个操作系统(它太小了叫做实时内核还恰当一些)留作纪念吧。这是我的第一个操作系统,以前经常在windows下搞一些脱壳破解之类的东西突然萌生了一个念头那就是总不能搞破坏吧?人总是得建设点什么。于是我就想学一个操作系统,由于不是科班所以只能选择代码短小的UCOS-IIo看完之后想移植一下但是手头只有一个单片机芯片可用于是就选择了它。经过简单的了解一下单片机(stc89c52系列的)处理器的特点发现只有8K的ROM,512的RAM这么小的RAM估计不扩展RAM

2、的话只能放得下ucos的几个任务控制块。犹豫着到底要不要坚持下去,既然选择了就不可以轻言放弃,ucos不行可以自己亲手仿照它再写一个专门适用于51系列的系统,于是我就给要写的系统取了个名字:zip51,之后就开始了长达两个星期的编码和调试之中。。凭我的理解系统最基本的功能就是对cpu内存资源提供管理。Cpu管理那就是任务切换,没有多任务谈不上操作系统。读过郭天祥的书发现树上有很多类似for(I=0;I

3、这样也是对cpu资源极大的浪费如果在延时的时候将cpu资源分配给其它任务,在延时时间到了之后再回到本任务这样岂不是更好。要实现这种功能就是操作系统的功能了有两样问题是必须解决的1是任务切换2是时间管理本节分三个函数谈一下任务的创建和切换:下面的贴一个示例出来,可以清楚的看到,OS本身只有不到30行源代码,编译后的目标代码60字节,任务切换在最好情况下(为什么说最好情况后面会解释)消耗为76个机器周期.相比之下,KEIL内嵌的TINY51目标代码为800字节,切换消耗100〜700周期•唯一不足之处是,每

4、个任务要占用掉十几字节的堆栈,所以任务数不能太多,对于52来可以跑四个常规的系统了。这套代码按照12M主频模拟调试,切换任务仅需76uS.#include#defineStkO_Len15#defineStk2_Len#defineStk3_Len#defineStkIdle_LenTypedefunsignedcharbyteTypedefbyteidatastktype〃/这里让堆栈使用高位的128个字节StkTypeStkTypeStkTypeStkTypeTaskStkO[St

5、kO__LenJTaskStkl[Stkl_Len]TaskStk2[Stk2_Len]voidTaskSw(void)small152215;〃第一个堆栈;〃第二个堆栈;〃第三个堆栈;〃第四个堆〃/在进入这个皈数之前中断是关闭的,「et之前应当开中断pushpushACCBpushDPHpushDPLpushPSW#pragmaendasmif(gSysInfo.PriCur==3)/〃当前优先级是3#pragmaasmpushpushpushpushpushpushpushpush18H19H1AH

6、1BH1CH1DH1EH1FHTaskStk3[Stk3_Len]gTCB[gSysInfo.PriCur].StkPtr=SP;〃/被打断的任务指针保存在任务控制块屮至此此任务已经结束gSysInfo.PriCur=gSysInfo.PriHighRdy;SP=gTCB[gSysInfo.PriCur].StkPtr;〃/让堆栈指针指向要切换到的任务的堆栈if(gSysInfo.PriCur==3)#pragmaasmPOP1FHPOP1EHpop1DHpop1CHpop1BHPOP1AHpop19H

7、pop18H#pragmaendasm#pragmaasmPOPPSWpopDPLPopDPHpopBpopACC#pragmaendasmEA=1;#pragmaasmret#pragmaendasm既然是多任务那么就需某些任务的运行被打断之后有一个保存机制可以把当前任务的东西保存起来,然后把需要运行的任务以前保存的回复。这里保存的东西就是寄存器了,而保存的地点当然就选择堆栈了。gSysinfo是一个字节的全局变量,包含两个内容。一个是PriHighRdy表示当前就绪了的最高优先级,另外一个是PriC

8、ur表示当前运行的任务的优先级。按照51系列单片机的特点,可以设计四个任务优先级分别是0,1,2,3分别占用第0123四个工作组。这样每一个任务只需要保存的寄存器PSWDPLDPHBACC即可,只要更改PWS的值就可以完成快速任务切换。但是还有一个问题那就是中断会随时打断任何一个任务,如果在中断开始保存被打断任务的工作组寄存器那么每一个任务都得分配足够的堆栈以保存本任务的工作这样栈的压力就会很大任务切换耗时也会增多。最好的解决办法是让中断使

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。