FreeRTOS任务相关基础知识

2023-05-16

一、单任务系统和多任务系统

单任务系统一般为裸机系统,while(1)做一个大循环,也包含一些中断,完成所有的程序逻辑处理。如果应用程序需求繁多,程序设计复杂,应考虑多任务系统。

多任务系统在操作系统基础上实现,可将繁杂的应用程序“分而治之”,将大问题划分为多个小问题,由不同的任务去解决,可以认为它们是并发运行的(其实是多个任务轮转运行,每个任务执行时间很短),RTOS中有一个任务调度器决定哪个任务先运行,哪个后运行。

 

二、FreeRTOS任务特点:

在程序设计中,一个应用业务可以单独作为一个任务,每个任务都拥有自己独立的运行环境,不依赖于其他任务,一个时刻同时只有一个任务在运行,由任务调度器决定哪个任务运行。在调度过程中,任务调度器需保证一个任务在开始运行时,其上下文环境与任务上一次退出的时候相同。故,每个任务都必须有独立的堆栈保存上下文环境。

任务支持抢占/优先级/独立的堆栈。

三、任务的状态

FreeRTOS任务的状态有4种:运行态,就绪态,阻塞态,挂起态。

  1. 运行态

该任务正在运行,正占用处理器。

     2. 就绪态

指已经准备好运行的任务(没有被挂起或阻塞),就绪态还没有运行,在等待同优先级任务或者更高优先级任务让出处理器。

     3. 阻塞态

任务在等待某个外部事件,处于阻塞状态。如任务调用vTaskDelay(),在等待延时完成,等待队列/信号量/事件组/通知/互斥信号量等,阻塞态会有超时时间,超过改时间,退出阻塞态。

     4. 挂起态

与阻塞态类似,进入挂起态也不能被调用进入运行态,但是挂起态没有超时时间,调用vTaskSuspend()和xTaskResume()使任务进入和退出挂起态。

状态之间转换如下图:

每个任务都有优先级,0~(configMAX_PRIOIRTES-1),0的优先级最低,FreeRTOS调度器确保处于就绪态的最高优先级任务优先执行,当宏configUSE_TIME_SLICING定义为1时,多个任务可以使用相同优先级,数量不限,对于处于就绪态的优先级相同的任务,将由时间片轮转调度器决定谁先运行。

 

四、任务的创建

FreeRTOS中创建任务使用xTaskCreate()或者xTaskCreateStatic()来创建任务,

BaseType_t xTaskCreate(   TaskFunction_t pxTaskCode,

                                                 const char * const pcName,                                                       const configSTACK_DEPTH_TYPE usStackDepth,

                                                 void * const pvParameters,

                                                 UBaseType_t uxPriority,

                                                 TaskHandle_t * const pxCreatedTask ) ; 

TaskHandle_t xTaskCreateStatic(

                                                 TaskFunction_t pxTaskCode,

                                                 const uint32_t ulStackDepth,

                                                 void * const pvParameters,

                                                 UBaseType_t uxPriority,

                                                 StackType_t * const puxStackBuffer,

                                                        StaticTask_t * const pxTaskBuffer );

xTaskCreate()动态创建任务,xTaskCreateStatic()静态创建任务(需自己定义堆栈),一般常用xTaskCreate()。pxTaskCode为任务的执行函数,在该函数中完成该任务的工作。FreeRTOS官方给出的任务模板如下:

      void vTaskCode( void * pvParameters )

    {

        for( ;; )

        {

            // Task code goes here.

                     ```

                     vTaskDelay();

                     ```

        }

              vTaskDelete(NULL);

}

1.任务函数的返回值必须为viod类型,参数为void*类型;

2,任务具体执行过程是一个大循环,在该循环中处理业务逻辑;

3.可使用延时函数,请求信号量,队列等;

4.任务函数中一般不允许跳出循环,若跳出循环,则需调用vTaskDelete(NULL)删除此任务,删除任务时需释放掉在内存中动态申请的内存。

五、任务控制块

任务控制块结构体包含一个任务所有需要存储的属性,使用xTaskCreate()创建一个任务,系统自动给该任务分配一个任务控制块。

typedef struct tskTaskControlBlock

