03 FreeRTOS - 任务挂起与解挂API

3.1 任务挂起

/*********************************************************************************
* 函数名: xTaskToSuspend
* 功能:   任务挂起
* 输入:   xTaskToSuspend[要挂起的任务句柄]
* 输出:   无
*********************************************************************************/ 
void vTaskSuspend( TaskHandle_t xTaskToSuspend );

3.2 任务解挂(任务中)

/*********************************************************************************
* 函数名: vTaskResume
* 功能:   恢复挂起的任务
* 输入:   xTaskToDelete[任务句柄]
* 输出:   无
* 备注:   不能在中断中调用
*********************************************************************************/ 
void vTaskResume( TaskHandle_t xTaskToResume );

3.3 任务解挂(中断中)

/*********************************************************************************
* 函数名: xTaskResumeFromISR
* 功能:   恢复挂起的任务
* 输入:   xTaskToDelete[任务句柄]
* 输出:   pdTRUE[恢复后要马上进行任务切换]
*         pdFALSE[恢复后继续运行原任务]
* 备注:   中断中调用
*********************************************************************************/ 
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);    //使能TIM5时钟
        
    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);    //初始化TIM5
    
    TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);             //允许定时器5更新中断
    TIM_Cmd(TIM5,ENABLE);                                 //使能定时器5
    
    NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;         //定时器5中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x05;     //抢占优先级5
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00;         //子优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


int main(void)
{
    BaseType_t res;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //设置系统中断优先级分组4
    delay_init(168);                    //初始化延时函数
    uart_init(115200);                     //初始化串口
    TIM5Init();
    
    //创建TASK1任务
    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);
    }
                
    //创建TASK2任务
    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();          //开启任务调度
}


//task1任务函数
void task1_task(void *pvParameters)
{
    u8 uT1Count=0;
    while(1)
    {
        uT1Count++;      // 任务执1行次数加1
        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); // 延时1s,也就是1000个时钟节拍    
    }
}

//task2任务函数
void task2_task(void *pvParameters)
{
    u8 uT2Count=0;
    while(1)
    {
        uT2Count++;      //任务2执行次数加1 注意task1_num2加到255的时候会清零!!
        printf("uT2Count is %d\r\n",uT2Count);
        vTaskDelay(1000); //延时1s,也就是1000个时钟节拍    
    }
}

//定时器5中断服务函数
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);  //清除中断标志位
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值