Freertos任务的管理是何物?

这篇具有很好参考价值的文章主要介绍了Freertos任务的管理是何物?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Freertos任务管理


提示:文章来自正点原子和野火


前言

1.学会任务管理的目的

使用Freertos,创建任务,运行任务,必须知道怎么配置任务的状态,并将其修改运行的状态,做到想让哪个任务保证必须优先的情况下,也能保证其他任务的实时性。所以要知道任务有几种运行状态,还要知道怎么修改任务的状态。

说白了就是要设置任务的先运行,还是任务的后运行,任务等级 运行的时候还可以随意修改任务的状态,改为暂停或继续 任务启停:挂起和恢复,一个任务休息了 阻塞态应该继续执行哪一个任务就绪态—>运行态

2.需要掌握什么?

从函数使用的功能来说,有四个方面:
1.任务的优先级
2.任务的删除与恢复
3.任务的挂起与解挂
4.任务的阻塞


`

一、任务的四种状态

FreeRTOS 系统中的每一任务都有多种运行状态。系统初始化完成后,创建的任务就可
以在系统中竞争一定的资源,由内核进行调度。
任务状态通常分为以下四种:

  1. 运行态
    如果一个任务得到 CPU 的使用权,即任务被实际执行时,那么这个任务处于运行态。如果
    运行 RTOS 的 MCU 只有一个处理器核心,那么在任务时刻,都只能有一个任务处理运行态。
  2. 就绪态
    如果一个任务已经能够被执行(不处于阻塞态后挂起态),但当前还未被执行(具有相同优
    先级或更高优先级的任务正持有 CPU 使用权),那么这个任务就处于就绪态。
  3. 阻塞态
    如果一个任务因延时一段时间或等待外部事件发生,那么这个任务就处理阻塞态。例如任
    务调用了函数 vTaskDelay(),进行一段时间的延时,那么在延时超时之前,这个任务就处理阻塞
    态。任务也可以处于阻塞态以等待队列、信号量、事件组、通知或信号量等外部事件。通常情
    况下,处于阻塞态的任务都有一个阻塞的超时时间,在任务阻塞达到或超过这个超时时间后,
    即使任务等待的外部事件还没有发生,任务的阻塞态也会被解除。
    要注意的是,处于阻塞态的任务是无法被运行的。
  4. 挂起态
    任务一般通过函数 vTaskSuspend()和函数 vTaskResums()进入和退出挂起态与阻塞态一样,
    处于挂起态的任务也无法被运行。
运行态

二、 四种状态的关系图

Freertos任务的管理是何物?,Rtos,rtos

三、函数

vTaskSuspend();挂起任务

FreeRTOS 中的任务也可以进入暂停状态,唯一的方法是通过 vTaskSuspend 函数。函数原型如下:void vTaskSuspend( TaskHandle_t xTaskToSuspend );

vTaskResume() ;恢复被挂起的任务

挂起态→就绪态 : 把 一 个 挂 起 状态 的 任 务 恢复的 唯 一 途 径 就 是
调 用 vTaskResume() vTaskResumeFromISR() API 函数,

xTaskResumeFromISR();在中断中恢复被挂起的任务

vTaskDelay ();阻塞延时

阻塞延时的阻塞是指任务调用该延时函数后,任务会被剥离 CPU 使用权,然后进入阻塞状态,直到延时结束,任务重新获取 CPU 使用权才可以继续运行。在任务阻塞的这段时间,CPU 可以去执行其它的任务,如果其它任务也在延时状态,那么 CPU 就将运行空闲任务。

四、代码示例: 任务挂起和恢复

/******************************************************************************************************/
/*FreeRTOS配置*/

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128
TaskHandle_t    start_task_handler;
void start_task( void * pvParameters );

/* TASK1 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t    task1_handler;
void task1( void * pvParameters );

/* TASK2 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t    task2_handler;
void task2( void * pvParameters );

/* TASK3 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK3_PRIO         4
#define TASK3_STACK_SIZE   128
TaskHandle_t    task3_handler;
void task3( void * pvParameters );
/******************************************************************************************************/


/**
 * @brief       FreeRTOS例程入口函数
 * @param       无
 * @retval      无
 */
void freertos_demo(void)
{    
    xTaskCreate((TaskFunction_t         )   start_task,
                (char *                 )   "start_task",
                (configSTACK_DEPTH_TYPE )   START_TASK_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   START_TASK_PRIO,
                (TaskHandle_t *         )   &start_task_handler );
    vTaskStartScheduler();
}


void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();               /* 进入临界区 */
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",
                (configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK1_PRIO,
                (TaskHandle_t *         )   &task1_handler );
                
    xTaskCreate((TaskFunction_t         )   task2,
                (char *                 )   "task2",
                (configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK2_PRIO,
                (TaskHandle_t *         )   &task2_handler );
                
    xTaskCreate((TaskFunction_t         )   task3,
                (char *                 )   "task3",
                (configSTACK_DEPTH_TYPE )   TASK3_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK3_PRIO,
                (TaskHandle_t *         )   &task3_handler );
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();                /* 退出临界区 */
}

/* 任务一,实现LED0每500ms翻转一次 */
void task1( void * pvParameters )
{
    uint32_t task1_num = 0;
    while(1)
    {
        printf("task1_num:%d\r\n",++task1_num);
        LED0_TOGGLE();
        vTaskDelay(500);
    }
}

/* 任务二,实现LED1每500ms翻转一次 */
void task2( void * pvParameters )
{
    uint32_t task2_num = 0;
    while(1)
    {
        printf("task2_num:%d\r\n",++task2_num);
        LED1_TOGGLE();
        vTaskDelay(500);
    }
}

/* 任务三,判断按键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);
    }
}

总结

看图可以明白他们其中的关系,但不使用挂起函数的时候就不会有挂起态,任务只运行在其中的三种状态之中。文章来源地址https://www.toymoban.com/news/detail-557663.html

到了这里,关于Freertos任务的管理是何物?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [RTOS]rtthread,freeRTOS,uCOS等系统简单对比

    在上一篇《嵌入式操作系统浅谈》中,大概介绍了我自己再工作中使用到的如rt-thread,freeRTOS,uCOS,luatos等系统,在这一篇文章中,我简单说一下这些操作系统一些特点,还有就是我们平时的工作中什么场景下用哪种系统比较好。 csdn里面很多大神对上面的一些系统都做过了

    2023年04月15日
    浏览(27)
  • 【RTOS】快速体验FreeRTOS所有常用API(4)队列

    快速体验FreeRTOS所有常用API(1)工程创建 快速体验FreeRTOS所有常用API(2)任务管理 快速体验FreeRTOS所有常用API(3)同步与互斥 快速体验FreeRTOS所有常用API(4)队列 快速体验FreeRTOS所有常用API(5)信号量、互斥量 快速体验FreeRTOS所有常用API(6)事件组 快速体验FreeRTOS所有常

    2024年01月15日
    浏览(37)
  • 【RTOS】快速体验FreeRTOS所有常用API(1)工程创建

    快速体验FreeRTOS所有常用API(1)工程创建 快速体验FreeRTOS所有常用API(2)任务管理 快速体验FreeRTOS所有常用API(3)同步与互斥 快速体验FreeRTOS所有常用API(4)队列 快速体验FreeRTOS所有常用API(5)信号量、互斥量 快速体验FreeRTOS所有常用API(6)事件组 快速体验FreeRTOS所有常

    2024年01月20日
    浏览(38)
  • RTOS任务进行单元测试的4种策略

    https://www.beningo.com/4-tactics-to-unit-test-rtos-tasks/ 超过50%的嵌入式软件项目使用实时操作系统(RTOS)。不幸的是,使用RTOS会给使用现代开发技术(如测试驱动开发(TDD)、DevOps或自动测试)的开发者带来一些问题。例如,当开发者试图为他们的任务编写测试时,他们遇到的第一个

    2024年02月09日
    浏览(31)
  • 微控制器实时操作系统实践2了解RTOS任务

    超级循环编程范式通常是嵌入式系统工程师最先接触到的编程方法之一。用超级循环实现的程序有一个单一的顶层循环,在系统需要执行的各种功能之间循环。这些简单的while循环很容易创建和理解(当它们很小的时候)。在FreeRTOS中,任务与超级循环非常相似--主要区别在于

    2024年02月08日
    浏览(45)
  • RTOS 驱动开发篇-通过 RTOS 组件实现按键驱动-优化1

    一个好的驱动程序需要数据关系清晰、代码可复用性高,并且便于维护。 如在 RTOS 驱动开发篇-通过 RTOS 组件实现按键驱动1 中所述的那样,当前的按键驱动代码只是为了让大家熟悉按键驱动的基本原理。它存在下述问题: 代码复用性差。新建一个按键,需要改动较多代码。

    2023年04月16日
    浏览(35)
  • 韦东山老师 RTOS 入门课程(一)RTOS 介绍,熟悉裸机的汇编逻辑

    课程链接:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili 裸机:固定顺序执行。 中断:可以一直专心做循环里的事情,直到触发中断。也可以中断里设立 flag 在循环里检测执行,防止中断超时。 定时器:太多个任务的时候不

    2024年02月12日
    浏览(36)
  • RTOS官方文档学习

    一个程序可以只有任务、只有协程、二者都有,但不可以通过队列/信号量互相传递数据 任务之间可以互相独立 每个任务分配自己的堆栈,提高了RAM使用率 操作简单、按优先级抢占式执行 抢占容易导致重入(执行任务时被其他线程或进程调用了) 一般用于小型,RAM有限制的

    2024年02月11日
    浏览(39)
  • 单片机和RTOS

    单片机是一种集成了处理器、内存、输入输出接口和外围设备控制器等功能的微型计算机系统。它通常用于控制简单的嵌入式系统,如家电、汽车电子、工业控制等。单片机具有低功耗、低成本和高可靠性等特点。 而RTOS(Real-Time Operating System)是一种实时操作系统,专门设计

    2024年02月20日
    浏览(35)
  • 开源,是RTOS的解药?

    我们熟知的ThreadX开源了 上个月,有一个不起眼的新闻,却引发了嵌入式行业震动。微软宣布将Azure RTOS托管至Eclipse基金会,更名为Eclipse ThreadX,并过渡到开源模式。 彼时,嵌入式系统专家Jacob Beningo说:这是一个好消息,因为它将使嵌入式开发人员可以免费获得高质量的RTO

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包