freeRTOS学习 — 任务的创建与管理

2023-05-16

1、freeRTOS的任务

(1)任务的状态

        freeRTOS中,任务在运行时,可能出现以下几种状态:

        1)运行态。任务当前正在运行中,占有cpu的使用权。

        2)就绪态。满足了运行条件,但是当前没有运行,可能是有高优先级任务在执行或者在中断,处于等待获得cpu使用权然后运行的状态中。

        3)阻塞态。在某些条件下被阻塞了,不能得到运行。比如等待某些信号量,消息队列或者调用了延迟函数。

        4)挂起态。任务被通过调用挂起操作被终止执行了,直到被从挂起状态中恢复为止,否则将一直处于挂起的状态中。

(2)任务的优先级

        freeRTOS的任务优先级是数值越大,任务的优先级越高。

        freeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的

configMAX_PRIORITIES

        进行配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1。

2、freeRTOS的任务切换的实现

为了说明FreeRTOS的任务切换,以STM32为例:

1)PendSV中断

        freeRTOS系统的任务切换的具体过程最终都是在pendSV中断服务函数里面完成的。

        PendSV是一种不精确的异常处理,优先级和挂起状态可以通过编程实现,一般在实时操作系统中 PendSV 的优先级都会被设置为最低,在其他所有的异常中断处理完以后才执行,对上下文的切换非常有用。

        在freeRTOS系统中,执行上下文切换依靠的是任务调度器。上下文切换被触发的场合可有:

        1> 执行一个系统调用。如:任务切换函数taskYIELD()、延时vTaskDelay()。

        2> Systick中断。

2Systick中断

        Systick中断服务函数中会进行任务切换。

3、freeRTOS的任务管理的API函数


3.1、FreeRTOS任务创建

        在freeRTOS中,可以根据实际使用的需要创建一定数量的任务(线程),任务只有被成功创建了,才有可能被执行到。

        在FreeRTOS实时操作系统中,创建任务可以使用如下的API:

      

portBASE_TYPE xTaskCreate(

         pdTASK_CODE pvTaskCode,

         const char * const pcName,

         unsigned short usStackDepth,

         void *pvParameters,

         unsigned portBASE_TYPE uxPriority,

         xTaskHandle *pvCreatedTask

        );

函数参数说明:

    pvTaskCode:指向任务入口函数的指针。即任务函数。

    pcName:任务的描述。一般都是为了调试方便而使用的。由 tskMAX_TASK_NAME_LEN 定义的最大长度,默认为 16。

    usStackDepth:任务堆栈的大小。不是字节数而是以字为单位。例如,如果堆栈为 16 位宽,并且             usStackDepth 定义为 100,则将分配 200 个字节用于堆栈存储。

    pvParameters:任务的参数的指针。可以向创建的任务中传入参数,不需要传送参数可以选NULL。

    uxPriority:任务运行的优先级。

    pvCreatedTask:任务的句柄,通过该句柄引用创建的任务。

返回值:

    任务创建成功返回 pdPASS;创建失败返回 pdFAIL。

创建一个任务的示例如下:

xTaskCreate((TaskFunction_t )Start_Task,            //任务函数

            (const char*    )"Start_Task",          //任务名称

            (uint16_t       )128,                   //任务堆栈大小

            (void *         )NULL,                  //传递给任务函数的参数

            (UBaseType_t    )5,                     //任务优先级

            (TaskHandle_t * )&StartTask_Handler);   //任务句柄

注意:

        1)任务的优先级要根据 FreeRTOSConfig.h 文件中的

configMAX_PRIORITIES

        进行设置的,可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1,如果创建的任务所选的任务优先级超过了这个设置的范围,会被忽略掉,不会被执行。

3.2、FreeRTOS任务挂起

        当任务在系统运行过程中,因为某些条件或者有其他的更加重要的事情要做的时候,可以考虑把某些任务先挂起,等候条件到达之后再恢复任务继续调度运行。

        挂起任务的函数为:

void vTaskSuspend( xTaskHandle pxTaskToSuspend )

参数:

    pxTaskToSuspend:需要被挂起的任务的优先级

返回值:无

        要使用这个函数,需要在 FreeRTOSConfig.h中将宏定义 INCLUDE_vTaskSuspend 定义为 1,如下:

         此外,如果要挂起、恢复整个系统所有的任务,freeRTOS也提供了一个API函数,如下:

void vTaskSuspendAll( void )  // 挂起所有的任务

BaseType_t xTaskResumeAll( void ) // 恢复所有被挂起的任务

        要恢复某个被挂起的任务,可以使用函数:

3.3、FreeRTOS任务删除

        如果有某些任务只是需要存在于某些条件,当条件满足之后就不再需要这个任务参与运行,这个时候可以选择删除掉这个任务,释放该任务所占用的堆栈空间。

        删除任务可以使用函数:

void vTaskDelete( xTaskHandle pxTask )

参数:

    pxTask:需要被删除的任务句柄

返回值:无

        注意:要使用这个函数,需要将宏定义 INCLUDE_vTaskDelete  设置为 1 。

4、freeRTOS的内核管理函数

4.1、获取任务的优先级

        如果运行过程中需要知道当前运行的任务的优先级,可以调用优先级获取函数得到任务的优先级:

 unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask )

 参数:

       pxTask:需要获取优先级的任务的句柄。

 返回值:

       句柄对应的任务的优先级。

4.2、修改任务的优先级

任务在运行过程中,优先级希望能被改变成其他的优先级,可以使用函数:

void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority )

参数:

    pxTask:任务的句柄。

    uxNewPriority:需要修改的新的优先级的值。

5、freeRTOS的延时函数

5.1、相对延时函数

void vTaskDelay(const TickType_t TicksToDelay)

5.2、绝对延时函数

void vTaskDelayUntil(TickType_t* const pxPreviousWakeTime,

                 const TickType_t  xTimeIncrement

                    )

 对嵌入式技术感兴趣的欢迎关注“嵌入式之入坑笔记”,一起学习交流吧!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

freeRTOS学习 — 任务的创建与管理 的相关文章

  • FreeRTOS系列

    1 多任务系统 1 1 前后台系统 单片机裸机开发时 一般都是在main函数里面用while 1 做一个大循环来完成所有的处理 循环中调用相应的函数完成所需的处理 有时也需要在中断中完成一些处理 相对于多任务系统而言 这就是单人单任务系统也
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • FreeRTOS学习笔记(3、信号量、互斥量的使用)

    FreeRTOS学习笔记 3 信号量 互斥量的使用 前言 往期学习笔记链接 学习工程 信号量 semaphore 两种信号量的对比 信号量的使用 1 创建信号量 2 give 3 take 4 删除信号量 使用计数型信号量实现同步功能 使用
  • FreeRTOS ------- 任务(task)

    在学习RTOS的时候 个人觉得带着问题去学习 会了解到更多 1 什么是任务 在FreeRTOS中 每个执行线程都被称为 任务 每个任务都是在自己权限范围内的一个小程序 其具有程序入口每个任务都是在自己权限范围内的一个小程序 其具有程序入口通
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • 【FreeRTOS】任务通知的使用

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • FreeRTOS之事件

    FreeRTOS之事件 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 一 事件定义 事件 事件集 与高数上的集合意义差不多 事件啊 其实是实现任务间通信的机制 主要用于实现多任务间的同步 但是事件类型
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • FreeRTOS死机原因

    1 中断回调函数中没有使用中断级API xxFromISR 函数 xSemaphoreGiveFromISR uart busy HighterTask 正确 xSemaphoreGive uart busy 错误 2 比configMAX
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect

随机推荐