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

S12X内存映射控制(MMC)详解:原理、配置与跨页编程实战

1. 项目概述:为什么需要内存映射控制?

在嵌入式开发,尤其是汽车电子和工业控制领域,我们常常面临一个经典矛盾:处理器的寻址能力有限,但应用对存储资源的需求却在不断增长。以经典的16位微控制器为例,其原生地址总线通常为16位,这意味着CPU能直接“看到”的地址空间只有64KB。然而,一个稍微复杂点的车身控制或电机驱动程序,其代码量轻松超过100KB,再加上运行时数据、标定参数、故障记录等,64KB的空间捉襟见肘。

直接扩展地址总线宽度(比如从16位升到24位)是一种解决方案,但这意味着指令集、总线结构乃至整个芯片架构都要大改,成本高昂。另一种更巧妙、更经济的方法,就是内存映射控制。它的核心思想是“分时复用”:CPU仍然使用16位地址进行寻址,但通过一个额外的“页寄存器”来动态切换当前64KB窗口在更大物理内存中的位置。这就好比一本厚厚的书(8MB物理内存),你一次只能翻开看一页(64KB逻辑视图),但你可以通过一个书签(页寄存器)快速翻到任何一页。S12X系列微控制器的内存映射控制模块,就是负责管理这本书和书签的“图书管理员”。

这个MMC模块远不止是简单的地址转换器。它身兼数职:作为总线仲裁者,它要公平地协调CPU和后台调试模块对内存资源的访问请求,防止冲突;作为安全卫士,它管理着芯片的操作模式(如正常模式、特殊模式),并在CPU试图访问不存在的“空白页”(未实现地址)时,果断拉响系统复位警报;作为内存调度员,它为CPU和BDM维护着各自独立的“本地视图”和“全局视图”,并通过GPAGE、PPAGE、RPAGE、EPAGE等一系列寄存器,精细地控制着Flash、RAM、Data Flash等资源的可见性与访问权限。

理解MMC,是深入掌握S12X架构、编写高效可靠嵌入式代码、乃至进行复杂系统调试的基石。无论你是正在评估芯片选型的系统工程师,还是埋头写驱动、调Bug的软件工程师,亦或是需要通过BDM进行底层诊断的测试工程师,MMC的工作原理都是你必须啃下的硬骨头。接下来,我将结合手册内容与多年实战经验,为你层层拆解S12X MMC的机制、应用与那些手册上不会写的“坑”。

2. 核心概念与架构解析

在深入寄存器细节之前,我们必须先建立清晰的顶层视图。S12X的内存管理体系可以概括为“两种视图,一套转换”。

2.1 核心术语与两种地址空间

首先,明确几个关键术语,这是阅读手册和后续交流的基础:

  • 本地地址:基于64KB内存空间的16位地址。这是CPU执行绝大多数普通指令(如LDD,STAA)时“眼中”的地址范围(0x0000 - 0xFFFF)。
  • 全局地址:基于8MB内存空间的23位地址。这是芯片内部所有物理资源(Flash, RAM, 寄存器等)的真实、唯一的物理地址。
  • 分页:将8MB的全局地址空间划分为128个“块”,每块64KB,称为一个“页”。通过指定页号,CPU就能通过16位本地地址访问到该页内的任何一个字节。
  • 资源/目标:指代芯片内部的各种存储和外设模块,如程序Flash、数据RAM、Data Flash、寄存器等,它们是地址访问的最终目的地。

MMC的核心工作,就是在这两种地址视图之间进行实时、动态的翻译。CPU发出一个16位的本地地址,MMC根据当前一系列页寄存器的设置,将其与某个页号拼接,生成一个23位的全局地址,从而定位到具体的物理资源。

2.2 MMC模块的功能全景图

