FreeRTOS多任务
FreeRTOS 的“多任务”指多个任务实例被调度器管理。
FreeRTOS多任务实现方式1:
同一个任务函数进行多次任务创建xTaskCreate,仍然是多个任务实例。本质上也是实现多任务调度,只是单一任务函数的代码复用。
#include "FreeRTOS.h"
#include "task.h"
#include "board.h"
static const int task_led1 = 1;
static const int task_led2 = 2;
static const int task_led3 = 3;
static void TaskLed0(void *pvParameters)
{
int *piParameters;
piParameters = pvParameters;
while(1)
{
if(*piParameters == 1)
{
led_on(led0);
vTaskDelay(500);
led_off(led0);
vTaskDelay(500);
}
else if (*piParameters == 2)
{
led_on(led1);
vTaskDelay(500);
led_off(led1);
vTaskDelay(500);
}
else if (*piParameters == 3)
{
led_on(led2);
vTaskDelay(500);
led_off(led2);
vTaskDelay(500);
}
}
}
static void AppTaskCreate(void)
{
xTaskCreate(TaskLed0,
"Task_Led1",
256,
(void *)&task_led1,
5,
NULL);
xTaskCreate(TaskLed0,
"Task_Led2",
256,
(void *)&task_led2,
5,
NULL);
xTaskCreate(TaskLed0,
"Task_Led3",
256,
(void *)&task_led3,
5,
NULL);
}
int main(void)
{
borad_lowlevel_init();
board_init();
AppTaskCreate();
vTaskStartScheduler();
while (1)
{
};
}
void vAssertCalled(const char *file, unsigned long line)
{
(void) file;
(void) line;
taskDISABLE_INTERRUPTS();
for(; ;);
}
一个任务函数中完成多个任务,不是多任务调度,本质是单任务按顺序执行。当其中一个任务阻塞时,该任务后续的任务执行也会受影响。类型任务函数结构如下:
void app_task(void *p)
{
while (1) {
key_scan();
display_update();
uart_process();
vTaskDelay(pdMS_TO_TICKS(10));
}
}
FreeRTOS多任务实现方式2:
多个任务函数创建多次任务
#include "FreeRTOS.h"
#include "task.h"
#include "board.h"
typedef struct
{
led_desc_t *led;
uint32_t period;
}led_para_t;
static const led_para_t led_blink0 ={&led0,200};
static const led_para_t led_blink1 ={&led1,500};
static const led_para_t led_blink2 ={&led2,1000};
static void TaskLed(void *pvParameters)
{
led_para_t *parameter = pvParameters;
led_desc_t *led = parameter->led;
uint32_t period = parameter->period;
while(1)
{
led_on(*led);
vTaskDelay(period);
led_off(*led);
vTaskDelay(period);
}
}
static void AppTaskCreate(void)
{
xTaskCreate(TaskLed,
"Task_Led0",
256,
(void *)&led_blink0,
2,
NULL);
xTaskCreate(TaskLed,
"Task_Led1",
256,
(void *)&led_blink1,
3,
NULL);
xTaskCreate(TaskLed,
"Task_Led2",
256,
(void *)&led_blink2,
4,
NULL);
}
int main(void)
{
borad_lowlevel_init();
board_init();
AppTaskCreate();
vTaskStartScheduler();
while (1)
{
};
}
void vAssertCalled(const char *file, unsigned long line)
{
(void) file;
(void) line;
taskDISABLE_INTERRUPTS();
for(; ;);
}
浙公网安备 33010602011771号