WINCE6.0+S3C6410睡眠和唤醒的实现
- 格式:doc
- 大小:1.12 MB
- 文档页数:45
如何设置电脑自动休眠和唤醒电脑自动休眠和唤醒是一项实用的功能,它可以帮助用户节省能源,延长电脑的使用寿命,并且提供更好的用户体验。
在本文中,我们将介绍如何设置电脑自动休眠和唤醒功能。
一、什么是电脑自动休眠和唤醒功能电脑自动休眠和唤醒功能是指电脑在一段时间不使用后会自动进入休眠状态,以节省能源和延长硬件寿命。
同时,在需要使用电脑时,可以通过设置的方式将电脑从休眠状态唤醒,以便能够快速进入工作状态。
二、设置电脑自动休眠功能1. 打开控制面板首先,点击电脑桌面左下角的Windows开始按钮,在弹出的菜单中选择“控制面板”。
2. 进入电源选项设置在控制面板的界面中,找到并点击“硬件和声音”选项,然后选择“电源选项”。
3. 设置休眠时间在电源选项设置界面中,找到“计划”设置,点击“更改计划设置”。
4. 更改电源计划设置在更改计划设置界面中,找到并点击“更改高级电源设置”。
5. 设置休眠时间间隔在高级电源设置界面中,找到“睡眠”选项,展开该选项,并找到“在以下时间后进入睡眠”选项。
设置你想要的休眠时间间隔,例如,你可以选择设置为15分钟,30分钟或者1小时。
6. 应用设置完成设置休眠时间后,点击“确定”按钮,退出高级电源设置界面和计划设置界面。
三、设置电脑自动唤醒功能1. 进入BIOS设置电脑自动唤醒功能的设置需要在BIOS里进行,所以需要在电脑开机时进入BIOS设置。
2. 定位唤醒设置选项在BIOS设置界面中,使用方向键将光标移动到“电源”或者“节能”选项,找到“唤醒设置”选项。
3. 开启唤醒设置进入唤醒设置界面后,找到并启用“USB唤醒”,这样当你连接外设(如鼠标或键盘)时,电脑就会自动唤醒。
4. 查看唤醒事件在唤醒设置界面,还可以查看电脑已经设置的唤醒事件,你可以根据需要对其进行修改或者删除。
5. 保存并退出BIOS设置完成电脑自动唤醒功能的设置后,按照BIOS界面的提示,保存设置并退出BIOS。
四、注意事项在设置电脑自动休眠和唤醒功能时,需要注意以下事项:1. 应根据实际需求设置合理的休眠时间间隔,避免频繁的休眠和唤醒对电脑硬件造成损害。
如何在Windows中设置系统睡眠模式在Windows中,系统睡眠模式是一种能够让计算机在长时间不使用的情况下进入低功耗状态的功能。
通过设置睡眠模式,用户可以在不关闭计算机的情况下节省能源,并且快速地恢复到之前的工作状态。
本文将介绍如何在Windows中设置系统睡眠模式。
一、打开电源和睡眠设置要设置系统睡眠模式,首先打开电源和睡眠设置。
您可以通过以下步骤进行操作:1. 打开“控制面板”,可以通过在开始菜单中搜索“控制面板”来找到它。
2. 在控制面板中,找到并点击“电源选项”。
3. 在弹出的窗口中,点击“更改计划设置”旁边的“更改计划设置”链接。
二、调整睡眠模式设置在打开的计划设置窗口中,您可以对睡眠模式进行调整。
以下是可以进行设置的参数:1. 时间设置:通过调整“更改计算机睡眠时间”来设置计算机在闲置一段时间后进入睡眠模式。
您可以选择不同的时间间隔,以适应您的需求。
2. 电源按钮和盖子的行为:您还可以设置当您关闭电源按钮或合上电脑盖子时的行为。
通过点击左侧的“更改高级电源设置”链接,您可以进一步调整这些设置。
三、高级电源选项设置在高级电源选项设置中,您可以进一步调整系统睡眠模式的设置。
以下是可以进行设置的参数:1. 休眠后唤醒计算机:在“睡眠”选项下,您可以选择系统在何种条件下自动唤醒,比如在按下键盘或鼠标时唤醒。
2. 休眠电源计划:通过点击左侧的“更改高级电源设置”链接,您可以进入更高级的设置,例如硬盘的休眠时间、USB选择性暂停等。
四、保存设置在您完成设置之后,别忘了点击窗口底部的“确定”按钮来保存您的更改。
这样,您的Windows系统就会按照您的设定在一段时间不使用后进入睡眠模式。
总结通过在Windows中设置系统睡眠模式,您可以有效地节省能源并保护电脑硬件。
睡眠模式可以让您在短时间内快速恢复到之前的工作状态,同时确保在您离开计算机时不丢失任何数据。
通过按照以上步骤进行设置,您可以根据自己的需求来调整睡眠模式的相关参数,从而实现更加智能和高效的用电管理。
基于S3C2440和Windows CE5.0的嵌入式设备休眠唤醒技术研究王延慧;江志农【摘要】就休眠唤醒技术实现过程中的难点进行了深入研究,并针对S3C2440开发板提出了两种可行的低功耗休眠模式唤醒实现方法:外部中断唤醒和RTC中断唤醒.将这两种方法应用于一款基于S3C2440和WindowsCE 5.0的嵌入式智能巡检分析诊断仪,仪器运行稳定、效果理想.【期刊名称】《微型机与应用》【年(卷),期】2010(029)016【总页数】3页(P24-26)【关键词】嵌入式;休眠唤醒;S3C2440;Windows CE【作者】王延慧;江志农【作者单位】北京化工大学,诊断与自愈工程研究中心,北京,100029;北京化工大学,诊断与自愈工程研究中心,北京,100029【正文语种】中文【中图分类】TP316.7嵌入式系统应用中降低设备功耗以提高续航能力是其设计的热点[1]。
在休眠状态,系统处于最低电流消耗状态,同时仍维持存储区中的内容,为了减少能量消耗和延长电池寿命,需要让处理器定期进入或退出休眠模式[2]。
Windows CE作为一个广泛应用于嵌入式设备上的操作系统,提供了完善的电源管理功能。
其中,休眠唤醒便是一个重要的功能。
本文在结合S3C2440硬件基础上分析休眠唤醒过程,分别采用外部中断唤醒和RTC中断唤醒两种方法实现了休眠唤醒,并给出了具体实现代码。
根据相应唤醒需求,将这两种方法应用于北京化工大学诊断与自愈工程研究中心的一款基于S3C2440和WindowsCE 5.0的嵌入式智能巡检分析诊断仪,结果表明能准确达到实际的设置要求,效果良好。
1休眠唤醒过程分析对于电源控制逻辑模块,S3C2440有多种电源管理方案以针对须执行的任务保持最优的电源消耗。
S3C2440中的电源管理模块对应 4种模式:NORMAL模式、SLOW 模式、IDLE模式和SLEEP模式。
在SLEEP模式下,电源管理模块关闭内部电源,因此,CPU和内部逻辑模块都没有电源消耗,但除了此模式下的唤醒模块。
如何设置电脑自动休眠和唤醒在当今数字化时代,电脑已成为人们生活中不可或缺的一部分。
然而,长时间使用电脑不仅消耗大量的能源,还对眼睛和身体健康造成潜在威胁。
为了节省能源和保护健康,设置电脑自动休眠和唤醒功能是非常重要的。
在本文中,我们将介绍如何在Windows和Mac操作系统中设置电脑自动休眠和唤醒。
一、Windows操作系统中设置电脑自动休眠和唤醒1. 打开“控制面板”在Windows操作系统中,点击开始菜单并搜索“控制面板”。
在搜索结果中,点击“控制面板”来打开设置窗口。
2. 进入“电源选项”在控制面板中,找到“硬件和声音”选项并点击进入。
然后,在硬件和声音窗口中,点击“电源选项”。
3. 配置电源计划在电源选项中,你可以看到系统已经内置了几种不同的电源计划。
选择一个合适的电源计划,然后点击“更改计划设置”。
4. 设置休眠时间在更改计划设置窗口中,你可以设置电脑在一段时间后自动休眠。
在“更改计算机睡眠时间”选项中,选择一个合适的时间,然后点击“保存更改”。
5. 设置唤醒时间若想让电脑在休眠后自动唤醒,点击“更改高级电源设置”。
在弹出的对话框中,找到“睡眠”选项并展开。
然后,找到“允许唤醒计算机”的子选项,并确保其处于启用状态。
点击“应用”后,点击“确定”以保存设置。
二、Mac操作系统中设置电脑自动休眠和唤醒1. 进入“系统偏好设置”在Mac电脑中,点击左上角的苹果图标,然后选择“系统偏好设置”来打开设置窗口。
2. 进入“节能”在系统偏好设置中,找到“节能”选项并点击进入。
3. 配置休眠时间在节能选项中,你可以设置电脑在一段时间后自动休眠。
在“电脑休眠”滑块下方,选择一个合适的时间,然后关闭设置窗口。
4. 设置唤醒时间若想让电脑在休眠后自动唤醒,点击“计划”选项卡。
然后,勾选“在指定的时间自动启动或关闭电脑”。
点击“睡眠”选项卡,在左下方的“启动或唤醒”下拉菜单中选择你想要的时间。
设置完成后,关闭设置窗口。
基于S3C6410的嵌入式系统休眠与唤醒策略设计与实现宋丽华;战颖;简阳;张鑫磊;鲍世昆【期刊名称】《计算机工程与科学》【年(卷),期】2014(36)5【摘要】系统休眠与唤醒作为电源管理的关键技术之一,实现了处理器功耗模式的切换和设备电源管理的间接管理.根据S3C6410处理器模块的特性和Windows Embedded CE 6.0电源管理驱动结构,研究并实现了嵌入式系统休眠与唤醒;同时,还对唤醒源设置这样的关键问题进行了研究,最后对该休眠与唤醒策略进行了功能验证和性能分析.实验结果表明,本设计具有良好的稳定性和有效性.通过对休眠唤醒在系统的电源管理过程中发挥的作用进行了定量分析,不失一般性,本设计可为其他嵌入式系统功耗控制提供参考解决方案.【总页数】7页(P790-796)【作者】宋丽华;战颖;简阳;张鑫磊;鲍世昆【作者单位】北方工业大学信息工程学院,北京100144;北方工业大学信息工程学院,北京100144;北方工业大学信息工程学院,北京100144;北方工业大学信息工程学院,北京100144;北方工业大学信息工程学院,北京100144【正文语种】中文【中图分类】TP303.3【相关文献】1.基于冗余节点休眠和分阶段唤醒策略的传感器网络三维覆盖控制方法 [J], 蒋鹏;陈峰2.基于Linux嵌入式系统的S3C6410和ADS1298R的SPI接口驱动的实现 [J], 汤沁;徐学军;彭地卓;李骥3.基于 S3C6410嵌入式系统的以太网接口设计与实现 [J], 范春雷;丁群4.基于S3C6410嵌入式系统的以太网接口设计与实现 [J], 范春雷;丁群;5.基于场景识别的电动汽车唤醒、休眠策略设计 [J], 徐志峰; 孙江辉; 张兆龙; 李玉军因版权原因,仅展示原文概要,查看原文内容请购买。
基于WINCE6.0+S3C6410的背光驱动1.硬件电路设计基于PWM来调整背光亮度的硬件设计电路如下图所示:图12.基于PWM的控制原理我们使用S3C6410的定时器1来输出PWM信号来调整背光亮度,见PWM定时器部分的描述图23.软件实现3.1定时器1的时钟值的确定1)PCLK本设计中采用ARM主频为533MHZ,HCLK=133MHZ,PCLK=66MHZ,至于这个值的确定见时钟控制器部分。
2)PCLK时钟的第一级分频值见图2的描述,也就是8位Prescaler 0的值的确定,见相关寄存器TCFG0的描述图3代码中的实现如下:图4图4中,我们选择定时器1的Prescaler 0的值为0x3,根据给出的公式:图5这样算出PCLK始终经过第一级分频之后的时钟频率为66MHZ/(3+1)=16.5MHZ。
3)PCLK时钟的第二级分频值见图2的描述,可知每个定制器都有自己的时钟分割器,分频值为1/1、1/2、1/4、1/8、1/16或者是TCLK0作为定时器1的时钟源,图4中,我们选择的是1/8的分频系数,见相关寄存器TCFG1的描述图6结合图5,这样我们就可以算出定时器的时钟频率为16.5 MHZ/8=2.0625MHZ,同时可以算出定时器时钟周期为=0.4848us。
3.2定时器控制寄存器TCON的自动重新装载位和手动更新位下图是TCON寄存器中的相关描述图7在代码中的内容见图4,下面大概描述这两位的作用:1)自动重新装载位当定时器1的下降寄存器的值下降到0的时候,只有使能了自动重新装载位,也即置1,TCNTB1寄存器的值才能自动重新装载到下降寄存器中,从而开始下个周期,才能输出周期新的PWM信号。
2)手动更新位只有手动更新位置1的时候,TCNTB1和TCMPB1的值才会装载到TCNT1和TCMP1,也即下降寄存器和比较寄存器中。
但是在我们开启定时器的时候,需要对手动更新位清零,否则不会有PWM周期信号输出。
现代电子技术Modern Electronics Technique2021年3月15日第44卷第6期Mar.2021Vol.44No.60引言根据资料显示[1],目前大多数婴儿床都是在婴儿床上配置摄像头,父母或监护人通过手机远程查看婴儿状态,这种婴儿床功能单一,婴儿哭闹时并不能了解是何种原因哭闹。
相比之下智能调控婴儿床的设计与实现[2]可以检测尿床报警,自动摇床,但是功能不强大,不能实现远程监测和控制。
目前市场上有各种各样的智能婴儿床,但是床体不方便携带。
基于以上问题,该文提出一种婴儿监护系统方案可以使用便携式充电设备进行供电,不仅可以放在床上使用,还可以在婴儿推车上使用,通过连接WiFi 的方式即可进行连网。
基于S3C6410婴儿看护系统由硬件和软件两大部分组成。
硬件是由S3C6410和一些外围电路组成,软件是基于手机端APP 和云服务器及S3C6410下软件共同构成软件系统。
1基于S3C6410智能婴儿房的硬件设计硬件部分由S3C6410处理器、NAND FLASH 、SDRAM 、音频电路、USB 接口、WiFi 模块、电源模块、温湿度及电机模块组成[3⁃5]。
图1为智能婴儿房硬件设计图。
其中,NAND FLASH 用来存储uboot.bin 、linux 内核和根文件系统,音频模块采用WM9714L 芯片进行音频的编解码,WiFi 模块采用WM⁃R⁃GM⁃09芯片,电机模块DOI :10.16652/j.issn.1004⁃373x.2021.06.004引用格式:牛坚,李宥谋.基于S3C6410婴儿监护系统设计与实现[J].现代电子技术,2021,44(6):16⁃19.基于S3C6410婴儿监护系统设计与实现牛坚,李宥谋(西安邮电大学计算机学院,陕西西安710121)摘要:目前大多数家庭中婴幼儿的看护都为人工看护,婴儿需要一直在父母或监护人身边,给父母和看护者带来不便。
为了解决这个问题,设计并实现一款基于S3C6410婴儿监护系统。
UP_CUP 6410使用手册 WinCE6.0 V1.0北京博创兴业科技有限公司2009-09-15IUP-CUP6410使用手册winCEIIUP-CUP6410使用手册winCEIII目 录第一章 UP-CUP6410烧写入门 (1)1.1烧写准备 (1)1.1.1硬件设置 (1)1.1.2软件配置 (2)1.2烧写BootLoader (6)1.2.1 烧写Stepldr.bin到NandFlash (6)1.2.2烧写Eboot.bin到NandFlash (8)1.2.3从NandFlash启动BootLoader (9)1.3烧写WinCE6.0系统镜像 (11)1.3.1 Eboot配置及NK.bin烧写 (11)1.3.2 启动WinCE6.0 (12)第二章 Windows CE 6.0系统入门 (13)2.1 Windows CE 6.0环境搭建 (13)2.1.1安装VS2005 (13)2.1.2安装Windows CE 6.0 (17)2.1.3安装BSP (27)2.1.4配置样例工程 (28)2.2 Windows CE 6.0系统使用简介 (34)2.2.1触摸屏校准 (34)2.2.2与PC同步 (36)2.2.3利用剩余NandFlash空间 (37)2.2.4摄像头测试 (40)2.2.5音频测试 (42)UP-CUP6410使用手册winCEIVUP-CUP 6410使用手册winCE第一章 UP-CUP6410烧写入门本章你将学会如何从零开始将光盘中自带的WinCE样例内核烧写到UP-CUP6410平台上,并使其正常启动。
1.1烧写准备在烧写系统镜像之前,我们先了解一下如何正确连线并配置相关的软硬件资源。
1.1.1硬件设置烧写WinCE6.0系统(包括Bootloader)需要连接电源线、串口线、USB-Device线以及网线(网线用于PB下载内核,将在以后的章节介绍,本章主要介绍使用USB烧写内核到实验平台),连接方法如图1-1-1,电源键位置如图1-1-2。
WINCE6.0+S3C6410睡眠和唤醒的实现备注:本文基于Real6410开发板来实现PmSetSystemPowerState_I()->PlatformSetSystemPowerState()1.睡眠模式及唤醒1.1睡眠模式描述下面见datasheet的描述图1在睡眠模式下,除了ALIVE和RTC模块外的所有硬件逻辑是通过外部电源调节器关闭的。
睡眠模式支持最长的待机时间,在这种模式下,用户软件必须保存所有的内部状态到外部存储设备中。
ALIVE模块等待一个外部唤醒事件并且RTC保存时间信息。
用户软件可以配置唤醒源和I/O引脚的状态。
在睡眠模式下,系统电源域如下图:图2在此我们看CPU的datasheet是怎么描述ALIVE模块的:图31.2进入睡眠模式系统如何进入睡眠模式呢,我们还是来看datasheet的描述吧:图4备注:这里的SYSCON是指system controller,也即系统控制器。
1)用户软件通过设置PWR_CFG[6:5]=2’b11配置ARM1176 STANDBYWFI进入睡眠模式。
2)用户软件通过MCR指令(MCR p5,0,Rd,c7,c0,4)来产生STANDBYWFI信号。
3)系统控制器请求总线控制器完成当前的AHB总线的处理。
4)AHB总线控制器当前的总线处理完成后,发送应答信息给系统控制器。
5)系统控制器请求DOMAIN-V完成当前的AXI总线处理。
6)AXI总线控制器当前的总线处理完成后,发送应答信息给系统控制器。
7)因为外部存储器(这里是指SDRAM,我的理解)的内容在睡眠模式下必须要保存起来(如果不保存起来,系统在唤醒的时候就无法从原来进入睡眠的地方唤醒),系统控制器请求外部存储控制器进入自刷新模式(这样就可以让保存在SDRAM中的内容得以保持)。
8)当存储控制器进入自刷新模式后发送确认信息。
9)如果PLL还在使用,系统控制器改变时钟源由PLL输出改为外部振荡器输出。
10)系统控制器关闭PLL操作和晶体振荡器。
11)最后,系统控制器通过让XPWRRGTON引脚维持在低电平来禁用外部电源源,XPWRRGTON信号控制外部调节器。
图51.3唤醒源下图描述了系统各种模式下的唤醒源图61.4退出睡眠模式当我们激活唤醒源后,系统会进入退出睡眠模式的流程,如下所示:图71)系统控制器通过维持XPWRRGTON引脚为高电平来启动外部电源,并且通过配置PWR_STABLE寄存器来配置等待时钟稳定输出的时间。
2)系统控制器产生系统时钟,包括HCLK、PCLK和ARMCLK。
3)系统控制器释放复位信号,包括HRESETn和PRESETn。
4)系统控制器释放ARM复位信号。
2.供电电路图82.1ALIVE模块供电电路图9ALIVE模块的电压范围是1.15到1.25V2.2RTC模块供电电路图10RTC模块工作电压范围是1.7到3.3VMemory interface VDDm0工作电压范围是1.7到3.6,VDDm1是1.75到2.7V 2.33.睡眠和唤醒的具体实现3.1睡眠的过程3.1.1进入睡眠的几种方式一般情况下,我们有两种方式让系统进入睡眠状态,如下:1)在系统没有用户相互并且没有其他工作的情况下,在时间timeout后系统自动进入睡眠模式,见common.reg中相关的注册表信息:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts]; @CESYSGEN IF PM_PM_DEFAULT_PDD"ACUserIdle"=dword:3c ; in seconds"ACSystemIdle"=dword:12c ; in seconds"ACSuspend"=dword:0 ; in seconds"BattUserIdle"=dword:3c ; in seconds"BattSystemIdle"=dword:b4 ; in seconds"BattSuspend"=dword:12c ; in seconds; @CESYSGEN ENDIF ; PM_PM_DEFAULT_PDD; @CESYSGEN IF PM_PM_PDA_PDD; @CESYSGEN ENDIF ; PM_PM_PDA_PDD当然了,如果"BattSuspend"=dword:12c 该为"BattSuspend"=dword:0,那么系统就不会自动进入睡眠模式。
从上面的信息可知,如果没有用户的动作,1分钟后系统会进入user idle;此后三分钟进入system idle;接着过了6分钟进入suspend idle,也就是说第11分钟开始的时候进入suspend idle。
2)选择”开始->挂起”。
3)我们在应用程序和驱动中调用下面函数SetSystemPowerState( NULL, POWER_STATE_SUSPEND, POWER_FORCE )起始这种方式和2)本质是一样的。
3.1.2 BSP包中进入睡眠的流程我们以上面提到的第3)中方式来学习和描述,在按键驱动中我们检测到按下GPL9/EINT17按下时,我们调用SetSystemPowerState函数来让系统进入睡眠模式:图11这里调用了SetSystemPowerState函数之后,在BSP包中的流程如下:⑴电源管理器(PM)会根据common.reg中下面的内容[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\State\Suspend\{98C5250D-C29A-4985-AE5F-AFE5367E5006}]"Default"=dword:4 ; D4获取到系统睡眠(也即挂起)状态对应的系统电源level为D4,这样,PM就通知支持电源管理的驱动先对这个电源状态做相应的处理,比如对于背光驱动来说,因为其支持电源管理,所以PM会以控制码调用BKL_IOControl函数IOCTL_POWER_SET,见下图图12那么背光驱动BackLightSetState函数是如何响应这个电源请求的呢?见其实现:图13一般系统中有多个驱动支持电源管理,那么先调用哪个呢?系统根据每个驱动注册表信息的Order值来调用的,这个值越大,就越先被调用,处理完支持电源管理驱动的XXX_IOControl()之后,根据同样的依据原则来调用每个驱动的XXX_PowerDown函数,此后,就会调用OEMPowerOff()来让系统进入睡眠模式。
⑵调用OEMPowerOff()函数此函数在s3c6410_sec_v1\oal\power\off.c下定义,其实现如下:1)调用BSPPowerOff函数此函数的动作如下:①调用VFL_Sync函数来等待NAND FLASH擦除或写操作完成。
②调用ChangeClockDivider()函数来改变时钟,包括MFC、PCLK、HCLK*2和ARMCLK的时钟。
③关闭RTC控制,当然了,如果是需要通过RTC来唤醒的,这里就不能关闭。
④调用BSPConfigGPIOforPowerOff函数来根据硬件设计的具体情况配置GPIO口为相应的模式,原则就是减少功耗。
⑤调用S3C6410_WakeUpSource_Configure函数来配置唤醒源,这里的唤醒源是GPN11/EINT11,配置为下降沿触发,此函数体如下:图14结合图6,可知MMC0到MMC2不是睡眠模式下的唤醒源,故关闭,在本设计中,只用到按键作为唤醒源。
2)保存VIC(Vectored Interrupt Controller,矢量中断控制器)寄存器。
3)保存DMAC(DMA控制器)寄存器。
4)保存GPIO寄存器。
5)保存系统控制器寄存器,也即从0x7E00F000到0x7E00FA0C地址对应的寄存器。
图15 6)控制USB 电源图16 下面我来看LCD接口的配置图:图177)调用OALCPUPowerOff函数让CPU进入睡眠模式此函数在src\oal\oallib\startup.s中定义,下面按照调用的顺序来学习这个函数图181)保存SVC模式下的寄存器到堆栈中。
这里先大概学习一下啊堆栈,堆栈是在RAM存储器(这里是指SDRAM)中开辟的一个特定的存储区域,在这个区域,信息的存入(入栈)和取出(出栈)是按照“后进先出”的原则进行存取的。
在子程序调用时要保存返回地址,在中断处理过程中要保存断点地址,进入子程序和中断处理后还要保留通用寄存器的值。
子程序执行完毕和中断处理完毕返回时,又要恢复通用寄存器的值,并分别将返回地址或断点地址恢复到指令指针寄存器中。
这些功能都要通过堆栈来实现。
堆栈的一端是固定的(也就是堆栈有个基地址),另一端是浮动的(但有堆栈的上限地址)。
堆栈固定端是堆栈的底部,称为栈底,堆栈浮动端可以存入或取出数据。
向堆栈存入数据时,新存入的数据存放在之前存入数据的上面,而最先存入的数据被存到堆栈底部,最后存入的数据堆放在堆栈顶部,这称为栈顶。
由于堆栈顶部是浮动的,为了指示现在堆栈中存放数据的位置,就需要一个堆栈指针SP(R13),它始终指向堆栈的顶部,这样,堆栈中数据的存入和取出都由SP来指示。
堆栈指针通常可以指向不同的位置,堆栈可以分为满栈和空栈两种,当栈指针指向栈顶元素,也即最后一个入栈的数据元素时,称为满(Full)栈;当栈指针指向与栈顶元素相邻的一个可用数据单元时,称为空(Empty)栈。
另外根据数据栈的增长方向分为递增栈和递减栈两种,当数据栈向内存地址减少的方向增长时,称为递减(Descending)栈;当数据栈向内存地址增加的方向增长时,称为递增(Ascending)栈。
综合这两种特点可有一下4中数据栈:满递减栈:FD(Full Descending)空递减栈:ED(Empty Descending)满递增栈:FA(Full Ascending)空递增栈:EA(Empty Ascending)由于要遵守ATPCS规则(ARM-Thumb Produce Call Standard,ARM和Thumb程序调用基本规则),而ATPCS规定数据栈为FD(Full Descending,满栈递减)类型,所以当一个数据(32位)入栈时,SP(R13)的值-4向下浮动指向下一个地址,即新的栈顶;当数据出栈时,SP(R13)的值+4向上浮动指向下新的栈顶。