文章目录


移植后的程序结构如下图:



本节的任务设计为:

  1. start_task():用来创建其他三个任务。
  2. led0_task ():控制 LED0 的闪烁,提示系统正在运行。
  3. led1_task ():控制 LED1 的闪烁。
  4. float_task():简单的浮点测试任务,用于测试 STM32F4 的 FPU 是否工作正常。

main.c

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

#define START_TASK_PRIO		1							//任务优先级
#define START_STK_SIZE 		128  						//任务堆栈大小
TaskHandle_t StartTask_Handler;							//任务句柄
void start_task(void *pvParameters);					//任务句柄

#define LED0_TASK_PRIO		2							//任务句柄
#define LED0_STK_SIZE 		50  						//任务堆栈大小
TaskHandle_t LED0Task_Handler;							//任务堆栈大小
void led0_task(void *pvParameters);						//任务函数

#define LED1_TASK_PRIO		3							//任务函数
#define LED1_STK_SIZE 		50  						//任务堆栈大小
TaskHandle_t LED1Task_Handler;							//任务句柄
void led1_task(void *pvParameters);						//任务句柄

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);		//设置系统中断优先级分组4	 	 
	delay_init();	    								//延时函数初始化	  
	uart_init(115200);									//初始化串口
	LED_Init();		  									//初始化LED
	
	//创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          					//开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           					//进入临界区
    //创建LED0任务
    xTaskCreate((TaskFunction_t )led0_task,     	
                (const char*    )"led0_task",   	
                (uint16_t       )LED0_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )LED0_TASK_PRIO,	
                (TaskHandle_t*  )&LED0Task_Handler);   
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);         
    vTaskDelete(StartTask_Handler); 					//删除开始任务
    taskEXIT_CRITICAL();            					//退出临界区
}

//LED0任务函数 
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0=~LED0;
        vTaskDelay(500);
    }
}   

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);
    }
}