九、FreeRTOS多任务创建的两种风格及任务启动流程

1、使用FreeRTOS进行多任务创建的时候一般有如下两种风格

(1)先创建好所有的任务,最后启动调度器开始多任务的调度

int main (void)
{
	/* 硬件初始化 */
	HardWare_Init(); 

	/* RTOS 系统初始化 */
	RTOS_Init(); 
    taskENTER_CRITICAL(); //进入临界区
    
	/* 创建任务 1,但任务 1 不会执行,因为调度器还没有开启 */
	RTOS_TaskCreate(Task1);
	/* 创建任务 2,但任务 2 不会执行,因为调度器还没有开启 */
	RTOS_TaskCreate(Task2);

	/* ......继续创建各种任务 */
	taskEXIT_CRITICAL(); //退出临界区

	/* 启动 RTOS,开始调度 */
	RTOS_Start(); 
	}

void Task1( void *arg ) 
{
	while (1){
		/* 任务实体,必须有阻塞的情况出现 */
	}
}

void Task1( void *arg )
{
	while (1){
		/* 任务实体,必须有阻塞的情况出现 */
	}
}

(2)先创建一个启动任务后立马开启调度器,然后在启动任务里面创建各种应用,最后启动任务把自己删除

int main (void)
{
	/* 硬件初始化 */
	HardWare_Init(); 

	/* RTOS 系统初始化 */
	RTOS_Init(); 

	/* 创建一个任务 */
	RTOS_TaskCreate(AppTaskCreate); 

	/* 启动 RTOS,开始调度 */
	RTOS_Start(); 
}

/* 起始任务,在里面创建任务 */
void AppTaskCreate( void *arg ) 
{
	/* 创建任务 1,然后执行 */
	RTOS_TaskCreate(Task1); 
	taskENTER_CRITICAL(); //进入临界区
 
	/* 当任务 1 阻塞时,继续创建任务 2,然后执行 */
	RTOS_TaskCreate(Task2);
	 
	/* ......继续创建各种任务 */

	/* 当任务创建完成,删除起始任务 */
	RTOS_TaskDelete(AppTaskCreate); 
	taskEXIT_CRITICAL(); //退出临界区
}

void Task1( void *arg ) 
{
	while (1){
		/* 任务实体,必须有阻塞的情况出现 */
	}
}

void Task2( void *arg ) 
{
	while (1){
		/* 任务实体,必须有阻塞的情况出现 */
	}
}

2、FreeRTOS的启动流程

(1)使用 xTaskCreate() 函数创建任务

为初始化内存的时候一旦调用创建任务 xTaskCreate()函数,FreeRTOS会自动进行内存的初始化。

(2)使用vTaskStartScheduler()函数开启调度

创建完任务后,我们需要开启调度器。

创建仅仅是把任务添加到系统中,还没真正调度,并且空闲任务也没实现,定时器任务也没实现,这些都是在开启调度函数vTaskStartScheduler()中实现的。

空闲任务不可以被挂起与删除,且其优先级必须是最低的。

空闲任务的优先级与堆栈大小都在 FreeRTOSConfig.h 中由用户定义。

(3)我们在临界区创建任务,所以任务只能在退出临界区后才能执行最高优先级任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值