FreeRTOS创建静态函数

发布时间 2023-09-08 09:49:13作者: yiye_zhiqiu

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"

//开始任务
#define START_TASK_SIZE 120 //堆栈大小
#define START_TASK_PRIO 1 //优先级
StackType_t StartTaskStack[START_TASK_SIZE]; //堆栈是数组大小
StaticTask_t StartTaskTCB; //开始任务控制块
TaskHandle_t StartTask_Handle; //任务句柄
void start_task (void * pvparameters);

//创建任务1
#define TASK1_TASK_SIZE 120 //堆栈大小
#define TASK1_TASK_PRIO 1 //优先级
StackType_t Task1TaskStack[TASK1_TASK_SIZE];
StaticTask_t Task1TaskTCB; //开始任务控制块
TaskHandle_t Task1Task_Handle; //任务句柄
void task1_task (void * pvparameters);

//创建任务2
#define TASK2_TASK_SIZE 120 //堆栈大小
#define TASK2_TASK_PRIO 1 //优先级
StackType_t Task2TaskStack[TASK2_TASK_SIZE];
StaticTask_t Task2TaskTCB; //开始任务控制块
TaskHandle_t Task2Task_Handle; //任务句柄
void task2_task (void * pvparameters);

//空闲任务
static StaticTask_t IdleTaskTCB;
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];

 

void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, //空闲任务控制的任务控制块
                  StackType_t ** ppxIdleTaskStackBuffer, //空闲任务的堆栈
                  uint32_t * pulIdleTaskStackSize ) //堆栈任务的大小
{
    *ppxIdleTaskTCBBuffer = &IdleTaskTCB;
    *ppxIdleTaskStackBuffer = IdleTaskStack;
    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;

}

 

//定时器任务
static StaticTask_t TimerTaskTCB;
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH]; //软件定时器堆栈大小

void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, //空闲任务控制的任务控制块
                  StackType_t ** ppxTimerTaskStackBuffer, //空闲任务的堆栈
                  uint32_t * pulTimerTaskStackSize ) //堆栈任务的大小
{
    *ppxTimerTaskTCBBuffer = &TimerTaskTCB;
    *ppxTimerTaskStackBuffer = TimerTaskStack;
    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}


int main(void)
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
  delay_init(); //延时函数初始化
  uart_init(115200); //初始化串口
  LED_Init(); //初始化LED

  StartTask_Handle = xTaskCreateStatic( (TaskFunction_t) start_task, //开始任务
            (char *) "start_task", //名字
            (uint32_t) START_TASK_SIZE, //堆栈大小
            (void *) NULL,
            (UBaseType_t) START_TASK_PRIO, //优先级
            (StackType_t *) StartTaskStack, //任务堆栈
            (StaticTask_t *) &StartTaskTCB ) ; //控制块


  vTaskStartScheduler(); //开启任务调度
}

void start_task( void * pvParameters )
{
    //任务1
    Task1Task_Handle = xTaskCreateStatic( (TaskFunction_t) task1_task, //开始任务
              (char *) "task1_task",
              (uint32_t) TASK1_TASK_SIZE, //堆栈大小
              (void *) NULL,
              (UBaseType_t) TASK1_TASK_PRIO, //优先级
              (StackType_t *) Task1TaskStack,
              (StaticTask_t *) &Task1TaskTCB ) ; //控制块

    //任务2
    Task2Task_Handle = xTaskCreateStatic( (TaskFunction_t) task2_task, //开始任务
              (char *) "task2_task",
              (uint32_t) TASK2_TASK_SIZE, //堆栈大小
              (void *) NULL,
              (UBaseType_t) TASK2_TASK_PRIO, //优先级
              (StackType_t *) Task2TaskStack,
              (StaticTask_t *) &Task2TaskTCB ) ; //控制块

    vTaskDelete(StartTask_Handle);
}

void task1_task( void * pvParameters )
{
  char task1_num = 0;
  while(1)
  {
    task1_num ++;
    if(task1_num == 10)
    {
      printf("Task1 is Running %d\r\n",task1_num);
      vTaskDelete(Task1Task_Handle);
    }
    LED0 = ~LED0;
    vTaskDelay(1000);
    printf("Task1 is Running %d\r\n",task1_num);
  }
}

void task2_task( void * pvParameters )
{
  char task2_num = 0;
  while(1)
  {
    task2_num ++;
    LED0 = ~LED0;
    vTaskDelay(1000);
    printf("Task2 is Running %d\r\n",task2_num);
  }
}