当前位置: 首页 > news >正文

我的世界服务器网站建设咸阳网站建设公司哪家好

我的世界服务器网站建设,咸阳网站建设公司哪家好,用word做旅游网站,做设计常逛的网站RTOS系统的核心是任务管理#xff0c;而任务管理的核心是任务切换#xff0c;任务切换决定了任务的执行顺序#xff0c;任务切换效率的高低也决定了一款系统的性能#xff0c;尤其是对于实时操作系统。而对于想深入了解 FreeRTOS系统运行过程的同学其任务切换是必须掌握的知… RTOS系统的核心是任务管理而任务管理的核心是任务切换任务切换决定了任务的执行顺序任务切换效率的高低也决定了一款系统的性能尤其是对于实时操作系统。而对于想深入了解 FreeRTOS系统运行过程的同学其任务切换是必须掌握的知识点。本章记录我学习我FreeRTOS的任务切换过程之PendSV本章分为如下几部分:1 PendSV 异常2 FreeRTOS任务切换场合 3 PendSV中断服务函数 目录 一、PendSV  二、FreeRTOS任务切换场合 一、执行系统调用  二、 系统滴答定时器SysTick中断 三、PendSV中断服务函数  一、PendSV  这是我从网上整理的PendSv概念 FreeRTOS 是一个流行的开源实时操作系统RTOS广泛用于嵌入式系统开发。它提供了任务调度、时间管理、互斥量、信号量等多种实时操作系统的基本功能。在基于 ARM Cortex-M 架构的系统中FreeRTOS 利用了该架构特有的一些特性来实现其功能其中包括 PendSVPendable Service Call异常。 PendSV 异常简介 PendSV可挂起的服务调用异常是 ARM Cortex-M 处理器提供的一种特殊类型的异常用于支持操作系统级的上下文切换。在 FreeRTOS 中PendSV 主要用于触发上下文切换以便于操作系统从一个任务切换到另一个任务。 PendSV 在 FreeRTOS 中的作用 任务切换 在 FreeRTOS 中当一个任务需要让出 CPU 使用权以便另一个任务可以运行时会触发 PendSV 异常来实现任务的上下文切换。这个过程涉及保存当前任务的状态寄存器、堆栈指针等并恢复即将运行的任务的状态从而实现无缝的任务切换。 低优先级 PendSV 设计为具有最低的优先级。这确保了所有其他更高优先级的中断和异常处理完毕后才执行上下文切换从而减少对实时性能的影响。 可控制的触发 通过设置相应的控制寄存器软件可以灵活地触发 PendSV 异常。这意味着 FreeRTOS 可以根据任务调度算法的需要在合适的时机主动触发上下文切换。 高效的上下文切换 利用 PendSV 异常进行上下文切换是非常高效的因为它允许直接利用处理器的特性来保存和恢复任务的状态避免了不必要的操作和延迟。 总结 PendSV 异常是 ARM Cortex-M 处理器提供的一种强大功能FreeRTOS 利用这一机制实现了高效、可靠的任务切换。通过将 PendSV 设置为最低优先级FreeRTOS 确保了系统的实时性能和响应性同时也展示了操作系统与硬件架构紧密合作的一个典型例子。 PendSV(可挂起的系统调用)异常对FreeRTOS操作非常重要其优先级可以通过编程设置。可以通过将中断控制和状态寄存器ICSR 的 bit28也就是PendSV的挂起位置1来触发PendSV中断。与SVC异常不同它是不精确的因此它的挂起状态可在更高优先级异常处理内设置且会在高优先级处理完成后执行。 利用该特性若将PendSV设置为最低的异常优先级可以让PendSV异常处理在所有其他中断处理完成后执行这对于上下文切换非常有用也是各种OS设计中的关键。在具有嵌入式OS 的典型系统中处理时间被划分为了多个时间片。若系统中只有两个任务这两个任务会交替执行如图所示: 上下文切换被触发的场合可以是:执行一个系统调用系统滴答定时器(SysTick)中断。在OS 中任务调度器决定是否应该执行上下文切换如图中任务切换都是由SysTick 中断中执行每次它都会决定切换到一个不同的任务中。 若中断请求(IRQ)在SysTick 异常前产生则SysTick 异常可能会抢占IRQ的处理,在这种情况下OS不应该执行上下文切换否则中断请求IRQ处理就会被延迟而且在真实系统中延迟时间还往往不可预知一一任何有一丁点实时要求的系统都决不能容忍这种事。 对于Cortex-M3和 Cortex-M4处理器当存在活跃的异常服务时设计默认不允许返回到线程模式.若存在活跃中断服务且OS试图返回到线程模式则将触发用法 fault如图所示。 在一些OS设计中要解决这个问题可以在运行中断服务时不执行上下文切换此时可以检查栈帧中的压栈xPSR或NVIC中的中断活跃壮态寄存器。不过系统的性能可能会受到影响特别时当中断源在SysTick中断前后持续产生请求时这样上下文切换可能就没有执行的机会了。 为了解决这个问题PendSV异常将上下文切换请求延迟到所有其他 IRQ处理都已经完成后此时需要将PendSV设置为最低优先级。若OS需要执行上下文切换他会设置PendSV的挂起壮态并在 PendSV异常内执行上下文切换。如图所示: 图中事件的流水账记录如下: (1)任务A呼叫SVC来请求任务切换例如等待某些工作完成) (2)OS接收到请求做好上下文切换的准备并且 pend一个PendSV异常。 (3)当CPU退出SVC后它立即进入Pendsv从而执行上下文切换。 (4)当PendSV执行完毕后将返回到任务B同时进入线程模式。 (5)发生了一个中断并且中断服务程序开始执行 (6)在ISR执行过程中发生 SysTick 异常并且抢占了该ISR。 (7) OS执行必要的操作然后pend起 PendSV异常以作好上下文切换的准备。 (8)当SysTick 退出后回到先前被抢占的ISR中ISR继续执行。 (9)ISR执行完毕并退出后PendSV服务例程开始执行并且在里面执行上下文切换。 (10)当PendSv执行完毕后回到任务A同时系统再次进入线程模式。讲解PendSV异常的原因就是让大家知道FreeRTOS系统的任务切换最终都是在PendSv中断服务函数中完成的UcOS也是在 PendSV中断中完成任务切换的。 在FreeRTOS中ISR代表中断服务程序Interrupt Service Routine。中断服务程序是一段特殊的代码用于处理硬件引发的中断事件。当硬件设备触发了一个中断系统会立即跳转执行与该中断相关联的中断服务程序。在FreeRTOS中可以使用中断服务程序来处理实时操作系统所需的硬件中断例如定时器中断、串行通信中断等。通过适当地编写和管理中断服务程序可以实现对系统资源的高效利用和实时任务的调度。 二、FreeRTOS任务切换场合 前面我们介绍PendSV中断的时候提到过上下文任务切换触发的场合 1、可以执行一个系统调用 2、系统滴答定时器SysTick中断。 一、执行系统调用  执行系统调用就是执行FreeRTOS系统提供的相关API函数,比如任务切换函数taskYIELD(),FreeRTOS有些API函数也会调用函数taskYIELD()这些API函数都会导致任务切换这些API函数和任务切换函数 taskYIELD()都统称为系统调用。函数 taskYIELD()其实就是个宏在文件task.h中有如下定义: #define taskYIELD() portYIELD()函数portYIELD()也是个宏在文件portmacro.h中有如下定义 (1)、通过向中断控制和状态寄存器ICSR的bit28写入1挂起PendSv来启动PendSV中断。这样就可以在 PendSV中断服务函数中进行任务切换了。中断级的任务切换函数为portYIELD_FROM_ISR()定义如下: 可以看出portYIELD_FROM_ISR()最终也是通过调用函数portYIELD()来完成任务切换的。 二、 系统滴答定时器SysTick中断 FreeRTOS中滴答定时器(SysTick)中断服务函数中也会进行任务切换滴答定时器中断服务函数如下: 在滴答定时器中断服务函数中调用了FreeRTOS的API函数xPortSysTickHandler()此函数源码如下: (1)、关闭中断 (2)、通过向中断控制和壮态寄存器ICSR的bit28写入Ⅰ挂起PendSV来启动PendSV中断。这样就可以在 PendSV中断服务函数中进行任务切换了。 (3)、打开中断。 三、PendSV中断服务函数  前面说了FreeRTOS任务切换的具体过程是在PendSV中断服务函数中完成的接下来我们就来学习一个PendSV的中断服务函数看看任务切换过程究竟是怎么进行的。PendSV中断服务函数本应该为PendSV_Handler()但是FreeRTOS使用#define重定义了如下:   #define xPortPendSVHandler PendSV_Handler函数xPortPendSVHandler() 源码如下 (1)、读取进程栈指针保存在寄存器R0里面。 (2)和(3)获取当前任务的任务控制块并将任务控制块的地址保存在寄存器R2里面。 (4)和(5)、判断任务是否使用了FPU如果任务使用了FPU的话在进行任务切换的时候就需要将FPU寄存器s16~s31手动保存到任务堆栈中其中 sO~s15和FPSCR是自动保存的。 (6)、保存s16~s31这16个FPU寄存器。 (7)、保存r4~r11和R14这几个寄存器的值。 (8)、将寄存器RO的值写入到寄存器R2所保存的地址中去也就是将新的栈顶保存在任务控制块的第一个字段中。此时的寄存器RO 保存着最新的堆栈栈顶指针值所以要将这个最新的栈顶指针写入到当前任务的任务控制块第一个字段而经过(2)和(3)已经获取到了任务控制块,并将任务控制块的首地址写如到了寄存器R2中。 (9)、将寄存器R3的值临时压栈寄存器R3中保存了当前任务的任务控制块而接下来要调用函数vTaskSwitchContext()为了防止R3的值被改写所以这里临时将R3的值先压栈。 (10)和(11)、关闭中断进入临界区 (12)、调用函数vTaskSwitchContext()此函数用来获取下一个要运行的任务并将pxCurrentTCB更新为这个要运行的任务。 (13)和(14)、打开中断退出临界区。 (15)、刚刚保存的寄存器R3的值出栈恢复寄存器R3的值。注意经过(12)步此时pxCurrentTCB的值已经改变了所以读取R3所保存的地址处的数据就会发现其值改变了成为了下一个要运行的任务的任务控制块。 (16)和(17)、获取新的要运行的任务的任务堆栈栈顶,并将栈顶保存在寄存器R0中。(18)、R4~R11,R14出栈也就是即将运行的任务的现场。 (19)、(20)和(21)、判断即将运行的任务是否有使用到FPU,如果有的话还需要手工恢复FPU的s16~s31寄存器。 (22)、更新进程栈指针PSP的值。 (23)、执行此行代码以后硬件自动恢复寄存器RO~-R3、R12、LR、PC和xPSR的值确定异常返回以后应该进入处理器模式还是进程模式使用主栈指针(MSP)还是进程栈指针(PSP)。很明显这里会进入进程模式并且使用进程栈指针(PSP)寄存器PC值会被恢复为即将运行的任务的任务函数新的任务开始运行!至此任务切换成功。
http://www.pierceye.com/news/802988/