根据手册描述,MMC模块绝不是一个简单的地址加法器,它提供了以下关键功能:

  1. 分页能力:支持全局8MB内存地址空间,这是其最核心的功能。
  2. 总线仲裁:在多个主设备(主要是CPU和BDM)之间进行仲裁,决定谁先访问共享资源。
  3. 并发访问:允许不同主设备同时访问不同的内部资源(例如CPU读Flash,BDM写RAM),提升系统效率。
  4. 访问冲突解决:当多个主设备试图访问同一资源时,由MMC裁定访问顺序。
  5. MCU操作模式控制:通过MODE寄存器(受外部MODC引脚影响)管理芯片是运行在正常单芯片模式还是特殊单芯片模式,这直接影响内存映射和调试功能。
  6. MCU安全控制:在芯片处于安全状态时,对某些寄存器的写操作会被禁止。
  7. 独立内存映射:为CPU和BDM维护各自独立的一套内存映射方案,这使得调试器可以在不干扰用户程序视图的情况下访问内存。
  8. ROM控制:通过控制位选择启用片内Flash还是ROM。
  9. 非法访问复位:在单芯片模式下,如果CPU访问了一个未实现的全局地址(即不属于任何片上模块的地址),MMC将触发系统复位。这是一个重要的安全特性,防止程序跑飞后产生不可预知的行为。

2.3 操作模式:运行、等待与停止

MMC的行为也随芯片的整体功耗模式而变化:

  • 运行模式:MMC全功能工作。
  • 等待模式:CPU暂停指令执行,但外设和中断系统可能仍在工作。MMC保持功能,以便响应可能唤醒CPU的中断访问。
  • 停止模式:芯片进入最低功耗状态,系统时钟停止。MMC不工作。此时任何内存访问都无法进行,必须通过外部中断或复位来唤醒系统。

> 注意:在Stop模式下,不仅CPU停止,MMC也停止工作。这意味着如果你在进入Stop模式前配置了特殊的页寄存器值,唤醒后这些配置依然有效,但MMC本身在Stop期间是不响应的。在设计低功耗唤醒流程时,需要确保唤醒后的初始访问地址是有效的,避免触发非法访问复位。

3. 寄存器详解与地址映射机制

寄存器是程序员与MMC交互的直接接口。理解每个比特位的含义,是灵活运用内存映射的关键。

3.1 核心页寄存器:GPAGE, PPAGE, RPAGE, EPAGE

这组寄存器是地址翻译的“公式参数”。

3.1.1 全局页索引寄存器

GPAGE寄存器用于全局指令。当CPU执行以G开头的指令(如GLDAA,GSTX)时,它会将GPAGE[6:0]作为高7位,与指令中的16位本地地址拼接,直接形成23位全局地址。

全局地址[22:0] = {GPAGE[6:0], CPU本地地址[15:0]}

使用场景:当你需要随机访问8MB空间内任意地址时,使用全局指令最直接。例如,从一个固定的全局地址读取配置数据块。

MOVB #0x20, GPAGE ; 设置全局页为0x20 (全局地址高7位) LDX #0x1234 ; 设置偏移地址 GLDAA X ; 从全局地址 0x20_1234 加载数据到累加器A

> 实操心得:全局指令虽然方便,但通常比本地指令执行周期长。在频繁访问的循环或实时性要求高的中断服务程序中,应优先使用分页窗口机制(PPAGE等),而非频繁修改GPAGE并调用全局指令。

3.1.2 程序页索引寄存器

PPAGE寄存器用于管理程序Flash(或ROM)的分页窗口。它将256个16KB的Flash页中的一页,映射到CPU本地地址空间的0x80000xBFFF这个16KB的“窗口”中。

全局地址[22:0] = {PPAGE[7:0], 1‘b0, CPU本地地址[13:0]} ; 注意PPAGE[7:0]直接作为高8位,本地地址[15:14]被忽略,由固定的’0b10‘替代(对应窗口基址0x8000)。

关键特性

  • CALL/RTC指令专用CALLRTC指令能自动保存、恢复和写入PPAGE,这是实现跨页函数调用的硬件基础。
  • 固定页:地址0xC000-0xFFFF的16KB空间是固定的,对应PPAGE=0xFF的Flash页。中断向量表必须放在这个区域或其它非分页区域,因为中断发生时,CPU无法自动切换PPAGE
  • 复位值PPAGE复位后默认为0xFE,这确保了从0x4000开始的线性Flash空间在复位后是连续可访问的。
3.1.3 RAM页索引寄存器

RPAGE寄存器用于管理RAM的分页窗口。它将256个4KB的RAM页中的一页,映射到CPU本地地址空间的0x10000x1FFF这个4KB的窗口。

全局地址[22:0] = {RPAGE[7:0], 2‘b00, CPU本地地址[11:0]} ; RPAGE[7:0]作为高8位。

