- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
zip51部曲之一任务创建和系统启动
前言
今天生日了一个人过的孤孤单单的。。。别的不想做发一个操作系统(它太小了叫做实时内核还恰当一些)留作纪念吧。这是我的第一个操作系统,以前经常在windows下搞一些脱壳 破解之类的东西突然萌生了一个念头那就是总不能搞破坏吧?人总是得建设点什么。
于是我就想学一个操作系统,由于不是科班所以只能选择代码短小的ucos-II。看完之后想移植一下但是手头只有一个单片机芯片可用于是就选择了它。
经过简单的了解一下单片机(stc89c52系列的)处理器的特点发现只有8K的ROM,512的RAM这么小的RAM估计不扩展RAM的话只能放得下ucos的几个任务控制块。犹豫着到底要不要坚持下去,既然选择了就不可以轻言放弃,ucos不行可以自己亲手仿照它再写一个专门适用于51系列的系统,于是我就给要写的系统取了个名字:zip51,之后就开始了长达两个星期的编码和调试之中。。
凭我的理解系统最基本的功能就是对cpu内存资源提供管理。Cpu管理那就是任务切换,没有多任务谈不上操作系统。
读过郭天祥的书发现树上有很多类似
for (I = 0;I n;I ++ )
for (j =0;j m;j ++ )
之类的语句这样是为了实现延时通过无意义的循环实现软延时,但这样也是对cpu资源极大的浪费如果在延时的时候将cpu资源分配给其它任务,在延时时间到了之后再回到本任务这样岂不是更好。要实现这种功能就是操作系统的功能了有两样问题是必须解决的1是任务切换 2是时间管理
本节分三个函数谈一下任务的创建和切换:
下面的贴一个示例出来,可以清楚的看到,OS本身只有不到30行源代码,编译后的目标代码60字节,任务切换在最好情况下(为什么说最好情况后面会解释)消耗为76个机器周期.相比之下,KEIL内嵌的TINY51目标代码为800字节,切换消耗100~700周期.唯一不足之处是,每个任务要占用掉十几字节的堆栈,所以任务数不能太多,对于52来可以跑四个常规的系统了。这套代码按照12M主频模拟调试,切换任务仅需76uS.
#include reg52.h
#define Stk0_Len 15
#define Stk1_Len 15
#define Stk2_Len 15
#define Stk3_Len 22
#define StkIdle_Len 15
Typedef unsigned char byte
Typedef byte idata stktype
///这里让堆栈使用高位的128个字节
StkType TaskStk0[Stk0_Len] ; //第一个堆栈
StkType TaskStk1[Stk1_Len] ; //第二个堆栈
StkType TaskStk2[Stk2_Len] ; //第三个堆栈
StkType TaskStk3[Stk3_Len] ; //第四个堆
void TaskSw (void ) small
{
///在进入这个函数之前中断是关闭的,ret之前应当开中断
push ACC
push B
push DPH
push DPL
push PSW
#pragma endasm
if ( gSysInfo.PriCur == 3 ) ///当前优先级是3
{
#pragma asm
push 18H
push 19H
push 1AH
push 1BH
push 1CH
push 1DH
push 1EH
push 1FH
#pragma endasm
}
gTCB[gSysInfo.PriCur].StkPtr = SP;
///被打断的任务指针保存在任务控制块中至此此任务已经结束
gSysInfo.PriCur = gSysInfo.PriHighRdy;
SP = gTCB[gSysInfo.PriCur].StkPtr;
///让堆栈指针指向要切换到的任务的堆栈
if (gSysInfo.PriCur == 3 )
{
#pragma asm
pop 1FH
pop 1EH
pop 1DH
pop 1CH
pop 1BH
pop 1AH
pop 19H
pop 18H
#pra
文档评论(0)