Freertos学习--初识任务函数

转自:http://blog.youkuaiyun.com/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 )

     {

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

     }

  }

 

### 实现基于 STM32F103C8T6 和 FreeRTOS 的延时功能 在嵌入式开发中,FreeRTOS 提供了一种轻量级的操作系统解决方案,适用于资源受限的微控制器。对于 STM32F103C8T6 平台,可以通过配置 FreeRTOS 来实现任务调度和时间管理等功能。以下是结合 STM32F103C8T6 标准库与 FreeRTOS 实现延时函数的具体方法。 #### 1. 配置 FreeRTOS 环境 为了使 FreeRTOS 能够正常运行于 STM32F103C8T6 上,需完成以下初始化工作: - **移植层设置**:确保 `port.c` 和 `portmacro.h` 文件已适配至 Cortex-M3 架构。 - **时钟源配置**:通过标准库配置 SysTick 或其他定时器作为 RTOS 时间基准[^1]。 SysTick 是 ARM Cortex-M3 内部集成的一个简单计数器模块,默认用于提供操作系统的时间片支持。如果使用标准库,则需要手动调用相关 API 初始化硬件资源。 #### 2. 创建任务并引入 vTaskDelay 函数 FreeRTOS 中提供了多种方式来处理延迟操作,其中最常用的是 `vTaskDelay()` 方法。此函数允许当前执行线程进入阻塞状态直到指定时间段结束为止。下面是一个简单的例子展示如何创建两个独立的任务并通过它们之间的交互体现延时效果: ```c #include "stm32f1xx_hal.h" #include "FreeRTOS.h" #include "task.h" void TaskA(void *pvParameters); void TaskB(void *pvParameters); int main(void){ HAL_Init(); /* Initialize peripherals here */ xTaskCreate(TaskA, "TASK_A", configMINIMAL_STACK_SIZE + 100, NULL, tskIDLE_PRIORITY + 1, NULL ); xTaskCreate(TaskB, "TASK_B", configMINIMAL_STACK_SIZE + 100, NULL, tskIDLE_PRIORITY + 1, NULL ); vTaskStartScheduler(); while(1){}; } // Example task A which waits for some ticks before printing message. void TaskA(void* pvParameters){ TickType_t xLastWakeTime; const portTickType xFrequency = pdMS_TO_TICKS(500); xLastWakeTime = xTaskGetTickCount(); for (;;){ printf("Task A Running\n"); // Wait until next cycle based on frequency defined above. vTaskDelayUntil(&xLastWakeTime ,xFrequency ); } } // Another example showing different delay period than previous one. void TaskB(void* pvParameters){ for (;;) { printf("Task B Running Every Second \n"); // Block this task from running again immediately by delaying it. vTaskDelay(pdMS_TO_TICKS(1000)); } } ``` 上述代码片段展示了两个不同周期的任务定义过程,并利用了 `vTaskDelay()` 及其变体形式 `vTaskDelayUntil()`. 这两种机制都可以有效地控制程序流程中的等待间隔,从而简化多线程环境下的同步逻辑设计. #### 3. 关键点说明 - **优先级设定**: 不同任务间应分配合理的优先级别以满足实际需求场景的要求; - **堆栈大小调整**: 根据具体应用负载情况合理规划每项工作的所需内存空间长度; - **错误检测机制构建**: 添加必要的异常捕获手段以便及时发现潜在隐患问题; --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值