(三)创建任务

欢迎入群共同学习交流

一、静态任务使用步骤

(1)打开configSUPPORT_STATIC_ALLOCATION支持静态内存的宏
(2)使用xTaskCreateStatic函数创建静态任务
(3)实现vApplicationGetIdleTaskMemory函数获取空闲任务的信息

二、静态任务代码示例

#include "FreeRTOS.h"
#include "task.h"
#include "led.h"

void vAppInitTask(void* pParam);
TaskHandle_t appHandler;
StackType_t appTask[128];
StaticTask_t appTCB;

void vLedTask(void* pParam);
TaskHandle_t ledHandler;
StackType_t ledTask[128];
StaticTask_t ledTCB;

StaticTask_t IdleTCB;
StackType_t IdleTask[128];

//主函数
int main(void)
{  
    //初始化硬件
    led_init();
    
    //创建app任务
    appHandler = xTaskCreateStatic(vAppInitTask,        //任务函数
                                  "appTask",            //任务名称
                                  128,                  //任务堆栈大小
                                  NULL,                 //传递给任务函数的参数
                                  2,                    //任务优先级
                                  appTask,              //任务堆栈起始地址
                                  &appTCB               //任务控制块
                                  );
    if(NULL != appHandler){
        vTaskStartScheduler();//启动任务调度器
    }
    
    while(1);
}

//APP任务
void vAppInitTask(void* pParam)//APP初始化任务创建led任务
{
    taskENTER_CRITICAL();//进入临界区
    
    ledHandler = xTaskCreateStatic(vLedTask,            //任务函数
                                  "ledTask",            //任务名称
                                  128,                  //任务堆栈大小
                                  NULL,                 //传递给任务函数的参数
                                  2,                    //任务优先级
                                  ledTask,              //任务堆栈起始地址
                                  &ledTCB               //任务控制块
                                  );
    
    if(ledHandler != NULL){//创建成功
    }
    
    vTaskDelete(appHandler);//删除任务
    
    taskEXIT_CRITICAL();//退出临界区
}

//led任务
void vLedTask(void* pParam)
{
    while(1){
        open();
        vTaskDelay(1000);
        close();
        vTaskDelay(1000);
    }
}

//获取空闲任务信息
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,StackType_t ** ppxIdleTaskStackBuffer,uint32_t * pulIdleTaskStackSize ){
    *ppxIdleTaskTCBBuffer = &IdleTCB;
    *ppxIdleTaskStackBuffer = IdleTask;
    *pulIdleTaskStackSize = 128;
}

三、动态任务使用步骤

(1)打开configSUPPORT_DYNAMIC_ALLOCATION宏支持动态内存申请
(2)设置configTOTAL_HEAP_SIZE宏总的堆内存大小
(3)使用xTaskCreate函数创建动态任务

四、动态任务代码示例

#include "FreeRTOS.h"
#include "task.h"
#include "led.h"

void vAppInitTask(void* pParam);
void vLedTask(void* pParam);

TaskHandle_t ledHandler;
TaskHandle_t appHandler;

//主函数
int main(void)
{  
    //初始化硬件
    led_init();

    BaseType_t xReturn;
    xReturn = xTaskCreate(vAppInitTask,         //任务函数入口
                        "vAppInitTask",         //任务名称
                        512,                    //任务堆栈大小
                        NULL,                   //传递参数
                        2,                      //任务优先级
                        &appHandler             //任务句柄
                );
    
    if(pdPASS == xReturn){
        vTaskStartScheduler();      //开启任务调度器
    }
    
    while(1);
}

//APP任务
void vAppInitTask(void* pParam)//APP初始化任务创建led任务
{
    taskENTER_CRITICAL();//进入临界区
    
    xTaskCreate(vLedTask,           //任务函数入口
                "vLedTask",         //任务名称
                512,                //任务堆栈大小
                NULL,               //传递参数
                2,                  //任务优先级
                &ledHandler         //任务句柄
                );
    
    vTaskDelete(appHandler);
    
    taskEXIT_CRITICAL();//退出临界区
}

//led任务
void vLedTask(void* pParam)
{
    while(1){
        open();
        vTaskDelay(1000);
        close();
        vTaskDelay(1000);
    }
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值