|
启动工作原理
刚接触操作系统的时候觉得这个最神秘,到底里面做了什么,怎么就成了个操作系统,它到底有什么用,为什么要引进来着个东东。学了之后才知道,原来最根本的思想还是源于汇编里面的跳转和压栈,以调用一个函数为例,编译后的汇编肯定是先通过 SP压入当前代码段地址然后就是保存一些寄存器的值放栈里面(51单片机好像不是这样),然后执行程序,完了之后,出栈把寄存器恢复,最后把原来存的代码段地址付给 PC 然后回到原来的程序,这是汇编执行函数的做法,而操作系统人为强行的模拟这样操作,把代码写成不同代码块假定为 A、B,要相互之间执行似乎不受影响,是这么实现的,假设首先代码在 A 中执行,代码段一直往下指,如果我要执行 B,首先把 A 的代码段压入栈,所有的寄存器值存入 A 的栈,然后让 SP 强行指到 B 的栈执行出栈操作,把寄存器恢复成 B 的,B 的代码段地址放入 PC,这样就 B 在执行,如果又要 A 接着上次执行,又强行把 B 的寄存器、当前代码段地址压入 B 的栈,然后 SP 强行指到 A 的栈恢复的时候恢复成 A 最近一次保存的东西(和函数调用不同每次切换栈里面的东西是随机的),这样,可以很自由的在 A、B 中切换,如果切换足够快,A、B 看以来好像同时在执行,这就是并行,A、B 就是任务。如果这个切操作放到定时器函数中来做,就可以严格按照时间来切换,这就是操作系统雏形。另外,各个任务之间有存在一定的关系,有逻辑上的先后等,必须引进全局的结构体、变量来标记一些信息,全局的这些数据是不会被释放的,所以所有的任务可以去通过读、写这些数据来实现各个程序块交流信息,实现所谓的同步、 互斥。 这就是操作系统的原理, 而这些不同的通信方式按功能细分就成事件管理、内存管理啥玩意。有这些基本的管理就是一个只有内核操作系统了。配上文件系统、图形界面这些个模块功能就能做出想 Window 这样的东东。只有引入操作系统才能更好的写程序,才能让性能发挥到极致。具体到 uCOSII 也是这样: 首先是主函数, 然后是 OSInit(),这个函数就是对那些全局的数据结构初始化,建立希望的链表等数据结构,为后面全局变量通信做好准备,并且创建了 1-2个系统任务(空闲任务必须,统计任务可选),而所谓的创建任务 OSTaskCreate(另外在这个系统里还有个OSTaskCreateExt也是一种创建任务函数,只不过多了些检测栈、清楚栈的功
能而已)就是把一个函数,的函数地址、自己的栈建立联系、优先级啥弄好为任务切换做好准备。设置好定时切换的相关信息类似定时器,按照节拍在中断中进行任务切换判断、 发生切换, 这个时候还没有开启开关, 所以的任务创建完成后,启动多任务函数 OSStart(),这个函数是让 SP指到其中的一个站然后出栈就跳到一个任务函数里去了,接下来就是正常的任务运行了。
|
评分
-
查看全部评分
|