首先,freertos移植是第一步,野火、原子、普中都有介绍。
这里记录一下,使用freertos点亮两个led,两个led之间的运行不受影响,不必等待点亮第一个led后,再点亮第二个led,这样cpu的利用率更高,实时性强
其步骤包括:
1.优先级、堆栈大小、任务函数、任务句柄的声明与定义。
//优先级
#define START_TASK_PRIO 1
//堆栈大小
#define START_STK_SIZE 120
//任务函数
void start_task(void * pvParameters);
//任务句柄
TaskHandle_t StartTask_Handler;
//task1优先级
#define TASK1_TASK_PRIO 2
//task1堆栈大小
#define TASK1_STK_SIZE 120
//task1函数声明
void task1_task(void * pvParameters);
//task1任务句柄
TaskHandle_t Task1Task_Handler;
//task2优先级
#define TASK2_TASK_PRIO 3
//task2堆栈大小
#define TASK2_STK_SIZE 120
//task2函数声明
void task2_task(void * pvParameters);
//task2任务句柄
TaskHandle_t Task2Task_Handler;
与裸机的优先级不同,freertos下的优先级的数字越大,优先级越高
2、任务创建与调度
xTaskCreate((TaskFunction_t ) start_task,
(char * ) "start_task",
(uint16_t ) START_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t * ) &StartTask_Handler);
vTaskStartScheduler();//开启任务调度
3、创建子任务(task1 、task2)
void start_task(void * pvParameters)
{
//创建Task1
xTaskCreate((TaskFunction_t ) task1_task,
(char * ) "task1_task",
(uint16_t ) TASK1_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK1_TASK_PRIO,
(TaskHandle_t * ) &Task1Task_Handler);
//创建Task2
xTaskCreate((TaskFunction_t ) task2_task,
(char * ) "task2_task",
(uint16_t ) TASK2_STK_SIZE,
(void * ) NULL,
(UBaseType_t ) TASK2_TASK_PRIO,
(TaskHandle_t * ) &Task2Task_Handler);
vTaskDelete(StartTask_Handler);//删除任务,删除自身用NULL
}
3、子任务详细内容(由于上一步创建了任务,但任务执行需要具体化,这里对两个led亮灭的时间进行设置,延时需要freertos提供的vTaskDelay函数,否则无法进入任务的执行)
//任务1
void task1_task(void * pvParameters)
{
while(1)
{
//vTaskDelete(StartTask_Handler);
LED0=~LED0;
vTaskDelay(500);
}
}
// 任务2
void task2_task(void * pvParameters)
{
while(1)
{
LED1=0;
vTaskDelay(1000);
LED1=1;
vTaskDelay(1000);
}
}
学习小结:freertos执行多个任务的原理是:cpu同一时刻只能一个任务,但很短的一个时间内来回切换任务,造成可以在同一时刻执行多个任务的错觉。