> 重要警告:RPAGE = 0x00时,RAM页窗口0x1000-0x1FFF映射到的全局地址区域与寄存器空间(0x0000-0x07FF)的全局地址重叠。这意味着通过这个窗口写入数据,可能会意外修改到控制寄存器,导致系统行为异常!务必在初始化时避免将RPAGE设为0x00,或在访问此窗口时极度小心。

3.1.4 数据Flash页索引寄存器

EPAGE寄存器用于管理数据Flash(EEPROM模拟)的分页窗口。它将256个1KB的数据Flash页中的一页,映射到CPU本地地址空间的0x08000x0BFF这个1KB的窗口。

全局地址[22:0] = {EPAGE[7:0], 3‘b000, CPU本地地址[9:0]} ; EPAGE[7:0]作为高8位。

3.2 其他关键寄存器

3.2.1 直接页寄存器

DIRECT寄存器定义了直接寻址模式的基址。在直接寻址模式下,指令中只包含一个8位偏移地址,CPU会将其与DIRECT寄存器提供的8位高地址(构成地址的高字节)组合,形成完整的16位有效地址。它同时影响本地和全局映射。

有效地址[15:0] = {DIRECT[7:0], 指令中的8位偏移}

注意:在非特殊模式下,此寄存器通常只能写入一次。这要求你在程序初始化早期就确定好直接页的位置,通常将其指向一块频繁访问的RAM区域,以优化代码效率和速度。

3.2.2 MMC控制寄存器

MMCCTL1寄存器包含几个功能控制位:

  • MGRAMON:控制Flash存储控制器的暂存RAM是否在全局内存映射中可见。
  • DFIFRON:控制数据Flash的信息行是否在全局内存映射中可见。
  • PGMIFRON:控制程序Flash的信息行是否映射到全局地址0x40_0000-0x40_3FFF。 这些位通常用于芯片出厂配置、安全特性或特殊调试场景,在一般应用编程中较少触及。
3.2.3 模式寄存器

MODE寄存器仅有一位有效位MODC,它反映了芯片复位时MODC引脚的状态,决定了MCU是运行在正常单芯片模式还是特殊单芯片模式。特殊模式主要用于芯片编程、调试和安全操作。一旦芯片处于安全状态,对此寄存器的写操作将被阻塞。

3.3 地址映射示意图解与“窗口”思维

手册中的图3-17和3-19是理解S12X内存布局的钥匙。我们将其转化为更易理解的“窗口”模型:

想象CPU的64KB本地地址空间是一面有多个“窗户”的墙。

  1. 固定窗(无法移动):

    • 0x0000-0x07FF:寄存器窗。直接看到芯片的各个控制寄存器。
    • 0x0C00-0x0FFF:保留窗。
    • 0x2000-0x2FFF:固定RAM窗1(对应RPAGE=0xFE)。
    • 0x3000-0x3FFF:固定RAM窗2(对应RPAGE=0xFF)。
    • 0x4000-0x7FFF:固定Flash窗(线性空间,复位后PPAGE=0xFE映射至此)。
    • 0xC000-0xFFFF:固定Flash窗(对应PPAGE=0xFF),中断向量表必须放在这里
  2. 可滑动窗(通过寄存器控制):

    • 程序Flash窗(16KB):位于0x8000-0xBFFF。通过修改PPAGE寄存器,这个窗口可以“滑动”浏览256个不同的16KB Flash页中的任何一个。
    • RAM窗(4KB):位于0x1000-0x1FFF。通过修改RPAGE寄存器,这个窗口可以“滑动”浏览256个不同的4KB RAM页中的任何一个。
    • 数据Flash窗(1KB):位于0x0800-0x0BFF。通过修改EPAGE寄存器,这个窗口可以“滑动”浏览256个不同的1KB数据Flash页中的任何一个。

而8MB的全局地址空间,就是窗外广阔的风景,包含了所有实际的物理存储单元。GPAGE和全局指令,则相当于给了你一个望远镜,可以直接瞄准风景(全局地址)中的任何一点,而无需理会墙上的窗户。

4. 功能描述与核心工作流程

4.1 总线仲裁与并发访问

