FreeRTOS学习(一) 任务的创建和删除

声明及感谢: 跟随正点原子资料学习, 在此作为学习的记录和总结
环境 keil , stm32f103
1. 任务的创建 :
创建任务的方法有三种:
(1) 动态创建:
xTaskCreate();
使用此xTaskCreate函数 需配置 configSUPPORT_DYNAMIC_ALLOCATION 宏定义为1

	// 创建开始任务
    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();          // 开启任务调度

(2)静态创建
xTaskCreateStatic();
与动态创建方法相同 也需要配置一个宏定义.
configSUPPORT_STATIC_ALLOCATION 为1
当配置configSUPPORT_STATIC_ALLOCATION 宏定义为1后编译,会出现
两个错误,
消除此错误需要自己实现两个函数

// 空闲任务堆栈
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];
// 空闲任务控制块
static StaticTask_t IdleTaskTCB;

// 定时服务任务堆栈
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];
// 定时器服务任务控制块
static StaticTask_t TimerTaskTCB;

// 获取空闲任务无地任务堆栈和任务控制块内存, 函数
// ppxIdleTaskTCBBuffer : 任务控制块内存
// ppxIdleTaskStackBuffer 任务堆栈内存
// pulIdleTaskStackSize 任务堆栈大小
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer = &IdleTaskTCB;
	*ppxIdleTaskStackBuffer = IdleTaskStack;
	*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}	
					
// 获取定时器服务任务的任务堆栈和任务控制块内存
// ppxTimerTaskTCBBuffer: // 任务控制块内存
// ppxTimerTaskStackBuffer: // 任务堆栈内存
// pulTimerTaskStackSize: // 任务堆栈大小
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 
									StackType_t **ppxTimerTaskStackBuffer, 
									uint32_t *pulTimerTaskStackSize)
{
	*ppxTimerTaskTCBBuffer=&TimerTaskTCB;
	*ppxTimerTaskStackBuffer=TimerTaskStack;
	*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}	

// 创建任务
	StartTask_Handler=xTaskCreateStatic((TaskFunction_t	)start_task,		// 任务函数
									                              (const char* 	)"start_task",		// 任务名称
										                           (uint32_t 		)START_STK_SIZE,	// 任务堆栈大小
									                             	(void* 		  	)NULL,				// 传递给任务函数的参数
									                              	(UBaseType_t 	)START_TASK_PRIO, 	// 任务优先级
									                               	(StackType_t*   )StartTaskStack,	// 任务堆栈
									                            	(StaticTask_t*  )&StartTaskTCB);	// 任务控制块             
    vTaskStartScheduler();          // 开启任务调度

(3) 使用xTaskCreateRestricted()函数创建任务

xTaskCreateRestricted 此函数也是用来创建任务的,只不过此函数要求所使用的MCU有MPU(内存保护单元),用此函数创建的任务会受到MPU的保护, 其他的功能和xTaskCreate()一样

2. 任务的创建 :

vTaskDelete(StartTask_Handler); // 删除任务 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值