zoukankan      html  css  js  c++  java
  • UCOS 杂项 笔记

    1.  建立任务和建立数据队列  哪个先建立?

      经过试验得知,数据队列和任务的建立先后没有顺序,都可以正常运行.

    2.关于主函数的面试问题。

    主函数写法有:   int  main()    和void  main()

    int main()     表示该函数必须有返回值,即程序实现中一定要有return xx;字样
    void main()   表示函数不需要返回值,一定不能有return xx字样
                       否则程序编译都会出错

    如果括号里面还有个  “void” 意思就是空  ,即 函数没有参数。

    3.任务建立函数注意要点

    调试函数花费一上午时间,问题泽恩也找不到,原来是格式不对。

    OSTaskCreate(MyTask,(void*)0,&MyTaskStk(TASK_STK_SIZE-1),3);

    上面这个任务建立函数出问题了  ,怎么也找不到原因???????????

    仔细看是格式不对了,“【】”写成了“()”

    下面这个建立任务是正确的:

     OSTaskCreate(StartTask, (void *)0, &StartTaskStk[TASK_STK_SIZE-1], 0);

    4.void OSStatInit (void)

     

    #if OS_TASK_STAT_EN > 0
    void  OSStatInit (void)
    {
    #if OS_CRITICAL_METHOD == 3               
        OS_CPU_SR  cpu_sr;
    #endif   
       
       
        OSTimeDly(2);                         
        OS_ENTER_CRITICAL();
        OSIdleCtr    = 0L;                   
        OS_EXIT_CRITICAL();
        OSTimeDly(OS_TICKS_PER_SEC / 10);     
        OS_ENTER_CRITICAL();
        OSIdleCtrMax = OSIdleCtr;             
        OSStatRdy    = TRUE;
        OS_EXIT_CRITICAL();
    }
    #endif


       在OSStatInit一开始延迟时间为2时钟节拍里:

       第一,在就绪表中删除掉当前任务的就绪标志,这个当前任务也就是调用OSStatInt( )的用户编写的TaskStart()任务,这是用户创建的优先级最高的任务;

       第二,令OSTCBDly = ticks也就是这个任务要延迟ticks所代表的时间;

       第三,调用 OS_Sched( ),进行一次任务调度,在任务调度里找出优先级最高的任务,并进行任务切换,切换到现在的具有最高优先级的任务,使其运行。此时在任务调度的时候,TaskStart()任务又重新处于就绪状态,此时程序从OSTimeDly(2)中返回,接着执行下面下面的程序。执行完OSIdleCtr= 0L; 后,又进入一个延时程序OSTimeDly(OS_TICKS_PER_SEC / 10);  ,本程序是又延迟了100毫秒,在这100毫秒中,TaskStart()任务处于等待状态,因此在这100毫秒中执行的是Idle任务。Idle任务会不断给OSIdelCtr计数,从而100毫秒后OSIdelCtr记录的就是100毫秒内被增加的最大次数(在这一秒中没有其它任务高于Idle任务,所以结果是最大的)。100毫秒延迟结束后。TaskStart()任务重新就绪,获得cpu使用权,就执行OSIdleCtrMax = OSIdleCtr;    OSStatRdy = TRUE;此后程序结束。

       OSStatInit一开始延迟时间为2时钟节拍,用于保持与系统时钟的同步,因为延迟之后调用的第一个语句为“OSIdelCtr=0”,基本不用花费系统时间,然后就进入第二个语句OSTimeDly(OS_TICKS_PER_SEC);   相当于再次延迟1s;在这延迟的一秒中,Idle任务会不断给OSIdelCtr计数,从而1s后OSIdelCtr记录的就是1s内被增加的最大次数(在这一秒中没有其它任务高于Idle任务,所以结果是最大的)。

       在建立其他任务之前,必须调用OSStatInit()来确定用户的PC有多快。在一开始,OSStatInit()就将自身延时了两个时钟节拍,这样它就可以与时钟节拍中断同步。因此,OSStatInit()必须在时钟节拍启动之后调用;否则,用户的应用程序就会崩溃。当µC/OS-II调用OSStatInit()时,一个32位的计数器OSIdleCtr被清为0 ,并产生另一个延时,这个延时使OSStatInit()挂起。此时,uCOS-II没有别的任务可以执行,它只能执行空闲任务(µC/OS-II的内部任务)。空闲任务是一个无线的循环,它不断的递增OSIdleCtr。1秒以后,uCOS-II重新开始OSStatInit(),并且将OSIdleCtr保存在OSIdleMax中。所以OSIdleMax是OSIdleCtr所能达到的最大值。而当用户再增加其他应用代码时,空闲任务就不会占用那样多的CPU时间。OSIdleCtr不可能达到那样多的记数,如果用户程序每秒抚慰一次OSIdleCtr()。CPU利用率的计算由µC/OS-II 中的OSStatTask()函数来完成,这个任务每秒执行一次。而当OSStatRdy置为TRUE表示µC/OS-II将统计CPU的利用率。

       OSStatInit()将返回到TaskStart()。所有任务可以都由TaskStart()中建立,由于TaskStart()的优先级为0(最高),新任务建立后不进行任务调度。当所有任务都建立完成后,TaskStart()将进入无限循环之中。

    做嵌入式应用时,用户必须在第一个任务中打开时钟节拍中断。

    void ARMStartTimer(void)
    {
     //autoreload and start  m
     rTCON = 0x9;  
    }

  • 相关阅读:
    eval()
    promise
    console.log()和console.dir()、console.table()的区别
    SSM框架搭建+easyui增删改查
    虚成员
    关键字 explicit
    复制控制
    变量、静态变量
    关键字 extern
    关键字 static
  • 原文地址:https://www.cnblogs.com/locean/p/5455771.html
Copyright © 2011-2022 走看看