MMC内部有一个仲裁器,负责处理CPU和BDM同时请求访问同一目标(如Flash控制器)时的冲突。其仲裁规则简单而明确:

  • CPU优先:在绝大多数情况下,CPU的访问请求拥有最高优先级。
  • BDM超时优先:如果BDM的访问请求因等待资源被阻塞超过128个总线周期,仲裁器会暂停当前占用总线的主设备(通常是CPU),将总线访问权授予BDM。这确保了调试器在CPU陷入死循环或长时间不释放总线时,仍然能够介入。

> 调试经验:这个128周期超时机制对调试影响很大。如果你在调试时发现单步执行或读取变量特别慢,有可能是因为你的程序正在频繁访问某个被BDM也需要访问的资源(如Flash),导致BDM频繁触发超时仲裁,抢占总线。在分析实时性要求高的代码段时,需要留意此影响。

4.2 非法访问与系统复位

这是一个重要的安全机制。在单芯片模式下,如果CPU发出的地址,经过MMC翻译后,指向的全局地址没有任何物理资源对应(即“未实现区域”),并且内存保护单元没有报错,那么MMC将触发一个系统复位这意味着什么?如果你的程序因为指针错误、栈溢出等原因跑飞,并开始读取/写入一些随机地址,一旦落到“未实现区域”,系统会被立即复位,而不是继续执行垃圾代码或静默地损坏数据。这有助于将故障控制在可预测的范围内(复位),符合功能安全的要求。> 避坑指南:在初始化阶段,务必正确配置PPAGERPAGEEPAGE的初始值,确保程序初始访问的地址落在有效的“窗口”内。同时,谨慎处理函数指针和数组越界访问。

4.3 对齐访问与未定义行为

手册明确指出:

  1. BDM模块发起的未对齐字访问会被BDM模块自身阻止。
  2. 对RAM最后一个地址的未对齐字访问会被执行,但读取的数据是未定义的。
  3. 任何全局指令对64KB页最后一个地址的未对齐字访问,会被视为访问该页的最后一个字节和第一个字节(即回绕到页首)。> 编程建议:始终确保对字(16位)数据的访问是地址对齐的(偶数地址)。虽然CPU硬件可能支持非对齐访问,但会消耗额外的时钟周期,且在某些边界情况下行为不确定。使用编译器的对齐修饰符(如__attribute__((aligned(2))))来确保关键数据结构的地址对齐。

5. 初始化与应用:CALL/RTC指令与跨页编程

这是S12X MMC应用中最精妙的部分,也是实现超过64KB程序代码管理的核心。

5.1 CALL/RTC指令的硬件自动化

CALLRTC是专为分页内存设计的子程序调用和返回指令。它们与普通的JSR/RTS关键区别在于自动管理PPAGE寄存器

CALL指令执行流程(不可中断):

  1. 将当前PPAGE值暂存到内部临时寄存器,然后将指令中提供的新页值写入PPAGE寄存器。
  2. 计算CALL指令之后的下一条指令地址(返回地址),并将这个16位值压入堆栈。
  3. 将暂存的旧PPAGE值压入堆栈。
  4. 计算子程序的入口地址,更新程序计数器,开始执行新页中的子程序。

RTC指令执行流程(不可中断):

  1. 从堆栈中弹出之前保存的PPAGE值。
  2. 从堆栈中弹出16位返回地址,并加载到程序计数器。
  3. 将弹出的PPAGE值写回PPAGE寄存器。
  4. 从返回地址处继续执行。

> 核心要点:CALL/RTC是原子操作,无需在它们周围开关中断。它们完美解决了跨页调用时上下文(返回地址和页面)的保存与恢复问题。

5.2 链接器与编译器的角色

作为程序员,你几乎不会直接编写CALL指令的机器码。这项工作由链接器完成。你需要做的是:

  1. 告诉链接器内存布局:在链接器命令文件里,明确定义各个代码段(.text)、常量段(.rodata)分别位于哪个Flash页(即哪个PPAGE值对应的全局地址范围)。
  2. 使用正确的函数声明:对于需要跨页调用的函数,编译器(配合链接器)会自动生成CALL指令而非JSR指令。通常,你需要使用特定的修饰符或编译选项来标记“远调用”函数。
  3. 管理页表:链接器会生成一个“页表”,将函数和变量的逻辑地址映射到(PPAGE, 本地地址)对。启动代码需要负责初始化PPAGE,并在必要时切换页。

