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

建设部资质网站做株洲网站需要多少钱

建设部资质网站,做株洲网站需要多少钱,安全联盟可信任网站认证 网站,佛山新网站制作咨询1 核心概念概述FreeRTOS是一个抢占式实时操作系统,其多任务运行的核心在于任务调度器。调度器负责在适当的时间点停止当前正在运行的任务,并启动另一个就绪态的任务。这个过程就叫做上下文切换。其核心思想可以概括为:利用硬件异常机制&#…

1 核心概念概述

FreeRTOS是一个抢占式实时操作系统,其多任务运行的核心在于任务调度器。调度器负责在适当的时间点停止当前正在运行的任务,并启动另一个就绪态的任务。这个过程就叫做上下文切换。

其核心思想可以概括为:利用硬件异常机制,将复杂的任务切换操作放在PendSV(可挂起的系统调用)异常中完成,并通过将SysTick定时器中断设置为最高优先级来触发调度,而将PendSV设置为最低优先级来确保所有中断处理完成后才安全地进行切换。


2 关键寄存器及其作用

在ARM Cortex-M架构中,以下寄存器在任务切换中扮演着核心角色:

  • R0-R12: 通用寄存器。用于程序运算和暂存数据。在任务切换时,这些寄存器的值都需要被保存和恢复。

  • R13 (SP): 堆栈指针寄存器。Cortex-M内核有两个堆栈指针:

    • MSP (Main Stack Pointer): 主堆栈指针。供操作系统内核和异常处理程序使用。

    • PSP (Process Stack Pointer): 进程堆栈指针。供用户任务使用。这是实现每个任务拥有独立栈空间的关键。任务切换时,SP会在MSP和PSP之间切换。在用户任务中,CPU使用的就是PSP。

  • R14 (LR): 链接寄存器。用于存储函数或子程序调用后的返回地址。在发生异常时,LR会被自动赋予一个特殊的值(EXC_RETURN),该值指示了异常返回时应使用的堆栈指针(MSP还是PSP)以及处理器应返回的模式。

  • R15 (PC): 程序计数器。指向当前正在执行的指令地址。保存任务现场就是保存被中断时刻的PC值,恢复现场就是将PC值恢复,从而让任务从上次被中断的指令处继续执行。

  • xPSR: 程序状态寄存器。包含应用程序状态标志(如进位、零标志等)、执行状态以及当前正在服务的中断号。它也需要在任务切换时被保存和恢复。

  • PRIMASK, FAULTMASK, BASEPRI: 中断屏蔽寄存器。用于控制中断的使能。在临界区代码中会用到。

  • NVIC (嵌套向量中断控制器): 控制中断的优先级和状态。特别是SysTick和PendSV这两个系统异常。


3 任务栈(Task Stack)

每个任务在创建时都会分配一个独立的、连续的内存区域作为其任务栈。这个栈用于存储:

  1. 任务运行时函数调用的返回地址、局部变量等。

  2. 任务被切换出去时(上下文切换),其所有寄存器(R0-R12, LR, PC, xPSR等)的值会被压入它自己的栈中保存起来。这块保存的数据称为任务上下文或任务控制块。

栈的增长方向通常是向下(从高地址向低地址)的。任务控制块(TCB)的第一个成员通常是一个指向该任务栈顶的指针。

两个任务的栈示意图:

高地址
+-------------------+     +-------------------+
|     Task 1 TCB    |     |     Task 2 TCB    |
|  (pxTopOfStack)   |     |  (pxTopOfStack)   |
+-------------------+     +-------------------+
|        ...        |     |        ...        | <--- 栈底 (创建时的起始地址)
|   (未使用空间)     |     |   (未使用空间)     |
|-------------------|     |-------------------|
|   Saved R4        |     |   Saved R4        |
|   Saved R5        |     |   Saved R5        |
|       ...         |     |       ...         |
|   Saved R11       |     |   Saved R11       |
|   Saved EXC_RETURN|     |   Saved EXC_RETURN|
|   Saved xPSR      |     |   Saved xPSR      |
|   Saved PC        |     |   Saved PC        | <--- 关键!决定了回来时从哪里执行
|   Saved LR        |     |   Saved LR        |
|   Saved R12       |     |   Saved R12       |
|   Saved R3        |     |   Saved R3        |
|   Saved R2        |     |   Saved R2        |
|   Saved R1        |     |   Saved R1        |
|   Saved R0        |     |   Saved R0        |
+-------------------+     +-------------------+ <--- 栈顶 (pxTopOfStack 当前指向的位置)
低地址

注:栈中寄存器的保存顺序是由ARM的异常进入/退出机制硬件定义的。


4 上下文切换的详细流程(图解)

FreeRTOS的上下文切换通常由两种事件触发:

  1. 系统节拍中断(SysTick): 用于时间片轮转调度。

  2. 任务主动请求切换: 如调用 taskYIELD(), vTaskDelay()

其核心流程利用了PendSV异常。

流程图

