您的位置 首页 制造

Qsys与uC/OS-II学习笔记4:使命状况与作业机制

前面一个笔记我们已经可以轻松的使用EDS提供的HAL构建一个uC/OS-II的模板工程,在这个工程里,所有和移植有关的问题都不用我们操心,我们只要放心的去设计我们的应用程序便可。而一个最简单的uC

  前面一个笔记咱们现已能够轻松的运用EDS供给的HAL构建一个uC/OS-II的模板工程,在这个工程里,一切和移植有关的问题都不必咱们操心,咱们只需定心的去规划咱们的应用程序便可。而一个最简略的uC/OS-II工程也现已呈现在咱们面前,三个最基本的过程就能够完结一个咱们从前认为多么奇特的操作体系。可是,尽管咱们能够构建两个最基本的使命,但说实在话,咱们还没搞懂它究竟怎么作业的,依葫芦画瓢没有错,若能够搞清楚它的作业机理就更好了。

  先来回忆一下两个task,如下代码:

  /* Prints "Hello World" and sleeps for three seconds */

  void task1(void* pdata)

  {

  while (1)

  {

  printf("Hello from task1\n");

  OSTimeDlyHMSM(0, 0, 3, 0);

  }

  }

  /* Prints "Hello World" and sleeps for three seconds */

  void task2(void* pdata)

  {

  while (1)

  {

  printf("Hello from task2\n");

  OSTimeDlyHMSM(0, 0, 3, 0);

  }

  }

  两个task的代码简直千篇一律,他们都有自己的主循环while(1),而在while(1)里边都是先打印一串字符,然后调用uC/OS-II的使命延时函数。在打印成果上看,task1和task2的打印信息是不断的交织打印,没有哪个task会接连得到打印的时机,其奥妙就在于他们的使命延时是共同的。关于使命延时这儿先不做文章,下篇笔记再具体讨论,这儿咱们只做一个和使命延时有关的小小测验,将task2的使命延时函数注释,如下修正task2的函数:

  /* Prints "Hello World" and sleeps for three seconds */

  void task2(void* pdata)

  {

  while (1)

  {

  printf("Hello from task2\n");

  //OSTimeDlyHMSM(0, 0, 3, 0);

  }

  }

  从头编译软件工程,然后在硬件上在线运转,此刻咱们看到在Console中打印的字符串信息如图1所示。是不是很出乎咱们的预料,没错,这个测验中咱们便是要拿优先级低的task2来说事,在没有使命延时函数的task2中,尽管它的优先级没有task1高,但它却一向占有着CPU的操控权,这究竟怎么回事?确实是使命延时函数在作祟,本笔记先不深化,只需咱们先记住:使命延时的首要效果便是先把当时使命的CPU操控权开释,交给其他的优先级最高的安排妥当使命操控。该测验中,其实task1只是在刚发动体系的时分履行了一次,然后它调用使命延时函数将CPU操控权交出,这一交没联系,task2就赖着不还了,由于task2在运转过程中从头到尾没有调用使命延时,所以它将一向占用着CPU,当然了,这种状况可不是咱们期望看到的。

  

 

  图1

  当时两个task,每个task一般也都要有自己的while(1),好像大多数裸奔的MCU相同,这又是为什么?裸奔着的MCU一般都只要一个main函数中的while(1)操控着CPU的运用权,CPU的寄存器也供它独享。而uC/OS-II却要改动这一状况,如图2所示,每个使命都有自己的仓库和使命操控块,而CPU的操控权一般是轮流着运用的,话说“风水轮流转”嘛,也有这么点滋味。当某个使命占用CPU运用权时,CPU的寄存器天然也是它单独享受,它能够将当时仓库里边的数据对应搬移到CPU寄存器中履行,而其他的使命不管在此之前处于何种状况,都要把他们的数据存储中他们自家的仓库中;一旦当时使命完结作业或许由于某种体系答应的使命切换状况呈现,那么它就得乖乖的交出CPU运用权,把CPU寄存器中的当时数据搬回到自己的仓库中。究竟何时切换使命,何时抢占使命,这都由每个使命自己的使命操控块操纵着,他们不会越权抢占别人的CPU操控权,当然也不会答应别人随意的抢走归于自己的CPU操控权。uC/OS-II内部的使命切换说白了便是CPU操控权的切换以及相应的入栈出栈操作,可是这其间涉及到的比如使命优先权的轮换或许说使命裁定等问题的处理机制便是十分表现功力的当地,后续有时机也要好好讨论下这方面的议题。

  

 

  图2

  前面咱们谈到使命的切换,在同一时间不同的使命都处于不同的状况,运转着的使命必定只要一个,那么其他使命的状况都怎么?如图3所示,uC/OS-II把使命的状况划分为5种:即睡觉态使命、安排妥当态使命、运转态使命、被中止态使命和等候状况使命。这儿咱们先简略的将这5种状况罗列,并没有将他们之间的转化联系暗示处理,但各个不同状况之间的改变也都是经过必定的事情触发或许函数调用引起的。

  

 

  图3

  作者原著的《嵌入式实时操作体系uC/OS-II》一书中对这5种状况有如下描绘:安排妥当态意味着使命现已准备好,能够运转,但由于该使命的优先级比正在运转的使命优先级低,还暂时不能运转;运转态是指使命把握了CPU的运用权,正在运转;挂起态也称作等候状况使命,指使命在等候某一事情的产生(例如等候某外设I/O操作,等候某共享资源由暂不能运用变成能运用状况,等候守时脉冲的到来,或等候超时信号的到来以完毕现在的等候,等等);产生中止时,CPU供给相应的中止服务,本来正在运转的使命暂不能运转,就进入了被中止使命。

  就拿咱们前面罗列的实例来讲,当task1运转时,它处于运转态,task2就处于安排妥当态。而其他几种状况咱们暂时还没有触摸,后边遇到了再逐个议论。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/116038.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部