FreeRTOS静态任务创建与删除

来源:互联网 发布:海王星股票交易软件 编辑:程序博客网 时间:2024/05/20 09:05
//空闲任务任务堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
//空闲任务控制块
static StaticTask_t IdleTaskTCB;
//空闲任务API函数
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer,
                                    StackType_t **ppxIdleTaskStackBuffer,
                                    uint32_t *pulIdleTaskStackSize )
{
    *ppxIdleTaskStackBuffer = IdleTaskStack;
    *ppxIdleTaskTCBBuffer   = &IdleTaskTCB;
    *pulIdleTaskStackSize   = configMINIMAL_STACK_SIZE;
}

//定时器任务任务堆栈
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
//定时器任务控制块
static StaticTask_t TimerTaskTCB;
//定时器任务API函数
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer,
                                     StackType_t **ppxTimerTaskStackBuffer,
                                     uint32_t *pulTimerTaskStackSize )
{
    *ppxTimerTaskStackBuffer = TimerTaskStack;
    *ppxTimerTaskTCBBuffer   = &TimerTaskTCB;
    *pulTimerTaskStackSize   = configTIMER_TASK_STACK_DEPTH;
}


#define START_TASK_PRIO 1       //任务优先级
#define START_STK_SIZE  128     //任务堆栈大小
StackType_t   Start_Task_Stack[START_STK_SIZE];  //任务堆栈
StaticTask_t  Start_Task_TCB;  //任务控制块
TaskHandle_t StartTask_Handle;  //开始任务句柄
void start_task( void * pvParameters );  //任务函数

#define TASK1_PRIO     2
#define TASK1_STK_SIZE 128
StackType_t Task1_Stack[TASK1_STK_SIZE];
StaticTask_t Task1_TCB;
TaskHandle_t Task1_Handle;
void task1(void * pvParameters);

#define TASK2_PRIO     3
#define TASK2_STK_SIZE 128
StackType_t Task2_Stack[TASK2_STK_SIZE];
StaticTask_t Task2_TCB;
TaskHandle_t Task2_Handle;
void task2(void * pvParameters);

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4     0-15一共16级优先级
    delay_init();                        //延时函数初始化      
    uart_init(115200);                    //初始化串口
    LED_Init();                              //初始化LED
    
    StartTask_Handle =  xTaskCreateStatic(    (TaskFunction_t) start_task,
                                            (char *        ) "start_task",
                                            (uint32_t      ) START_STK_SIZE,
                                            (void *        ) NULL,
                                            (UBaseType_t   ) START_TASK_PRIO,
                                            (StackType_t * ) Start_Task_Stack,
                                            (StaticTask_t *) &Start_Task_TCB );    
         
    vTaskStartScheduler();          //开启任务调度
}

//开始任务
void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();           //进入临界区
    //创建任务1
    Task1_Handle =  xTaskCreateStatic(        (TaskFunction_t)  task1,
                                            (char *        ) "task1",
                                            (uint32_t      ) TASK1_STK_SIZE,
                                            (void *        ) NULL,
                                            (UBaseType_t   ) TASK1_PRIO,
                                            (StackType_t * ) Task1_Stack,
                                            (StaticTask_t *) &Task1_TCB );

    //创建任务2
    Task2_Handle =  xTaskCreateStatic(        (TaskFunction_t)  task2,
                                            (char *        ) "task2",
                                            (uint32_t      ) TASK2_STK_SIZE,
                                            (void *        ) NULL,
                                            (UBaseType_t   ) TASK2_PRIO,
                                            (StackType_t * ) Task2_Stack,
                                            (StaticTask_t *) &Task2_TCB );    
    vTaskDelete(StartTask_Handle); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区                                            
}

//任务1
void task1(void * pvParameters)
{
    while(1)
    {
        LED0 = !LED0;
        vTaskDelay(500);
    }
}

//任务2
void task2(void * pvParameters)
{
    while(1)
    {
        LED1 = 0;
        vTaskDelay(500);
        LED1 = 1;
        vTaskDelay(1000);
    }
}
原创粉丝点击