步骤详解(配合流程图):

  1. 触发调度(SysTick中断):

    1. SysTick定时器中断发生,CPU中断当前任务(假设为TaskA)。

    2. 硬件自动将xPSR, PC, LR, R12, R0-R3这些寄存器压入TaskA的任务栈(使用PSP)。同时,LR被设置为特殊值EXC_RETURN(例如0xFFFFFFFD),表示返回时使用PSP并切换回线程模式。

    3. CPU跳转到SysTick中断服务程序(ISR)执行。

  2. 请求延迟切换:

    1. 在SysTick ISR中,操作系统增加时钟 tick,并判断是否需要任务切换。

    2. 如果需要切换,并不立即执行,而是通过设置NVIC的ICSR寄存器来挂起PendSV异常。PendSV的优先级被设置为最低。

    3. SysTick ISR执行完毕并退出。

  3. 执行延迟切换(PendSV异常):

    1. 由于SysTick优先级高,PendSV优先级低,CPU会先返回到TaskA的上下文继续执行几条指令,然后才响应挂起的PendSV异常。

    2. CPU再次中断,进入PendSV异常处理程序。此时,软件需要手动保存TaskA的剩余上下文(R4-R11)到TaskA的栈中。

    3. 将TaskA当前的PSP值(指向它栈中完整上下文的位置)保存到TaskA的任务控制块(TCB)中。

    4. 调度器选择下一个要运行的任务(假设为TaskB),并从TaskB的TCB中获取它的栈指针(PSP)。

    5. 使用TaskB的PSP,手动从TaskB的栈中恢复之前为TaskB保存的R4-R11寄存器。

    6. 将TaskB的栈指针载入CPU的PSP寄存器。

  4. 返回新任务:

    1. PendSV异常服务程序执行BX LR指令返回。这里的LR值是进入PendSV时由硬件设置的EXC_RETURN

    2. 硬件检测到EXC_RETURN,知道这是一个从异常返回线程模式且要使用PSP的操作。于是,硬件自动从TaskB的栈(PSP)中弹出之前保存的R0-R3, R12, LR, PC, xPSR。

    3. 由于PC被恢复为TaskB之前被中断时的指令地址,CPU自然就跳转到TaskB的代码继续执行。所有寄存器的值都和TaskB被切换出去时一模一样,这就是“现场恢复”。


5 为什么可以回来继续正常工作?

关键在于任务栈和任务控制块(TCB) 的完美配合。

  1. 完整保存: 任务被切换出去时,其完整的运行“现场”(所有寄存器的值)被无一遗漏地保存到它自己的栈中。PC的值被保存,意味着程序执行点的位置被记录了下来。

  2. 独立存储: 每个任务的上下文都存储在自己独立的栈中,互不干扰。

  3. 准确恢复: 当任务再次被调度时,操作系统准确地从其TCB中找到它的栈指针,然后严格按照与保存时相反的顺序,将寄存器值从栈中弹出恢复到CPU寄存器中。

  4. PC的作用: 当最后恢复PC寄存器时,CPU的执行流就自然而然地回到了该任务上次被中断时的那条指令地址,从而实现了“无缝衔接”,就像从未被中断过一样。

总结与关系

  • MSP: 给“特权级”代码用(内核、中断服务程序)。在异常处理期间,CPU自动切换使用MSP。

  • PSP: 给“用户级”代码用(各个任务)。任务切换的本质就是改变PSP指向的栈空间,并保存/恢复栈上的内容。

  • PC: 决定了程序的执行流。保存和恢复PC是任务能“回来”的核心。

  • LR: 在异常发生时,扮演双重角色。一方面作为普通的链接寄存器,另一方面存储EXC_RETURN这个魔数,指导CPU如何进行异常返回(用MSP还是PSP)。

  • 任务栈: 是任务的“记忆体”,保存了任务的全部运行上下文。两个任务有两个完全独立的栈。

这种利用硬件异常机制(特别是PendSV)来实现上下文切换的设计,是FreeRTOS等RTOS在Cortex-M内核上能够既高效又可靠运行的关键。

http://www.dtcms.com/a/542976.html

相关文章:

  • 了解一下kernel6.12中cpu_util_cfs_boost函数的逻辑
  • 2018年网站开发技术建设论坛网站
  • 北京红酒网站建设徐汇企业网站建设
  • 网站策划编辑专业的南昌网站建设
  • 南宁网站设计vs网站开发平台
  • php本地建站工具网站优化知识
  • 买了阿里云怎么做网站网站与支付宝对接
  • 一个网站怎么做提现自动到账360免费建站搜索引擎收录吗
  • 网站框架优化太原cms建站系统
  • pc网站的优势上海网站开发设计培训
  • 专业的免费网站建设哪家苍南哪里有网站建设公司
  • 昆山城市建设投资有限公司网站无锡网站网页设计培训
  • 访问量大的网站选择多少流量的服务器何时宁波制作网站企业
  • 医疗器械类网站前置审批材料模板手机设计logo软件免费
  • 学校网站建设与管理开鲁网站seo免费版
  • 智能优化网站动感相册制作免费模板下载
  • 建设银行临夏分行网站网站收录
  • 工商年检在哪个网站做叫人建设网站要注意什么问题
  • 做推广要知道的网站中山市建设局网站
  • 织梦网站备案哈尔滨市工程建设招投标网
  • h5技术做网站福田网站建设-信科网络
  • 重庆网站seo案例dw网页设计下载
  • 网站建设宀金手指花总十四青海城乡建设厅网站
  • 珠海市网站建设哪家好四平市城市建设档案馆网站
  • 做房产网站能赚钱吗搜索引擎seo关键词优化效果
  • 微信网站建设费记什么科目徐州建站
  • 什么叫做门户网站藁城 网站
  • 上海最专业的网站建设公司排名全网媒体整合推广平台
  • 青岛网站建站嘉兴市做外贸网站的
  • 自己做自营网站浙江省建设培训中心的网站