3.1 任务挂起
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
3.2 任务解挂(任务中)
void vTaskResume( TaskHandle_t xTaskToResume );
3.3 任务解挂(中断中)
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume );
3.4 示例
#define TASK1_TASK_PRIO 3
#define TASK1_STK_SIZE 128
TaskHandle_t Task1Task_Handler;
void task1_task(void *pvParameters);
#define TASK2_TASK_PRIO 4
#define TASK2_STK_SIZE 128
TaskHandle_t Task2Task_Handler;
void task2_task(void *pvParameters);
void TIM5Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = 5000-1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 16800-1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM5,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x05;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
BaseType_t res;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
delay_init(168);
uart_init(115200);
TIM5Init();
res = xTaskCreate((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
if(pdPASS != res)
{
printf("task1_task create err!\r\n");
while(1);
}
res = xTaskCreate((TaskFunction_t )task2_task,
(const char* )"task2_task",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_TASK_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
if(pdPASS != res)
{
printf("task2_task create err!\r\n");
while(1);
}
vTaskStartScheduler();
}
void task1_task(void *pvParameters)
{
u8 uT1Count=0;
while(1)
{
uT1Count++;
printf("uT1Count is %d\r\n",uT1Count);
if(5 == uT1Count)
{
printf("Suspend Task2\r\n");
vTaskSuspend(Task2Task_Handler);
}
if(10 == uT1Count)
{
printf("Resume Task2\r\n");
vTaskResume(Task2Task_Handler);
}
if(15 == uT1Count)
{
printf("Suspend Task2\r\n");
vTaskSuspend(Task2Task_Handler);
}
vTaskDelay(1000);
}
}
void task2_task(void *pvParameters)
{
u8 uT2Count=0;
while(1)
{
uT2Count++;
printf("uT2Count is %d\r\n",uT2Count);
vTaskDelay(1000);
}
}
void TIM5_IRQHandler(void)
{
static u8 uTim5Count=0;
BaseType_t res;
BaseType_t YieldRequired;
if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)
{
uTim5Count++;
printf("uTim5Count is %d\r\n",uTim5Count);
if(uTim5Count == 20)
{
printf("Resume Task2 from ISR\r\n");
res = xTaskResumeFromISR(Task2Task_Handler);
if(res == pdTRUE)
{
portYIELD_FROM_ISR(YieldRequired);
}
}
}
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}