• Freertos学习初识任务函数


    转自:http://blog.csdn.net/djjyi/article/details/6170025

    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 )

         {

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

         }

      }

  • 相关阅读:
    java.util.Arrays类详解
    爬虫
    学习Spring框架(一)
    JAVA的网络编程
    Thread直接调用run()和start()方法的区别
    JDK JRE JVM 区别
    TCP , HTTP, IP
    一些常用的端口
    PATH CLASSTH JAVA_HOME
    浅谈Linux内存管理机制
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007549.html
Copyright © 2020-2023  润新知