FreeRTOS学习(一)

2023-05-16

1 FreeRTOS任务基础

  • 1.1 多任务系统
    在51单片机、AVR、STM32裸机编程时,我们通常都是用一个main函数里面加一个while(1)做一个大循环来完成所有的事务处理,同时在加上中断处理一些较为紧急的事务。相对于多任务系统而言,这个就是单任务系统,也称作前后台系统,中断服务函数
    作为前台程序,大循环while(1)作为后台程序,如图 1.1.1 所示:
    在这里插入图片描述
    图1.1.1 前后台系统
    前后台系统的实时性较大(尤其是调度任务较多),每个任务都是轮流执行,没有轮到该任务运行的时候,不管该任务有多么的紧急,就只能等着,大家拥有一样的优先级。但是该类系统简单,所消耗的资源较少。
    多任务系统可以将一个大问题分成很多个具有共性的小问题,逐一的将这些小问题解决,进而大问题将得到全面的解决,我们可将每一个小问题都视为一个任务。这些小任务是并发处理的,由于他们的执行时间很短,我们所能感觉到的是所有的任务都是同时进行的。那么多任务运行的问题就来了,这就涉及到任务执行的先后顺序及什么任务该执行不该执行了。该模块的功能将由任务调度器来完成,具体如何实现,各类系统是有很大差别的,通常来说我们可分为抢占式(UCos、FreeRTOS)和非抢占式(Linux)。FreeRTOS是一个支持抢占式的实时操作系统,其任务运行如图1.1.2所示:
    在这里插入图片描述
    图1.1.2 抢占式多任务系统

  • 1.2 FreeRTOS任务
    在使用RTOS的时候一个实时应用可以一个独立的任务,每个任务都有自己的运行环境,CPU在任一时间点只能运行一个任务,具体运行哪一个任务将由任务调度器决定。因此,任务调度器将会不断的开启和关闭任务,任务无需了解RTOS调度器的行为,RTOS调度器的功能是确保一个任务在开始执行的时候与上一次退出的时候的运行环境相同(寄存器值、堆栈内容等),这就是上下文切换(Linux中将该过程称为:进程上下文切换)。学过Linux的就会很清楚的知道每一个进程都拥有自己的堆栈,RTOS也是一样,每一个任务都拥有自己独立的堆栈,当任务发生切换时任务调度器就会将其上下文环境保存在堆栈中,等到该任务拿到CPU的使用权时再从其堆栈中取出所保存的上下文环境,继续运行该任务。
    RTOS的任务特性:
    任务简单,相对于Linux来说该类任务简单很多;
    没有使用限制,任务可以运行无数次;
    支持抢占和优先级;
    每个任务都拥有独立的堆栈,导致RAM必须较大;

  • 1.3 FreeRTOS任务状态
    FreeRTOS中的任务状态有运行态、就绪态、阻塞态、挂起态,但任一任务只能处于这几种状态中的一个。

  • 1.3.1 运行态
    当一个任务正在运行时(这一时刻该任务的代码在CPU中执行),那么该任务就处于运行态。如果所使用的是单核CPU,那么不管任何时刻只有一个任务处于运行态,这就证明了CPU在某一时刻只能被一个任务拿到使用权。

  • 1.3.2 就绪态
    就绪态是指那些已经准备好了的任务,可以随时拿到CPU的使用权,进而进入运行态,但是此时此刻该状态的任务还没有执行,主要是因为当前有一个同优先级或者更高优先级的任务正在运行。

  • 1.3.3 阻塞态
    如果一个任务当前正在等待某一外部事件的发生所处于的状态,如:任务正在等待队列、信号量、事件组等都会进入阻塞态。任务进入阻塞态是有一定的时间限制,当超时等待时,该任务将退出阻塞态,进入就绪态,等待拿到CPU的使用权,进入运行态。

  • 1.3.4 挂起态
    任务进入挂起的状态和阻塞态一样,将不会被任务调度器所调用,但是出于挂起态的任务是没有超时的问题。在FreeRTOS中,任务进入和退出挂起态只能通过调用VTaskSuspend()和xTaskReume()。
    在这里插入图片描述
    图1.3.1 任务状态间的转换

  • 1.3.5 任务优先级
    FreeRTOS中每一个任务都可以都可以分配从 0~(configMAX_PRIORITIES-1) 的 优 先 级 ,configMAX_PRIORITIES 在文件 FreeRTOSConfig.h 中有定义。如果所使用的硬件平台支持类似计算前导零这样的指令(可以通过该指令选 择 下 一 个 要 运 行 的 任 务 , Cortex-M 处 理 器 是 支 持 该 指 令 的 ) , 并 且 宏configUSE_PORT_OPTIMISED_TASK_SELECTION 也 设 置 为 了 1 , 那 么 宏configMAX_PRIORITIES 不能超过 32!也就是优先级不能超过 32 级。其他情况下宏configMAX_PRIORITIES 可以为任意值,但是考虑到 RAM 的消耗,宏 configMAX_PRIORITIES最好设置为一个满足应用的最小值。
    优先级的数字越低表示任务的优先级越低,0的任务优先级最低,configMAX_PRIORITIES-1的优先级最高。空闲任务的优先级最低,为0。

  • 1.3.6 任务控制块
    任务控制块(Task Contrl Block,简称TCB),FreeRTOS的每一个任务都有一些属性需要存储,所有的信息将存储在一个结构体中,该结构体叫做任务控制块:TCB_t,在使用xTaskCreate()创建任务时将会自动给每一个任务分配一个任务控制块,此结构体在文件task.c中有定义,具体成员如下:

      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 )
          StackType_t *pxEndOfStack;  				//任务堆栈栈底
          #endif
          
          #if ( portCRITICAL_NESTING_IN_TCB == 1 )
          UBaseType_t uxCriticalNesting; 				//临界区嵌套深度
          #endif
          
          #if ( configUSE_TRACE_FACILITY == 1 ) //trace 或到 debug 的时候用到
          UBaseType_t uxTCBNumber; 
          UBaseType_t uxTaskNumber; 
          #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; 	 		//用来记录任务运行总时间
          #endif
          
          #if ( configUSE_NEWLIB_REENTRANT == 1 )
          struct  _reent xNewLib_reent; 					//定义一个 newlib 结构体变量
          #endif
          
          #if( configUSE_TASK_NOTIFICATIONS == 1 ) 	//任务通知相关变量
          volatile uint32_t ulNotifiedValue; 				//任务通知值
          volatile uint8_t ucNotifyState;  					//任务通知状态
          #endif
          
          #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
          // 用来标记任务是动态创建的还是静态创建的,
          // 如果是静态创建的此变量就为 pdTURE,
          // 如果是动态创建的就为 pdFALSE 
          uint8_t  ucStaticallyAllocated;
          #endif
          
          #if( INCLUDE_xTaskAbortDelay == 1 )
          uint8_t ucDelayAborted;
          #endif
      } tskTCB;
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习(一) 的相关文章

  • FreeRTOS系列

    1 多任务系统 1 1 前后台系统 单片机裸机开发时 一般都是在main函数里面用while 1 做一个大循环来完成所有的处理 循环中调用相应的函数完成所需的处理 有时也需要在中断中完成一些处理 相对于多任务系统而言 这就是单人单任务系统也
  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • FreeRTOS快速上手

    FreeRTOS使用 一 源码下载和移植文件提取 1 1 源码下载 在网站https sourceforge net projects freertos 可以找到freertos最新的源码 1 2 移植文件提取 根据第一步 我们会得到一个f
  • FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)

    我们在前面单独介绍过FreeRTOS的任务通知和消息队列 但是在FreeRTOS中任务间的通讯还有信号量 邮箱 事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 增加邮箱部分 任务通知发送消息 Demo 202
  • FreeRTOS学习笔记(3、信号量、互斥量的使用)

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

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏资料 https pan baidu com s 1nc1rfyLiMyw6ZhxiZ1Cumg pwd free 点赞 收藏 再看 养成习惯 订阅的粉丝
  • FreeRTOS学习(八) 延时函数

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

    1 常见的使用场景 void vLED Task void pvParameters while 1 Heartbeat LED vTaskDelay 1000 portTICK RATE MS 说明 上面这段代码的意思是 led翻转后经过
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • STM32移植FreeRTOS的Tips

    转自 http bbs armfly com read php tid 7140 1 在FreeRTOS的demo文件夹中拷贝对应的FreeRTOSConfig h文件后 需要加入一行 define configUSE MUTEXES 1
  • ZYNQ中FreeRTOS中使用定时器

    使用普通的Timer中断方式时 Timer中断可以正常运行 但是UDP通信进程无法启动 其中TimerIntrHandler是中断服务程序 打印程序运行时间与从BRAM中读取的数据 void SetupInterruptSystem XSc
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • 【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代
  • 13-FreeRTOS任务创建与删除

    任务创建和删除API函数位于文件task c中 需要包含task h头文件 task h里面包函数任务的类型函数 例如 对xTaskCreate的调用 通过指针方式 返回一个TaskHandle t 变量 然后可将该变量用vTaskDele
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • 如何表示MASK

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 使用合成数据改善机器学习中的极度不平衡数据集

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • NVIDIA A100 深度解密(一):GPU 峰值计算那些事

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 算法中七种常见的时间复杂度

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • Python之日志处理(logging模块)

    这是我的推广信息 xff0c 以激励自己更好的分享自己的知识和经验 xff01 也希望看到的你能够多多支持 xff0c 谢谢 xff01 1 滴滴云AI大师 目前滴滴云正在大力推广自己的云计算服务 xff0c 需要购买的朋友们用我的AI大师
  • 李群、李代数之我的理解

    我目前的研究领域转到了立体匹配方向 但是基础很薄弱 xff0c 很多理论知识都需要补充 希望自己能够满满的累积起足够的基础知识 这篇博客主要是记录自己对李群 李代数的初步理解 xff0c 还请大家一些讨论进步 参考资料 lie group
  • 科研神器软件(关于查词、翻译)

    整理了几个和科研相关的神器软件 网址 xff0c 关于英文写作 翻译 查词的 xff0c 记录如下 xff1a 英文写作的词句库网站 xff0c 包含大量的例句和写作模板 xff1a https www phrasebank manches
  • CT典型数据——shepp_logan体模数据的生成 python版本

    phantominator包介绍 网址 xff1a https github com mckib2 phantominator安装 xff1a pip install phantominator简介 xff1a 用于简便的生成 numeri
  • 解决 dpkg 安装出错后的 Sub-process /usr/bin/dpkg returned an error code (1) 错误

    前言 在使用 dpkg i 安装 deb软件包的过程中 xff0c 会出现安装失败的可能 之后无论用 sudo apt install f or sud apt autoremove 等常见的修复命令都是无效的 网络上很多解决方案都直接给出
  • Ubuntu20.4 休眠之后网络出现问题的解决方案

    问题简介 Ubuntu20 04 在休眠之后 xff0c 如果网络出现了无法连接或者无法共享的各种问题 xff0c 只有重启才能解决 xff0c 那么以下操作可以让你不用重启电脑 解决方案 重启 network kernel modules
  • 京东京造K系列机械键盘在Linux下的使用

    前言 京东京造是一款为Mac iPad iPhone适配出色的蓝牙键盘 xff0c 官方也支持Win系统 这款键盘 xff0c 其实就是Keychron K8 xff0c 国外非常火的Mac键盘 xff0c 深受苹果用户的喜爱 YouTub
  • 事件相机仿真器(ESIM)安装记录

    前言 在 Ubuntu 20 04 下安装 ESIM 事件相机仿真器 特此记录 资料 官网 https github com yunxdai rpg esim 安装指导 https github com uzh rpg rpg esim w
  • [翻译]解决使用 git clone 命令时出现的 ‘gnutls_handshake() failed’ 错误

    错误介绍 使用 git clone 时出现如下错误 xff1a fatal unable to access 39 https github com Syllo nvtop git 39 gnutls handshake failed Th
  • 解决 pycharm 从快捷方式启动与从终端启动环境不同的问题

    前言 博主在安装了 ros 相关的两个python包 rospy 和 roslaunch 之后 xff0c pycharm 无法 import 这两个包 但是在终端中用同样的python解释器又可以import这两个包 同时 xff0c 从
  • Ubuntu 常用命令使用记录

    Linux 查找包含特定关键词的文件 grep r E 39 word1 word2 word3 39 yourpath gt gather log 如果要and关系查找 则要用管道 grep pattern1 files grep pat
  • Linux 通过 SSH 挂载远程文件夹

    前言 在两台Linux电脑之间 xff0c 我们可以通过ssh方便的登录另一台电脑并访问它的文件或者文件夹 但这都是我们用户在进行操作 想要在一台电脑上运行程序 xff0c 处理放在另一台电脑上的文件时 xff0c 我们应该如何设置呢 xf
  • ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle)

    希望大家收藏 xff1a 本文更新地址 xff1a https haoqchen site 2018 04 28 ROS node init 左侧专栏还在更新其他ROS实用技巧哦 xff0c 关注一波 xff1f 很多ROS新手编写节点的时
  • Ubuntu 终端前多了个 base

    Ubuntu 终端前多了个 base xff0c 想将base去掉 xff0c 如何操作 xff1f 原文 xff1a https blog csdn net qq 35544714 article details 109270602 装完
  • GNU __attribute__浅析

    GNU attribute 浅析 1 介绍 attribute 是GCC的特性 xff0c 其实是个编译器指令 xff0c 告诉编译器声明的特性 xff0c 或者让编译器进行更多的错误检查和高级优化 attribute 可以设置函数属性 x
  • FreeRTOS学习(一)

    1 FreeRTOS任务基础 1 1 多任务系统 在51单片机 AVR STM32裸机编程时 xff0c 我们通常都是用一个main函数里面加一个while 1 做一个大循环来完成所有的事务处理 xff0c 同时在加上中断处理一些较为紧急的