{

       volatile StackType_t    *pxTopOfStack;    /*任务堆栈顶,必须为第一个成员*/

 

       #if ( portUSING_MPU_WRAPPERS == 1 )

              xMPU_SETTINGS xMPUSettings;            /*< MPU相关设置*/

       #endif

       ListItem_t                    xStateListItem;     /*< 状态列表项(链表节点),阻塞/就绪/挂起 */

       ListItem_t                    xEventListItem;            /*事件列表项(链表节点) */

       UBaseType_t               uxPriority;                   /*任务优先级 */

       StackType_t                *pxStack;                     /*堆栈起始地址 */

       char                     pcTaskName[ configMAX_TASK_NAME_LEN];/*任务名字*/

 

       #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )

              StackType_t         *pxEndOfStack;           /*任务堆栈栈底*/

       #endif

 

       #if ( portCRITICAL_NESTING_IN_TCB == 1 )

              UBaseType_t        uxCriticalNesting;       /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */

       #endif

 

       #if ( configUSE_TRACE_FACILITY == 1 )        /*debug或trace的时候用*/

              UBaseType_t        uxTCBNumber;            /*< Stores a number that increments each time a TCB is created.  It allows debuggers to determine when a task has been deleted and then recreated. */

              UBaseType_t        uxTaskNumber;           /*< Stores a number specifically for use by third party trace code. */

       #endif

 

       #if ( configUSE_MUTEXES == 1 )

              UBaseType_t        uxBasePriority;            /*基础优先级,优先级反转时用到*/

              UBaseType_t        uxMutexesHeld;          /*获取到信号量个数*/

       #endif

 

       #if ( configUSE_APPLICATION_TASK_TAG == 1 )

              TaskHookFunction_t pxTaskTag;

       #endif

 

       #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )

              void              *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];

       #endif

 

       #if( configGENERATE_RUN_TIME_STATS == 1 )

              uint32_t        ulRunTimeCounter;     /*< Stores the amount of time the task has spent in the Running state. */

       #endif

 

       #if ( configUSE_NEWLIB_REENTRANT == 1 )

              /* Allocate a Newlib reent structure that is specific to this task.

              Note Newlib support has been included by popular demand, but is not

              used by the FreeRTOS maintainers themselves.  FreeRTOS is not

              responsible for resulting newlib operation.  User must be familiar with

              newlib and must provide system-wide implementations of the necessary

              stubs. Be warned that (at the time of writing) the current newlib design

              implements a system-wide malloc() that must be provided with locks. */

              struct     _reent xNewLib_reent;

       #endif

 

       #if( configUSE_TASK_NOTIFICATIONS == 1 )      /*任务通知相关变量*/

              volatile uint32_t ulNotifiedValue;                  /*任务通知值*/

              volatile uint8_t ucNotifyState;                /*通知状态*/

       #endif

 

       /* See the comments in FreeRTOS.h with the definition of

       tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */

       #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */

              uint8_t   ucStaticallyAllocated;               /*< pdTRUE表示任务是静态创建,pdFALSE表示任务时动态创建*/

       #endif

 

       #if( INCLUDE_xTaskAbortDelay == 1 )

              uint8_t ucDelayAborted;

       #endif

 

       #if( configUSE_POSIX_ERRNO == 1 )

              int iTaskErrno;

       #endif

 

} tskTCB;

 

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

FreeRTOS任务相关基础知识 的相关文章

  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • 基于HAL库的FREERTOS----------二.任务API函数

    任务API函数览概 CUBEMX对 做了API的封装 很多 的函数没有封装到位 可以用原函数调用 任务API函数分别介绍 1 uxTaskPriorityGet 此函数用来获取指定任务的优先级 要使用此函数的话宏 INCLUDE uxTas
  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • FreeRTOS快速上手

    FreeRTOS使用 一 源码下载和移植文件提取 1 1 源码下载 在网站https sourceforge net projects freertos 可以找到freertos最新的源码 1 2 移植文件提取 根据第一步 我们会得到一个f
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • FreeRTOS学习(八) 延时函数

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 FreeRTOS延时函数有两个 分别是 vTaskDelay vTaskDelayUntil 1 vTaskDelay 任务相对延时 函数原型
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • FreeRTOS ------- 任务(task)

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

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

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • FreeRTOS多任务调度器基础

    Cortex M4中SysTick调度器核心 Cortex M4中的中断管理 Cortex M4中影子栈指针 Cortex M4中SVC和PendSV异常 1 Cortex M4中SysTick调度器核心 systick每一次中断都会触发内
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS

随机推荐

  • FreeRTOS原理剖析:任务切换过程

    1 任务切换相关API函数 函数描述xPortPendSVHandler PendSV中断服务函数 xff0c 其实函数原型为PendSV Handler vTaskSwitchContext 检查任务堆栈使用是否溢出 xff0c 和查找下
  • FreeRTOS原理剖析:事件标志组

    1 事件标志组相关API函数 函数描述xEventGroupCreate 使用动态方式创建事件标志组xEventGroupCreateStatic 使用静态方式创建事件标志组vEventGroupDelete 删除事件标志组xEventGr
  • FreeRTOS原理剖析:任务调度器启动

    1 任务调度器启动相关API函数 函数描述vTaskStartScheduler 开启任务调度器 任务调度启动中其它重要的API函数 介绍过的函数不列出 xff0c 请参考前面的文章 xff1a 函数描述xPortStartSchedule
  • linux字符设备驱动 LED驱动程序

    1 字符设备驱动简介 Linux的外设主要分为三类 xff1a 字符设备 character device 块设备 block device 网络接口 network interface 字符设备是能像字节流一样读写操作的设备 xff0c
  • 学生时代的书单

    大话系列的书 xff0c 用独特的行文风格 xff0c 以风趣 幽默的语言向读者讲述 概念原理知识 xff0c 用漫画式的插图帮助读者理解晦涩 枯燥的技术 xff0c 让我们在快乐中掌握知识 xff01 1 大话通信 通信基础知识读本 作者
  • Linux字符时设备驱动 中断处理 按键

    1 Linux异常处理体系结构 Linux异常处理体系结构使用主要分成两步 xff1a 1 使用函数init IRQ 初始化中断体系结构 xff0c 源代码在arch arm kernel irq c中 2 用户使用函数request ir
  • [UAV] 无人机仿真平台搭建

    Amovlab 开源项目 从0开始的无人机仿真平台搭建1 基础环境1 1 新建本地代码仓库1 2 编译添加路径 xff08 记得 将Path To Prometheus替换成你的文件路径 xff09 1 3 安装ROS所需的其他插件或者库安
  • FreeRTOS之优先级反转实验

    1 创建二值信号和创建3个任务 xff0c LowPriority Task为最低优先级 xff0c HighPriority Task为最高优先级 注意 xff1a 动态创建任务时要注意大小 span class token keywor
  • FreeRTOS之StreamBuffer实验

    1 常用函数介绍 创建StreamBuffer函数 调用xStreamBufferCreate xff0c xStreamBufferCreate是个宏定义 xff0c 实际函数在下面 xff1a span class token comm
  • FreeRTOS之按键中断实验

    1 创建任务和二值信号量 span class token macro property span class token directive hash span span class token directive keyword inc
  • FreeRTOS之串口中断接收实验

    1 创建任务和消息队列 span class token macro property span class token directive hash span span class token directive keyword defi
  • linux下用Kazam录屏视频在windows不能播放解决

    描述 之前在ubuntu上记录一些东西 xff0c 但是转而在windows就不能播放 xff0c 查了一下资料说是解码器的问题 大概也有网友遇到类似问题 xff0c 那就分享一下吧 xff01 解决 windows上下载安装软件HandB
  • 位姿估计_1

    说在前面的话 位姿估计 xff08 Pose estimation xff09 在计算机视觉领域扮演着十分重要的角色 在使用视觉传感器估计机器人位姿进行控制 机器人导航 增强现实以及其它方面都有着极大的应用 位姿估计这一过程的基础是找到现实
  • 编译osgearth过程中遇到的问题

    1 关于libxxx so no version information available 的解决办法 删除软链接并建立新链接 2 gdal库编译不过 xff0c 报错undefined symbol sqlite3 column tab
  • 基于加速度计与气压计的三阶卡尔曼滤波计算加速度、速度及高度

    本文主要介绍了卡尔曼滤波器的使用原理 xff0c 给出了matlab代码 xff0c 并在STM32F407平台对卡尔曼滤波器进行了验证 xff0c 传感器为MPU6050与DPS310 xff0c 测试结果令人满意 xff0c 速度与高度
  • Ubuntu18.04基于ROS和PX4的仿真平台配置

    1 前言 作者只是一名双非本科院校飞控专业的大二学生 xff0c 想以此记录一下自学飞控的经历 xff0c 也希望能给刚刚入门的同学一些微薄的帮助 这个环境的安装可以说是西天取经一般 xff0c 但安装完后发现如果有领路的人 xff0c 其
  • ubuntu下通过浏览器下载软件包的路径及×××.tar.xz包的安装(1)

    ubuntu下大家一般都会通过软件下载中心安装 xff0c 而软件中心下载的软件一般在 var cache apt archives这个路径下 xff0c 当然一般软件中心对给你安装好 xff0c 所以该路径下的文件名是 deb的文件 同时
  • 基于AWSIM实现Autoware docker内仿真运行

    AWSIM是Autoware当前推荐使用的仿真工具 xff0c 内部采用ros2 for unity插件 xff0c 能够直接发送ros2消息而不同采用中间转接模块 xff0c 效率较高 进行软件开发时各种依赖包的版本管理是让人头疼的问题
  • 关于Apollo Cyber RT 中Component如何绑定到CPU Group、具体线程及优先级队列

    Apollo Scheduler 模块的工作原理如下图所示 xff1a 原图引用链接 xff1a 架构分析 Apollo CyberRT Framework分析 Scheduler调度器 HaoBBNuanMM的博客 CSDN博客 cybe
  • FreeRTOS任务相关基础知识

    一 单任务系统和多任务系统 单任务系统一般为裸机系统 xff0c while 1 做一个大循环 xff0c 也包含一些中断 xff0c 完成所有的程序逻辑处理 如果应用程序需求繁多 xff0c 程序设计复杂 xff0c 应考虑多任务系统 多