示例:一个简单的两页程序结构假设你有两个大的代码模块,分别放在Page 0x10和Page 0x11。

// 在链接脚本中,将 module_a.c 的代码链接到 PAGE 0x10 的区域 // 将 module_b.c 的代码链接到 PAGE 0x11 的区域 // module_a.c (位于 Page 0x10) void function_in_page_10(void) { // 做一些事情 } // module_b.c (位于 Page 0x11) // 声明这是一个远函数,编译器/链接器会为其生成CALL/RTC调用序列 __far_func void function_in_page_11(void) { // 做一些事情 function_in_page_10(); // 这里调用另一个页的函数,链接器会处理成CALL }

启动后,PPAGE默认指向0xFE(线性空间)。当主程序(在线性空间)需要调用function_in_page_11时,链接器生成的代码会使用CALL指令,自动将PPAGE切换到0x11。在该函数内部调用function_in_page_10时,又会通过CALL切换到0x10。每个函数返回时,使用RTC恢复调用者的页面。

5.3 中断服务程序与页面管理

黄金法则:中断向量必须指向非分页区域(固定页)的代码。因为中断是异步发生的,CPU在响应中断时,不会、也不可能自动为你保存和切换PPAGE。如果你的中断服务程序入口地址位于分页窗口(0x8000-0xBFFF),而中断发生时PPAGE恰好指向别的页,那么CPU就会跳转到错误的物理地址,导致灾难性后果。

正确做法:

  1. 将所有中断服务程序的入口函数(ISR)放在固定的、非分页的Flash区域(通常是0xC000-0xFFFF0x4000-0x7FFF的线性部分)。
  2. 在ISR内部,如果你需要调用位于其他页的功能函数,可以安全地使用CALL指令,因为ISR的上下文(包括PPAGE)已经被硬件或软件保存。RTC返回时也会正确恢复。

6. 实战配置、常见问题与调试技巧

6.1 上电初始化流程

  1. 配置操作模式:检查MODE寄存器或MODC引脚状态,确认芯片运行在预期模式(通常为正常单芯片模式)。
  2. 初始化直接页:尽早且仅一次地设置DIRECT寄存器,通常指向一块常用的RAM区域,例如0x0800
    MOVB #0x08, DIRECT ; 设置直接页为 0x0800-0x08FF
  3. 设置初始页寄存器:根据你的链接器布局,设置PPAGERPAGEEPAGE的初始值。例如,如果启动代码在固定页,而主循环代码在分页区,可能需要在启动代码末尾切换PPAGE
  4. 配置MMC控制寄存器:根据应用需求,决定是否使能信息行(MMCCTL1相关位),通常保持默认值即可。

6.2 常见问题排查表

现象可能原因排查步骤与解决方案
程序跑飞后系统反复复位CPU访问了未实现地址,触发MMC非法访问复位。1. 检查栈指针初始化是否正确,栈空间是否充足。
2. 检查函数指针、数组索引是否越界。
3. 检查PPAGE/RPAGE/EPAGE寄存器值是否在访问时被意外修改。
跨页函数调用后程序行为异常CALL/RTC使用不当或链接器配置错误。1. 确认被跨页调用的函数已正确声明为“远函数”。
2. 检查链接器脚本,确保函数被分配到正确的物理页,且页号与CALL指令使用的页号匹配。
3. 单步调试,观察CALL执行后PPAGE值是否正确切换,RTC执行后是否正确恢复。
中断无法正常响应或进入错误地址中断向量指向了分页窗口地址。1. 检查链接器脚本,确保所有中断向量地址(0xFFxx,0xFFxx)指向的代码位于固定页(0xC000-0xFFFF)。
2. 确认中断服务程序本体代码也在固定页。
通过BDM读取/写入内存数据错误1. BDM与CPU访问冲突。
2. 使用的地址视图错误。
1. 尝试在CPU暂停(Halt)状态下进行BDM访问。
2. 明确你使用的是CPU本地地址、BDM本地地址还是全局地址。BDM工具有时需要指定正确的“内存映射”或“地址空间”选项。
直接寻址模式指令操作地址错误DIRECT寄存器初始化不正确或被修改。1. 确认DIRECT寄存器在程序早期已正确初始化。
2. 在非特殊模式下,DIRECT寄存器只能写一次,检查是否有代码意外重复写入。

