#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);
}
}