加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

uc/os ii学习日记

时间:2013-09-08  来源:123485.com  作者:9stone

         各位感兴趣的进来后,可别以为我已经是什么高手了,那说明我的题目把大家误导了,其实我是想写一个学习实时操作系统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(),这个函数是将任务挂起,将控制权交给内核,内核进行任务调度,从就续的任务中找到优先级最高的任务执行,这是一种调度。那么当一个低优先级任务在执行时,如果在等待一个信号,可能要等很长时间,那么内核不能一直在这里等待这个信号的到来,别的高优先级任务可能已经就绪,那么就需要进行任务调度,何时调度呢?这时就应该是时钟节拍所起到的作用,每一个时钟节拍到达后进入中断处理函数,进行任务调度。
        所以总的理解应当是内核在每个时钟节拍到来时进行一次任务调度,这是大前提,使每个任务都有相同的权利执行相同的时间。有时个别任务在一个时钟节拍内早已完成,这时需要向内核提前交权,让内核进行任务调度。
         到目前为止我的理解就是这样的,苦于周围无人探讨,遂发帖请大家指正。我将继续努力,我的目标是理解系统是如何工作的。


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门