FreeRTOS之任务创建

1、 静态任务创建

1.1、 需要创建2个函数

static StaticTask_t Idle_Task_TCB;
static StackType_t Idle_Task_Stack[configMINIMAL_STACK_SIZE];
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 
								   StackType_t **ppxIdleTaskStackBuffer, 
								   uint32_t *pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer=&Idle_Task_TCB;
	*ppxIdleTaskStackBuffer=Idle_Task_Stack;
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
}
static StaticTask_t Timer_Task_TCB;
static StackType_t Timer_Task_Stack[configTIMER_TASK_STACK_DEPTH];
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, 
									StackType_t **ppxTimerTaskStackBuffer, 
									uint32_t *pulTimerTaskStackSize)
{
	*ppxTimerTaskTCBBuffer=&Timer_Task_TCB;
	*ppxTimerTaskStackBuffer=Timer_Task_Stack;
	*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;
}

1.2、 创建静态任务

#define LED15_TASK_STACK_SIZE 128
static StackType_t led16_task_stack[LED15_TASK_STACK_SIZE];
static StaticTask_t LED_Task_TCB;
static void task_led16_function (void * pvParameter)
{
	uint32_t led16_temp=0;
    (void)(pvParameter);
    while (true)
    {
		
        TOGGLE_LED16();
		led16_temp++;
		vPortEnterCritical();
		LOG_BLE("led16 %d\n",led16_temp);
		vPortExitCritical();
        vTaskDelay(500);
    }
}
    xTaskCreateStatic((TaskFunction_t	)task_led16_function,		
                                        (const char* 	)"LED16",		
                                        (uint32_t 		)LED15_TASK_STACK_SIZE,					
                                        (void* 		  	)NULL,				
                                        (UBaseType_t 	)4, 				
                                        (StackType_t*   )led16_task_stack,	
                                        (StaticTask_t*  )&LED_Task_TCB);	

2、创建动态任务

2.1、创建动态任务

static void task_led13_function (void * pvParameter)
{
	uint32_t led13_temp=0;
    (void)(pvParameter);
    while (true)
    {
		
        TOGGLE_LED13();
		led13_temp++;
		vPortEnterCritical();
		LOG_BLE("led13 %d\n",led13_temp);
		vPortExitCritical();
        vTaskDelay(1000);
    }
}
xTaskCreate(task_led13_function, "LED13", configMINIMAL_STACK_SIZE + 200, NULL, 2, &tasl_led13_handle);

3、总结

3.1、 静态创建任务需要全局的堆栈和全局的任务控制块,而动态创建任务通过自己申请内存作为堆栈和任务控制块。
3.2、 静态创建任务和动态创建任务的核心都是下面的两个函数:

prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL );/*初始化任务控制块和堆栈*/
prvAddNewTaskToReadyList( pxNewTCB );/* 添加到就绪列表中*/

3.3、 创建任务优先级不能比configMAX_PRIORITIES大。
//可使用的最大优先级
#define configMAX_PRIORITIES ( 32 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值