现在的位置: 首页 > 综合 > 正文

Freertos学习–初识任务函数

2014年08月29日 ⁄ 综合 ⁄ 共 3749字 ⁄ 字号 评论关闭

      FreeRTOS泛泛看了很多相关文章,有点头绪,除了不太喜欢其变量的名字,其他的倒还可以接受。先来认识一下Freertos任务函数,看看这个系统是怎么操作任务的。(以下例子大部分来自网络)

 

    1.任务创建

    signed portBASE_TYPE xTaskCreate(

    pdTASK_CODE pvTaskCode, --指向任务的入口函数

    const signed portCHAR * const pcName, --任务的名字

    unsigned portSHORT usStackDepth, --指定任务堆栈的大小 ,堆栈能保护变量的数目-

    void *pvParameters, --指针用于作为一个参数传向创建的任务

    unsigned portBASE_TYPE uxPriority, --任务的优先级

    xTaskHandle *pxCreatedTask )--用于传递一个处理

 

   例子:

    xTaskCreate( StarTask , ( signed portCHAR * ) "StarTask ", 128, NULL, tskIDLE_PRIORITY, NULL );

    我们先按任务创建函数设定好任务的入口名字StarTask ,任务名字StarTask ,堆栈大小128,优先级等,然后编写我们任务StarTask 的内容,下面就是任务StarTask函数:

    void StarTask (void *pvParameter)

    {}

  

    2.任务删除

       void vTaskDelete( xTaskHandle pxTaskToDelete )

       例子:

        void vOtherFunction( void )

     {

      xTaskHandle xHandle;

     // 创建任务,存储处理

     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // 使用处理来删除任务. 

     vTaskDelete( xHandle );

      }

       注:INCLUDE_vTaskDelete必须定义为1,这个函数才能可用

   3.任务延时

   void vTaskDelay( portTickType xTicksToDelay );

       例子:

        const portTickType xDelay = 1000/ portTICK_RATE_MS;

 注:INCLUDE_vTaskDelay必须设置为1,这个函数才为可用。

 

    4.任务延时--延时一个任务到指定时间

        void vTaskDelayUntil(

         portTickType *pxPreviousWakeTime, --指定一个变量来掌握任务最后开启的时间,                                  这个变量在第一次使用中(参考下面的例子)必须                                    使用当前时间来初始化

         portTickType xTimeIncrement );--循环周期时间。任务将在一定时间开启                               (*pxPreviousWakeTime + xTimeIncrement)

        例子:

  void vTaskFunction( void * pvParameters )

      注:INCLUDE_vTaskDelayUntil 必须定义为1,此函数才能用。

      5.获取任务优先级

     unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );

    7.任务挂起或暂停

        void vTaskSuspend(

        xTaskHandle pxTaskToSuspend ); --处理需要挂起的任务。传递NULL将挂起调用此函数的任务。

 

    例子:

 void vAFunction( void )

 {

 xTaskHandle xHandle;

     // 创建任务,保存句柄

     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // ...

     // 使用此句柄来挂起创建的任务

     vTaskSuspend( xHandle );

     // ...

     // 创建的任务不会在这期间运行,除非

     // 其他任务调用 vTaskResume( xHandle )

     //...

     // 挂起自己

     vTaskSuspend( NULL );

     // 不能运行到这里,除非另一个任务调用vTaskResume

  }

 

注:设置INCLUDE_vTaskSuspend 为1,此函数才能使用。

   8.任务恢复

  void vTaskResume( xTaskHandle pxTaskToResume );

    9.启动内核

        void vTaskStartScheduler( void );

       必须是调用 vTaskSuspend () 后挂起的任务,才有可能通过调用 vTaskResume ()重新运行。

     

     例子:

 

注:设置INCLUDE_vTaskSuspend为1,此函数才能使用。

 void vAFunction( void )

 {

    xTaskHandle xHandle;

     // 创建任务,保存句柄

     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // ...

     // 使用此句柄来挂起创建的任务

     vTaskSuspend( xHandle );

     // ...

     // 创建的任务不会在此期间运行,除

     // 另外一个任务调用 vTaskResume( xHandle )

     //...

     // 唤醒自己

     vTaskResume( xHandle );

  }

 

 

       例子:

 

      注:设置INCLUDE_vTaskPriorityGet 为1,此函数才能用。

 6.设置任务优先级

 

 

       void vTaskPrioritySet(

       xTaskHandle pxTask, --需要设置优先级的任务。当传递NULL,将设置调用任务的优先级

       unsigned portBASE_TYPE uxNewPriority );--任务需要设置的优先级

    例子: 

 void vAFunction( void )

 {

 xTaskHandle xHandle;

     // 创建任务,准备处理

     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // 使用其句柄来提高创建任务的优先级

     vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );

     // 使用NULL处理,来提高优先级到同一个值

     vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );

 }

注:设置INCLUDE_vTaskPrioritySet为1,才能使用此函数

 

 

 

 

 {

  portTickType xLastWakeTime;

  const portTickType xFrequency = 10;

 

     // 使用当前时间 初始化xLastWakeTime 变量

     xLastWakeTime = xTaskGetTickCount();

 

     for( ;; )

     {

         // 等待下一个循环

         vTaskDelayUntil( &xLastWakeTime, xFrequency );

          // 执行区域

     }

 }

 

       for( ;; )

     {

         /* 简单的每 500ms触发LED, .在每两次触发间挂起*/

         vONLED();

         vTaskDelay( xDelay );

     }

xTicksToDelay 是指延时的时间片个数,

 void vAFunction( void )

 {

     xTaskHandle xHandle;

     // 创建任务,准备处理 

     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

 

 

     // / 使用 tskIDLE_PRIORITY创建, 但是可能改

 

     if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )

     {

         // 任务已经改变了其优先级

     }

  }

抱歉!评论已关闭.