各位感兴趣的进来后,可别以为我已经是什么高手了,那说明我的题目把大家误导了,其实我是想写一个学习实时操作系统uc/os ii的日记,记下我的学习之路,当然这其中包含我的错误理解。以前看到的精辟文章都是各位在取得了小成,有了一定的心得,并经过实际检验之后,确认无误后共享给大家的。而我的打算是,只是记录自己短时间内的理解,错误是在长时间后方能得到纠正的,所以其中的错误想请大家指出,进而加快我的理解,学习的过程,这也是我的目的之一。另外就是希望和刚刚踏入,或有想法踏入嵌入式系统的朋友们一起讨论,共同进步。 我做过一段时间的硬件,控制器用的是51单片机,程序都是采用前后台的方式,还没有系统的开发过产品(还没有毕业呢)。最近看到arm的兴起,决定尝试一下,正好楼下实验室的一个哥们买了一块周立功的开发板,可一蹭一蹭,没有开发板估计我也懒得学,有了块板子,就来劲了。 因为有硬件的底子,我也没有去看arm控制器的介绍,首先把不上系统的例程序先跑了一遍,自己在把几个板子上具有的功能,融合起来,编了一个程序,稍微了解一下板子的功能。这次学习的重点不是这块,就敷衍了一下。首先声明这都是目前学习中我的个人理解,一定会有错误的,目的是希望大家指出。然后就向着期待已久的移植操作系统进发了,又怕又喜呀。先移例子,按照要求把source文件夹放在了software/ucos-II文件夹下,在这个文件夹下,存放得是系统移植的例子,其中有三个文件夹arm_pc,source,lpc2100是和系统移植相关的。 source中存放的是uc/os的源码, lpc2100中存放的是关于arm控制器的文件。这个文件夹中的代码应当是和具体的控制器直接相关的,应当是根据实际情况进行修改的。 第三个文件arm_pc中存放的是pc机上的一些应用程序经过修改的,没有仔细看,我觉得现在还用不着。 因为我是做硬件的,喜欢从本质上看到程序是怎么运行的,操作系统是如何工作的,这一点我觉得汇编程序最能体现程序运行的流程了。 我首先看了一下主函数,很简单, //void main (void) //change bu cmj int main (void) { PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */ OSInit(); /* Initialize uC/OS-II */ PC_DOSSaveReturn(); /* Save environment to return to DOS */ //del by cmj // PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */ RandomSem = OSSemCreate(1); /* Random number semaphore */ OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0); OSStart(); /* Start multitasking */ } 关于pc的函数我不感兴趣,我学习东西的过程是先总体浏览,不求很懂(能懂最好了),主程序中首先进行了操作系统初始化,然后创建了一个任务,最后启动了多任务运行环境。太简单了。再往下看创建的任务子函数TaskStart(),在这个函数中又创建了10个人物。这时浏览一遍后的感性认识。接下来通过看书,了解到在启动多任务环境前需要至少创建一个任务,我想TaskStart()任务就应该是这个原因放在了 OSStart()之前。 接着出现了困扰我几天的问题,到现在还是没明白。任务之间是如何切换的,操作系统何时退出当前任务,去寻找优先级最高的就绪的任务。查资料,网上询问。得到一个答案。中断级任务调度,和任务级调度。我的理解是当发生中断时,操作系统内核判断此时是否有更高优先级的就绪任务,有的话进行任务调度。任务级调度就是当前任务在执行过程中主动执行任务调度,将权力交给内核。 但是这个中断是怎么产生的呢,我又看到了时钟节拍的概念,时钟节拍(clock tick):P67页中说道时钟节拍是特定的周期性中断。有两种作用:这种周期性的定时中断一来为内核提供一个时间标准,例如某个任务要延时多长时间,可以通过纪录这种中断来完成(中断的时间是已知的,但应当是可更改的),二 为任务切换提供了时间片,任务之间的调度是按时完成的,就是在一个时钟节拍后来进行P68-P69中的图形说明了这一点。以前不明白每个任务是一个死循环,在每个程序中都有一个OSTimeDly(),这个函数是将任务挂起,将控制权交给内核,内核进行任务调度,从就续的任务中找到优先级最高的任务执行,这是一种调度。那么当一个低优先级任务在执行时,如果在等待一个信号,可能要等很长时间,那么内核不能一直在这里等待这个信号的到来,别的高优先级任务可能已经就绪,那么就需要进行任务调度,何时调度呢?这时就应该是时钟节拍所起到的作用,每一个时钟节拍到达后进入中断处理函数,进行任务调度。 所以总的理解应当是内核在每个时钟节拍到来时进行一次任务调度,这是大前提,使每个任务都有相同的权利执行相同的时间。有时个别任务在一个时钟节拍内早已完成,这时需要向内核提前交权,让内核进行任务调度。 到目前为止我的理解就是这样的,苦于周围无人探讨,遂发帖请大家指正。我将继续努力,我的目标是理解系统是如何工作的。
|