相关文章:

  • 手机版网站如何做陕西城乡建设网站
  • 大连网站建设事件营销的特点
  • 做语音聊天网站要多少钱app界面设计模板素材免费
  • 设计网站专题页包括那些项目个人做网站要买什么域名
  • 建网站 方法中信建设有限责任公司获奖
  • 做宠物商品的网站无锡自适应网站开发
  • 网站后台怎样登陆做网站数据库及相关配置
  • 昆明seo网站排名网站代码 输入文字 跳出内容
  • 济南建站公司网站广州市网站设计
  • 网站模板做的比较好的公司网站制作汇报会
  • 个人网站图片海外网站备案
  • 兰州手机网站制作公司哪家好网店分销平台
  • 百度建立自己的网站网络工程师培训课程
  • 微网站的制作过程海南注册公司怎么注册
  • 公司网站制作投标建站行业都扁平化设计
  • 男女做a视频网站wordpress询价功能
  • 网站建设视频百度网盘下载我做网站价格
  • 江苏省建设集团有限公司网站首页东莞网络推广外包
  • 梁平网站建设莱芜网络营销
  • 自学网站建设需要什么学历学校网站建设总结报告
  • 增城新塘网站建设平面设计技术培训机构
  • 游戏网站开发视频运动品牌网页设计
  • 成都比较好的网站建设公司做视频后期的网站
  • 重庆网页搜索排名提升专业seo优化推广
  • 手机免费代理ip网站模板网站的优势有哪些
  • dede地方门户网站模板做网站备案
  • 域名访问网站的知识站酷网官网进入
  • 6入空间网站免费观看wordpress转盘抽奖源码
  • 手机网站怎么开发工具网站开发中如何实现gps定位
  • sql2008做网站焦作网站建设哪家便宜