×

如何使用51单片机设计一个简易操作系统的详细资料说明

消耗积分:1 | 格式:pdf | 大小:0.10 MB | 2019-04-23

5762

分享资料个

  看了很久的操作系统原理,ucos源码也看了大半,但是感觉总是懵懵懂懂,用句流行的网络用语就是始终上不了车,后来在网上被人推荐了一篇文章《建立一个属于自己的操作系统》,这篇文章真的非常好,也附有源码,但不知道是不是我找的文章有差错还是啥,我根据文章提供的源码贴代码,根本无法编译,然后开始读代码修改代码最后成功编译但是在硬件平台运行根本不行。后来又断断续续看ucos源码,反正各种什么数据结构啊的通信什么的让人头痛,后来大学的单片机原理完课,学校安排课设,我选了时钟定时器(有点像闹钟),这种开环的裸机开发没什么难度,闲着也是闲着于是从新捡起几个月前没有完成的os,这次重新开坑,代码完全自己敲,从基本功能开始一步步实现os,像《建立一个属于自己的操作系统》介绍的一样。忙活了两天也终于成功了,并且成功地将时钟定时器移植到自己的os上跑了,说实话在os跑比裸机的前后台的效果好很多(os上跑按按键与现实感觉是同步进行的,前后台的效果在按按键的时候数码显示是会黑屏的),但是51的硬件资源太少,只有128个字节的ram,所以此次设计没有统一的任务通信接口,只能实现基本的优先级,延时服务或者轮询服务。在自己成功地建立一个属于自己os后在看ucos的源码更加顺畅,以前一直搞不懂的任务通信也能明白

  正文

  1,任务人口地址:在os中,是在不直接用程序名(参数)这种方式调用任务。那怎样呢?这部分《建立一个属于自己的操作系统》讲的非常详细,大家自行搜阅。

  2,任务调度:学过单片机原理的都知道,cpu中有sp与pc两个特殊的寄存器,sp是堆栈指针,在51中它可以指向数据区的任意单元,PC是程序计数器,它始终保存下一条程序指令的地址。51C语言是可以直接操控sp的,但是pc不行,所以要想办法间接操控pc,对的,就是通过压栈和弹栈实现,在程序执行发生断点时(调动子程序或中断),cpu会自动将pc的值进行压栈,返回断点时会自动将栈顶的值弹回pc,这就是关键,如果在弹回前,我们修改sp,不就可以间接操控pc了吗!这样就可以将cpu执行其他任务了;

  3,人工堆栈:操作系统原理中有一点非常重要,就是上下文切换,所以每个任务必须有属于自己的堆栈,称为人工堆栈。人工堆栈的建立非常讲究,不能短也不能太长,短了会是溢出会可能修改其他任务的人工堆栈,产生调度紊乱。太长会浪费空间,尤其是像51这种硬件资源本就少的单片机。堆栈的空间的预留是通过数组来划分的。在建立任务时,要对堆栈初始化(这也很关键),将任务入口地址压到最底部(不同的单片机情况不同,这里以51为例,后面的也是),然后sp指向正确的堆栈位置(不同的单片机情况不同,要保存的寄存器个数不同),个人在设计中发现,为了不让sp越界,最好将堆栈最底部单元预留出来,避免浪费可以用来保存任务信息,比如堆栈使用情况。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !