Chinaunix首页 | 论坛 | 博客
  • 博客访问: 70116
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-10 08:06
文章分类
文章存档

2015年(24)

我的朋友

分类: 嵌入式

2015-07-14 23:59:53

1.任务函数
  1.1. 任务函数介绍
   函数原型:void AaskFction(void *pvParameter)
   STaskFction: 是任务函数的名字,这个名字有用户自己定义。
   pvParameter: 任务函数传递的参数。
   每一个任务函数一般为是循环,想要退出本任务而不是结束整个系统就不能使用return语句。可以使用任务删除函数来结束本任务。
    任务函数的一般实现形式如下:
     void ATaskFction(void *pvParameter)
     {
              pvParameter = pvParameter;    
              /*
                *任务处于死循环中
                */
              for(;;)
              {
                       ........
               }

               /*
                 *如果任务跳出死循环,则要调用任务删除函数结束该任务,当传递给任务函数的参数为NULL时,表示删除当                     *前任务
                  */ 
               vTaskDelete(NULL);
       }
      1.2. 任务函数的状态
      任务函数就运行与否可以分为两种状态:运行状态和非运行状态(非运行状态可以细分为多种状态)

      任务由非运行状态转变为运行状态称为切入(switch in)或交换入(swap in)。
      
任务由运行状态转变为非运行状态称为切出(switch out)或切换出(swap out)。

2.  任务的创建
      2.1. 任务创建函数介绍 
      函数原型:xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask )
       pvTaskCode: 指向任务函数的指针。
       pcName
       usStackDepth:指定为任务分配的栈空间大小,大小以字为单位。比如usStackDepth为100,则栈空间分配的大小为100字,而不是字节。#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )这个宏是系统建议分配占空间的大小。
      
pvParameters:向任务函数传递的参数。
      uxPriority:指定任务的优先级。任务的优先级从0到configMAX_PRIORITIES - 1,优先级的值没有限制(受到数据类型和内存大小的限制),为了节省内存最好根据实际情况设置一个合适的值。
      pxCreatedTask :句柄将赋给该变量,在改变任务优先级,删除任务中等操作中都会用到句柄。如果没有用到句柄则可以将改变量设置为NULL。
      任务创建函数的返回值
     (1)pdTRUE,表明任务成功创建。

     (2)errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 
      创建任务的例子:
     

点击(此处)折叠或打开

  1. #include \"includes.h\"
  2. #include <stdio.h>
  3. #include \"usart.h\"


  4. void xDelay(void);
  5. void xtask1(void *pvParameter);
  6. void xtask2(void *pvParameter);

  7. int main()
  8. {
  9.    int ret = 0;
  10.    uart_init(9600);     //串口初始化为9600
  11.    NVIC_Configuration();// 设置中断优先级分组
  12.   
  13.    /*
  14.     *创建第一个任务
  15.     */
  16.     xTaskCreate(xtask1, //任务函数名
  17.                 \"task1\", //任务的文本名字,只有在调试时用到
  18.                 512, //为任务分配的栈空间大小
  19.                 NULL, //传递的任务参数为空
  20.                 1, //本任务的优先级
  21.                 NULL); //任务中不用句柄
  22.     xTaskCreate(xtask2, \"task2\", 512, NULL, 1, NULL);
  23.     /*
  24.      *启动任务调度器,开始执行任务
  25.      */
  26.     
  27.     vTaskStartScheduler();
  28.     /*
  29.      *一般任务不会执行到这个地方,可能是因为内存栈空间不足,无法为新的任务分配
  30.      *空间
  31.      */
  32.      while(1);
  33. }
  34. /***************************************
  35.  * 一个简单的延时函数
  36.  **************************************/
  37. void xDelay()
  38. {
  39.     int i;
  40.     for(i = 200; i--; i >= 0);
  41. }
  42. /****************************************
  43.  * 第一个任务函数
  44.  ***************************************/
  45.  void xtask1(void *pvParameter)
  46.  {    
  47.      int i;
  48.      const char *pcTaskName = \"Task1 is running\\n\";
  49.      //volatile unsigned long u1 = 0;
  50.      while(1)
  51.      {
  52.          printf(\"%s\\n\", pcTaskName);
  53.          vTaskDelay( 1 );
  54.      }
  55.  }
  56.  /****************************************
  57.   *          第二个任务函数
  58.   ***************************************/
  59.   void xtask2(void *pvParameter)
  60.   {    
  61.       int i;
  62.      const char *pcTaskName = \"Task2 is running\\n\";
  63.     
  64.      //volatile unsigned long u1 = 0;
  65.      while(1)
  66.      {
  67.      printf(\"%s\\n\", pcTaskName);
  68.      vTaskDelay( 1 );
  69.      }        
  70.   }
执行结果是
Task1 is running
Task2 is running
Task1 is running
Task2 is running
.......







阅读(1726) | 评论(0) | 转发(0) |
0

上一篇:linux复制功能

下一篇:freeRTOS的优先级

给主人留下些什么吧!~~