微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > DIY:给单片机写个实时操作系统内核!

DIY:给单片机写个实时操作系统内核!

时间:11-29 来源:互联网 点击:

对CPU寄存器,数据总线,地址总线,以及执行方式这些有一定的了解才行,这方面的书也挺多的,不过介绍两本个人觉得写得挺好的书供课外闲读,《编程卓越之道》1、2卷,这本书大体上介绍了高级语言是怎么样在CPU里面执行的,另外也对CPU内部结构做了一些介绍,比那些课内教材写得好,有空可以去看一下。

 

 

 

最后介绍一本《嵌入式实时操作系统UCOS II》,这本书介绍了UCOS II这个操作系统的内部源代码以及实现原理,我就是从这本书中学到了怎样写一个可以用的操作系统内核。

书单推荐完毕,下面进入重点~~~~~~~~~~~~~~~~~

 

/**************************************************************************************/

什么是操作系统?其实就是一个程序, 这个程序可以控制计算机的所有资源,对资源进行分配,包括CPU时间,内存,IO端口等,按一定规则分配给所需要的进程(进程?也就是一个程序,可以单独执行),并且自动控制让CPU可以执行多个互不相关的任务,按照书中的介绍,一个操作系统需要具备四个要素:进程调度、内存管理、IO管理、文件管理。

 

那怎么样可以让CPU同时执行多个任务呢?首先想象一下如果让CPU执行单道程序,它会从MAIN函数开始一直顺序地执行下去,CPU里面有一个叫PC的寄存器,也就是程序计数器,它永远指向下一条要执行的指令的存放地址,因为大多数情况下指令都是逐条执行的,所以PC寄存器也只是简单地加一,所以大家都叫它”程序计数器“,从PC寄存器的特点也许我们可以做点文章?比如人为地让PC寄存器指到另外一段程序的入口地址,那CPU不就自动地跑到另一段程序了么?哈哈。假如我们可以这样做,那没错,CPU确定是跑到别人的领地去执行代码了,问题是:怎么样让它回来继续执行?换句话说,PC寄存器改变之后CPU 已经不知道刚刚这段程序执行到哪里了,亦即跑不回来了,就像断了线的风筝。呃。。这问题麻烦。。解决了这个问题就似乎有点苗头了。。

 

好吧,我们来看看有一个很相似的问题,就是单片机在执行代码的时候,突然有一个中断信号过来了,单片机马上就屁颠屁颠地跑到中断服务程序里面去执行了,执行完毕之后,奇怪!!它怎么还记得跑回来原来的地方!!??OH NO .它是怎么办到的。其实这里还要介绍另外一个寄存器叫SP的,即:STACK POINTER堆栈指针,这个指针指向一个内存的地址,里面存放了一些数据。首先,单片机遇到中断信号的时候,它就把当前的PC寄存器的值保存到SP所指的地址,这就相当于它记住了当前执行的地方,叫做断点保护,然后PC寄存器就指向中断服务程序的地址,下一个时刻CPU就自动执行中断服务程序里面的代码了,执行完毕之后中断服务程序调用了一个指令:RETI,这条指令叫返回指令,在函数结束之后调用,它会自动从SP指针指向的地址把值取出来放到PC寄存器里面,然后CPU就会自动回到之前断掉的地方继续执行了!基于这个原理,我们可以回到上面的问题:首先,让CPU把当前的PC保存起来,然后把PC指向别段程序地址,CPU就跑到别人的领地去执行了,执行完了之后我们可以把SP指向的内容放回PC,这样调用RET指令之后,CPU就会回到原来的地方继续执行了!!貌似这个问题完美地解决了!!

 

可是还有一个关键的问题:CPU在执行当前代码的时候 CPU里面所有的寄存器都保存的当前这个程序所用到的值,比如做加法的时候用到PSW寄存器的进位标志位,如果此时切换到别的任务,那再回到当前程序的时候,这些值都会被改变,CPU会陷入混乱然后直接跑飞!!解决这问题同样要靠SP同学,在切换任务的时候我们把所有寄存器依次入到SP指向的地址,称为入栈操作,每次入栈SP指针的值都会加一或者减一,视不同CPU而定。而要恢复的时候,就从SP指向的地址依次把值取出来放回原来的地方,称为弹栈操作。最后才弹出地址到PC寄存器,下一时刻,CPU自动跑到原来的地址继续执行,从CPU的角度看就像没有发生任务切换一样,一切依旧,继续工作。如果CPU的执行速度够快,切换速度也够快,这样就可以给人感觉CPU同时在执行很多任务,这就是操作系统里面最基本的原理。

 

SO,解释完原理,我们首先来就来实现简单的任务切换,这里的难点就在于:执行这一动作必须要操作CPU的寄存器,而C语言是无法实现的,这就是为什么要用到汇编的原因了,所有操作系统的最底层代码都是用汇编语言实现的,否则根本无法实现任务切换。下面要介绍汇编里面的几条相关指令。PS:虽然每种CPU的汇编都不同,但是基本原理还是相通的。

第一条:CALL。函数调用指令,当我们要调用一个函数的时候

上一篇:C++嵌入式开发
下一篇:单片机硬件心得

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top