FreeRTOS静态创建删除任务

FreeRTOS静态创建任务要点:首先要开启宏,然后定义空闲任务函数和定时器函数,其它的和动态创建流程基本类似,代码如下:

/*FreeRTOS
		静态情况下创建任务:
						1.修改宏   configSUPPORT_STATIC_ALLOCATION=1
						出现两个函数未定义:vApplicationGetIdleTaskMemory();   task.c  1839位置
						                   vApplicationGetTimerTaskMemory();     
            2.编写测试代码
             2.1创建开始任务框架
						 2.2 task1框架  task2框架
						
						 
*/	
						
//函数声明:
void start_task(void *a);
void task1(void *a);
void task2(void *a);					
//开始任务
TaskHandle_t		StartTask_Handler;//创建任务句柄
#define stacksize  128
#define task_prio   1						
StackType_t  start_task_BUf[stacksize];//任务堆栈大小
StaticTask_t  startTaskTCB;//任务控制块
						
						
//任务1
TaskHandle_t		Task_1_Handler;//创建任务句柄
#define Task_1_stacksize  128
#define Task_1_task_prio   2						
StackType_t  start_Task_1_BUf[stacksize];//任务堆栈大小
StaticTask_t  start_Task_1_TaskTCB;//任务控制块
TaskHandle_t		Task_1_Handler;//创建任务句柄

//任务2
TaskHandle_t		Task_2_Handler;//创建任务句柄
#define Task_2_stacksize  128
#define Task_2_task_prio   3						
StackType_t  start_Task_2_BUf[stacksize];//任务堆栈大小
StaticTask_t  start_Task_2_TaskTCB;//任务控制块		
TaskHandle_t		Task_2_Handler;//创建任务句柄
						
//空闲任务						
static  StackType_t   IdleTaskStack[configMINIMAL_STACK_SIZE];//在FreeRTOSConfig.h 中
static  StaticTask_t	idleTCB;
//定时器任务						
static  StackType_t   TimerTaskStack[configTIMER_TASK_STACK_DEPTH];//在FreeRTOSConfig.h 中
static  StaticTask_t	TimerTCB;					
//空闲任务所需内存
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, 
	                                  StackType_t **ppxIdleTaskStackBuffer, 
                                    uint32_t *pulIdleTaskStackSize )
{
	*ppxIdleTaskTCBBuffer=&idleTCB;
	*ppxIdleTaskStackBuffer=IdleTaskStack;
	*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;
	
}	
//空闲任务所需内存
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, 
	                                  StackType_t **ppxIdleTaskStackBuffer, 
                                    uint32_t *pulIdleTaskStackSize )
{
	*ppxIdleTaskTCBBuffer=&TimerTCB;
	*ppxIdleTaskStackBuffer=TimerTaskStack;
	*pulIdleTaskStackSize=configTIMER_TASK_STACK_DEPTH;
	
}	
						
//void vApplicationGetIdleTaskMemory();  
/*静态宏定义也需要创建任务
	此函数三个参数,任务buffer,任务堆栈数组,任务堆栈大小,
						*/

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	delay_init(168);					//初始化延时函数
	uart_init(115200);     				//初始化串口
	LED_Init();		        			//初始化LED端口
	LCD_Init();							//初始化LCD
	

 StartTask_Handler=xTaskCreateStatic(	(TaskFunction_t)start_task,
									                    (const char*    )"my test",
									                    (uint16_t       ) stacksize,
									                    (void*          )  NULL,
									                    (UBaseType_t    ) task_prio,
									                    (StackType_t *)start_task_BUf,
									                    (StaticTask_t * )&startTaskTCB );
 vTaskStartScheduler();          //开启任务调度
}

void start_task(void *a)
{
	
	taskENTER_CRITICAL();//进入任务临界区
	//创建任务1
	Task_1_Handler=xTaskCreateStatic(	  (TaskFunction_t)task1,
									                    (const char*    )"task1",
									                    (uint16_t       ) Task_1_stacksize,
									                    (void*          )  NULL,
									                    (UBaseType_t    ) Task_1_task_prio,
									                    (StackType_t *)start_Task_1_BUf,
									                    (StaticTask_t * )&start_Task_1_TaskTCB );
	//创建任务2																	
	Task_2_Handler=xTaskCreateStatic(	  (TaskFunction_t)task2,
									                    (const char*    )"task2",
									                    (uint16_t       ) Task_2_stacksize,
									                    (void*          )  NULL,
									                    (UBaseType_t    ) Task_2_task_prio,
									                    (StackType_t *)start_Task_2_BUf,
									                    (StaticTask_t * )&start_Task_2_TaskTCB );
  vTaskDelete(StartTask_Handler);//删除开始任务,
			/*必须将开始任务删除后才能运行,个人理解将其变成空闲任务
			*/
																			
			taskEXIT_CRITICAL();														
																			
}

//任务1函数
void task1(void *a)
{
	while(1)
	{
		LED0=~LED0;
		vTaskDelay(1000);
		printf("task1 running\r\n");
		
		
	}
}


//任务2函数
void task2(void *a)
{
	while(1)
	{
				LED1=~LED1;
		vTaskDelay(1000);
		printf("task2 running\r\n");
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值