FreeRTOS实时操作系统(三)任务挂起与恢复

系列文章

FreeRTOS实时操作系统(一)RTOS的基本概念

FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库)

FreeRTOS实时操作系统(三)任务挂起与恢复

FreeRTOS实时操作系统(四)中断任务管理

FreeRTOS实时操作系统(五)进入临界区、任务调度器挂起与恢复

FreeRTOS实时操作系统(六)列表与列表项

FreeRTOS实时操作系统(七)时间片调度及RTOS的滴答定时器

FreeRTOS实时操作系统(八)任务状态查询及时间统计函数

FreeRTOS实时操作系统(九)时间延时函数及消息队列

FreeRTOS实时操作系统(十)信号量

FreeRTOS实时操作系统(十一)队列集

FreeRTOS实时操作系统(十二)事件标志组

FreeRTOS实时操作系统(十三)任务通知

FreeRTOS实时操作系统(十四)软件定时器

FreeRTOS实时操作系统(十五)Tickless低功耗模式

FreeRTOS实时操作系统(十六)内存管理



前言

继续跟着正点原子学习FreeRTOS之任务挂起与恢复


任务挂起与恢复

挂起任务类似暂停任务,不是删除任务。

利用的API函数:
挂起任务:vTaskSuspend()
恢复被挂起的任务:vTaskResume()
在中断中恢复被挂起的任务:xTaskResumeFromISR() (一般带FromISR后缀是在中断函数中专用的API函数)

1.任务挂起:

void vTaskSuspend(TaskHandle_t xTaskToSuspend) 

传回的参数是任务句柄,当是NULL时,挂起当前正在运行的任务。

使用时需将宏 INCLUDE_vTaskSuspend 配置为1。

无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复 。

在这里插入图片描述
在默认生成的HAl库中是打开的。

2.任务恢复:

void vTaskResume(TaskHandle_t xTaskToResume) 

传回参数是待恢复的任务句柄,任务即使被 vTaskSuspend() 挂起多次,只需在任务中调用 vTakResume() 一次,就可以继续运行,且被恢复的任务会进入就绪态。

使用时,宏INCLUDE_vTaskSuspend必须定义为 1

3.中断中任务恢复:

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)  

参数是待恢复任务的句柄

返回值:

pdTRUE任务恢复后需要进行任务切换
pdFALSE任务恢复后不需要进行任务切换

任务切换是指恢复的任务优先级比目前的高,需要调用一个函数来实现抢占。

使用时需要将宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须定义为1,HAl库不知道为啥要放在FreeRTOS.h文件,现在还不是很懂。
在这里插入图片描述

中断服务程序中要调用freeRTOS的API函数,中断优先级不能高于FreeRTOS所管理的最高优先级

普通挂起恢复实例

使用起来很简单:

/* 任务三,判断按键KEY0,按下KEY0删除task1 */
void task3( void * pvParameters )
{
    uint8_t key = 0;
    while(1)
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            printf("挂起task1\r\n");
            vTaskSuspend(task1_handler);
        }else if(key == KEY1_PRES)
        {
            printf("在任务中恢复task1\r\n");
            vTaskResume(task1_handler);
        }
        vTaskDelay(10);
    }
}

中断恢复实例

注意1:
在这里插入图片描述
上面是FreeRTOS管理的优先级,我们使用的外部中断要比5-15数值之间,优先级上看是小于等于FreeRTOS管理的最高优先级。
官网说明链接:在 ARM Cortex-M Core 上运行 RTOS
在这里插入图片描述

注意2:
在官网中说明了:
在这里插入图片描述
HAl库中,自动就是设置对的:
在这里插入图片描述
下面以正点原子的程序为例子:

void extix_init(void)
{
    GPIO_InitTypeDef gpio_init_struct; 
    key_init();    
    gpio_init_struct.Pin = KEY2_INT_GPIO_PIN;
    gpio_init_struct.Mode = GPIO_MODE_IT_FALLING;            /* 下降沿触发 */
    gpio_init_struct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY2_INT_GPIO_PORT, &gpio_init_struct);    /* KEY2配置为下降沿触发中断 */
    HAL_NVIC_SetPriority(KEY2_INT_IRQn, 5, 0);               /* 抢占5,子优先级0 */
    HAL_NVIC_EnableIRQ(KEY2_INT_IRQn);                       /* 使能中断线2 */
}

/**
 * @brief       中断服务程序中需要做的事情
                在HAL库中所有的外部中断服务函数都会调用此函数
 * @param       GPIO_Pin:中断引脚号
 * @retval      无
 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    delay_ms(20);      /* 消抖 */
    switch(GPIO_Pin)
    {
        BaseType_t xYieldRequired;//重点
        case KEY2_INT_GPIO_PIN:
            if (KEY2 == 0)
            {
                xYieldRequired = xTaskResumeFromISR(task1_handler);//重点
                printf("在中断中恢复task1\r\n");//重点
                portYIELD_FROM_ISR(xYieldRequired);//重点
             }
            break;
        default : break;
    }
}

用的是按键外部中断的例子,需要注意的是外部中断初始化的时候,中断优先级设置的是5。

这里需要注意,我们需要对返回值判断是否需要切换任务,但是无需我们自己判断:
在这里插入图片描述
如上图所示portYIELD_FROM_ISR()函数会自己判断当前值,是否执行任务切换。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS是一个开源的实时操作系统,它的设计原则是小巧、高效、可移植。FreeRTOS是一个基于事件驱动的实时操作系统,它的核心思想是将任务分成若干个独立的线程,每个线程都有自己的任务处理函数和优先级,系统根据优先级动态地分配CPU时间片,从而实现了多任务并发执行的功能。 FreeRTOS的核心部分包括任务调度器、内存管理、时间管理和同步机制等。任务调度器是FreeRTOS的核心,它负责管理任务的创建、删除、挂起恢复和切换等操作。内存管理模块负责管理系统内存的分配和释放,时间管理模块负责提供系统时钟和定时器功能,同步机制包括信号量、互斥锁和消息队列等,用于实现任务之间的同步和通信。 FreeRTOS任务有两种状态:就绪态和阻塞态。就绪态表示任务已经准备好被调度执行,阻塞态表示任务由于等待某些条件的满足而暂时停止执行。FreeRTOS支持多种调度算法,包括抢占式调度和协作式调度。抢占式调度是指系统中高优先级任务可以强制抢占低优先级任务的CPU时间片,协作式调度是指任务自行放弃CPU控制权,让其他任务执行。 FreeRTOS的优点包括:小巧、高效、可移植、支持多种处理器架构、易于使用和扩展、提供丰富的示例代码和文档等。因此,它被广泛应用于嵌入式系统、物联网、工业控制等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值