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

posted @ 2026-09-21 23:31  心事不在脸上  阅读(9)  评论(0)    收藏  举报