This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TI-RTOS 怎么删除任务?

Other Parts Discussed in Thread: CC2640

请问各位大神,任务删除怎么使用的???

工程包含主任务(优先级1),两个子任务(优先级2, A任务先创建,B任务不创建),两个子任务同一时间只能存在一个,代码如下,想要运行A任务时删除B任务;运行B任务时删除A任务,AB任务的切换采用外部按钮事件。

采用下面的代码,A -> B -> A就挂掉了!!!

请问是我的写法有问题?正确的应该是怎么做?

//////////////////////////////////////////////////////////////////////////////////////////////////////
// 主任务:
Void mainFxn(UArg arg0, UArg arg1)
{	
	// A任务
	Task_Params_init(&taskFuncAppParams);
	taskAParams.stackSize = TASKSTACKSIZE;
	taskAParams.stack = &taskAStack;
	taskAParams.priority = 2;
	Task_construct(&taskAStruct, (Task_FuncPtr)TaskAFxn, &taskAParams, NULL);
	
	// B任务,参数设置先不创建
	Task_Params_init(&taskBParams);
	taskBParams.stackSize = TASKSTACKSIZE;
	taskBParams.stack = &taskBStack;
	taskBParams.priority = 2;
	// Task_construct(&taskBStruct, (Task_FuncPtr)TaskBFxn, &taskBParams, NULL);
	
	// 创建事件,以便发生外部按键中断时通知按键任务
	Event_Params  eventParams;
	Event_Params_init(&eventParams);
	myEventHandle = Event_create(&eventParams,NULL);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
// 任务A
static Void TaskAFxn(UArg arg0, UArg arg1)
{
	UInt eventId = 0;
	UInt key;
	
    while (1) {
        Task_sleep((UInt)arg0);
		
		eventId = Event_pend(myEventHandle,
							 Event_Id_NONE,
							 Event_Id_00|Event_Id_01,
							 10000);
		
		if(eventId == Event_Id_00 )
		{
			// 创建B任务
			Task_Params_init(&taskBParams);
			taskBParams.stackSize = TASKSTACKSIZE;
			taskBParams.stack = &taskBStack;
			taskBLParams.priority = 2;
			Task_construct(&taskBStruct, 
								   (Task_FuncPtr)TaskBFxn, 
								   &taskBParams, 
								   NULL);
			
			break;
		}
		if( eventId == Event_Id_01 )
		{
		  	
		}
    }
	// 删除A任务
	Task_destruct(&taskAStruct);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
// 任务B
static Void TaskBFxn(UArg arg0, UArg arg1)
{
	UInt eventId = 0;
	UInt key;

    while (1) {
        Task_sleep((UInt)arg0);

		eventId = Event_pend(myEventHandle,
							 Event_Id_NONE,
							 Event_Id_00|Event_Id_01,
							 10000);
		
		if(eventId == Event_Id_00 )
		{
			
		}
		if( eventId == Event_Id_01 )
		{
			// 创建A任务
			Task_Params_init(&taskAParams);
			taskAParams.stackSize = TASKSTACKSIZE;
			taskAParams.stack = &taskAStack;
			taskAParams.priority = 2;
			Task_construct(&taskAStruct, 
								   (Task_FuncPtr)TaskAFxn, 
								   &taskAParams, 
								   NULL);
			break;
		}
    }
	// 删除B任务
	Task_destruct(&taskBStruct);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////
// 外部按钮事件
void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId) {
  	CPUdelay(8000*50);
    uint32_t eventId = Event_Id_NONE;
	if (!PIN_getInputValue(pinId)) {
        switch (pinId) {
            case Board_BUTTON0:
                eventId |= Event_Id_00;
                break;

            case Board_BUTTON1:
		eventId |= Event_Id_01;
                break;

            default:
                /* Do nothing */
                break;
        }
    }

    if(eventId)
    {
        Event_post(myEventHandle,eventId);    
    }
}