6.3 调试技巧

  1. 利用BDM观察全局地址:高级的调试器(如Lauterbach, iSystem)支持显示全局地址。在查看变量或反汇编时,注意区分显示的是本地地址(如0x8000)还是全局地址(如0x12_8000)。理解当前PPAGE的值是关联两者的关键。
  2. 监控页寄存器:在调试器中,将GPAGEPPAGERPAGEEPAGE添加到监视窗口。单步执行跨页调用时,观察PPAGE的变化是否符合预期。
  3. 内存窗口切换:调试器的内存查看窗口通常允许你选择“地址空间”。练习在“CPU本地视图”、“物理内存(全局)视图”之间切换,并验证同一逻辑地址在不同视图下对应的物理数据是否正确。
  4. 模拟非法访问:在受控环境下(如使用仿真器),可以故意编写代码访问一个已知的未实现地址(例如,在确认芯片RAM只有8KB后,访问0x10_2000),观察系统是否按预期复位。这有助于验证你的硬件和MMC配置是否正确。

理解并熟练运用S12X的内存映射机制,是从单片机编程迈向嵌入式系统设计的关键一步。它要求你不仅关注代码逻辑,更要清晰地把握代码和数据在物理内存中的布局与流动。

http://www.gsyq.cn/news/1555709.html

相关文章:

  • Triton 核心组件之优化管道:让代码“自动跑得快“的幕后功臣
  • 2026合肥手表回收测评:权威合规鉴定,全城靠谱变现保障 - 薛定谔的梨花猫
  • AI伦理与安全技能需求长期稳定位居前三
  • 终极隐私保护:3分钟掌握Portable Secret文件加密神器
  • LPC2387低功耗与电气特性深度解析:从数据手册到稳定设计
  • https://www.cnblogs.com/-1688/p/20655963 - 速递信息
  • 如何让GIMP像Photoshop一样工作:PhotoGIMP终极迁移指南
  • 酒店智能开关怎么选?从面板类型到场景配置的实操指南
  • 2026合肥钻石回收测评:权威鉴定门店与靠谱变现攻略 - 薛定谔的梨花猫
  • OpCore Simplify:5分钟快速生成OpenCore EFI配置的终极解决方案
  • Infoseek品牌公关,全周期护航企业品牌长效声誉资产
  • 一文看懂,从 Prompt 到 Loop 的 AI 工程进化
  • 2026广州黄金回收实测榜单,收的顶稳居榜首,高价靠谱双在线 - 奢侈品回收测评
  • 无锡不锈钢中厚板供应商推荐:2026实测甄选,适配化工/重工/压力容器全场景 - wxxwlm
  • 哈尔滨黄金回收套路大起底,合扬回收实测打破潜规则 - 奢侈品交易观察员
  • 车载诊断实战:DM1故障码的报文配置与解析指南
  • 深度解析 Hermes-WebUI:打造 AI 辅助编程的工程化闭环
  • 【算法精讲】BSGS:从离散对数到密码学实战
  • 2026北京闲置黄金变现|6家实体门店横评,合规渠道避坑复盘优选指南 - 名奢变现站
  • 2026年众智商学院企业学员怎么确认SCMP班期?模块选择和费用核对 - 众智商学院职业教育
  • 2026昆明黄金回收行情解读 正规无套路变现门店测评 - 薛定谔的梨花猫
  • PromQL 速率计算实战:rate、irate、increase 函数在 Counter 监控中的精准选择
  • 【计算机毕业设计案例】基于 Django+Vue 的农场产品溯源管理系统的设计与实现 基于 Django+Vue 的农业农场资源管控系统(程序+文档+讲解+定制)
  • MPC5561电气特性实战解析:从数据手册到稳定设计
  • Havenlon思考录(一):反直觉设计
  • 佛山黄金回收哪家好?2026资质齐全正规机构测评 - 奢侈品回收测评
  • 2026 石家庄黄金回收 6 大实操攻略,行情时机渠道商家一次讲清 - 奢侈品回收测评
  • 2026年金属表面处理清洗剂推荐榜,助你精准选择 - 官方资讯
  • 大数据志愿填报冲稳保搭配策略
  • # 长沙DeepSeek豆包获客服务哪个靠谱? - 速递信息