欢迎加入Wince技术讨论群QQ#326444254

不管任何方式的系统挂起,最终都会调用OEMPowerOff()函数来实 现.OEMPowerOff()函数由OEM来完成,这个函数也许会位于 power.c或者off.c的文件中.OEMPowerOff()是OEM来实现的,代码和流程也许不同,但基本按照下面的方法来完成.

挂起的过程:

1.先进行平台相关的动作,比如清屏,设置AD,usb等.

2.保存芯片所有的寄存器值到一个静态数组(就是堆栈中)

3.设置io,关闭kitl等

4.呼叫OALCPUPowerOff()进行挂起.

OALCPUPowerOff()是一个位于startup.s中的汇编函数,它按照下面的流程实现挂起功能

5.保存通用寄存器r4-r12,lr到堆栈

6. 保存wakeup后的地址,MMU寄存器,进入各模式将sp和lr寄存器保存到内存RAM的某一个位置,这个位置是由config.bib指定保留的.为 什么不象之前一样保存到堆栈呢?因为系统唤醒后跳转到reset开始执行,这时候堆栈还没有初始化.这也是poweroff过程复杂的原因.

7.计算刚才保存的数据块的检验和并保存到GSTATUS3寄存器.(GSTATUS3和GSTATUS4是状态寄存器,挂起直到唤醒过程都会保存里面的值)

8.禁止中断.

9.清cache

10.使能唤醒中断,能唤醒可以是外部中断0,1,2,或者RTC中断

11.设置sdram进入自刷新模式,最终cpu进入power off状态

唤醒的过程:

cpu 的power off模式和其他睡眠模式不同,其他的睡眠模式唤醒后会从睡眠处继续运行,而power off模式唤醒后是从reset处执行.reset有3种可能情况,1.正常的上电冷启动,包括reset信号线有效造成的reset.2.看门狗失效造 成的reset.3.power off之后被外部中断或者rtc中断唤醒的reset.在reset之后可以根据GSTATUS2寄存器来判断是否从power off唤醒.还有一个问题,不论何种方式reset,都是先执行bootloader的代码,所以唤醒过程需要bootloader的参与配合.具体流 程:

1.外部中断或者rtc中断唤醒cpu进入bootloader

2.bootloader 中停止sdram的自刷新模式,然后跳到内核开始地址.有些bootloader会做的更多,因为前面我们把数据都保存到了ram中的某处,事实上只要知 道这个ram地址就可以取得数据进入唤醒过程.所以有些bootloader会直接去唤醒.我认为这并不好,增加了bootloader的依赖性,层次间 的耦合性也高了.

3.检查checksum,因为之前设置sdram处于自刷新状态,在poweroff期间sdram里面的数据会保持,增加checksum是有必要的安全措施.

4.从RAM取得之前保存的参数,其中包含了唤醒后应该跳转的地址,和MMU的配置数据以及各个模式的sp和lr.

5.启动mmu

6.跳到唤醒后的新地址.

7.进入各个模式恢复sp和lr.

8.恢复r4-r12,lr

9.跳转到lr,即相当于OALCPUPowerOff()返回,返回到OEMPowerOff()中.

10.打开kitl,恢复所有寄存器,恢复平台之前状态.

唤醒过程实际是一个挂起的逆过程.如此,系统成功唤醒,所有运行的应用程序不知道自己被系统挂起过而继续运行.

wince挂起和唤醒相关推荐

  1. wince挂起和唤醒_relayon

    不管任何方式的系统挂起,最终都会调用OEMPowerOff()函数来实 现.OEMPowerOff()函数由OEM来完成,这个函数也许会位于 power.c或者off.c的文件中.OEMPowerOf ...

  2. 四极管 整理wince挂起和唤醒(suspend/wakeup)以及实现关机功能文章

    学习wince挂起和唤醒以及关机功能,后面再把自己调试心得记下来. 以下文章来源: http://hi.baidu.com/mikenoodle/blog/item/3d659a16bb9ef656f ...

  3. wince挂起和唤醒(suspend/wakeup)

    管任何方式的系统挂起,最终都会调用OEMPowerOff()函数来实现.OEMPowerOff()函数由OEM来完成,这个函数也许会位于 power.c或者off.c的文件中.OEMPowerOff( ...

  4. 关于Qt中线程的挂起和唤醒问题

    为了平台的可移植性,现在好多公司或开发者都在用Qt开发,但是Qt开发文档有一个不非常理想的问题是,有些问题描述的不是太详细,特别是涉及到线程的挂起,唤醒.和sleep()等问题. 在Qt开发中,有许多 ...

  5. java线程挂起唤醒_java线程技术6_线程的挂起和唤醒[转]

    转自:http://blog.chinaunix.net/uid-122937-id-215913.html 1. 线程的挂起和唤醒 挂起实际上是让线程进入"非可执行"状态下,在这 ...

  6. usb 进入suspend_USB的挂起和唤醒 (Suspend and Resume)

    USB协议的第9章讲到USB可见设备状态[Universal Serial Bus Specification, Section 9.1.1, Pg 239],分为连接(Attached),上电(Po ...

  7. C# 线程的挂起与唤醒 (AutoResetEvent,ManualResetEvent)

    如果说C#和C++有什么不同,博主不得不说,对于异步的支持程度是C#的一一个伟大的进步. 其实早期的C++都没有异步,并发的概念.博主第一次使用C++创建异步程序的时候,是使用boost库的内容进行实 ...

  8. Ubuntu20.04 挂起无法唤醒

    问题现象是长时间不操作或合盖后打开黑屏无法操作,只能强行关机. 问题原因是触发了挂起,挂起后无法唤醒,解决办法是关闭挂起. 关闭自动挂起 在显示应用程序-设置-电源中,关闭自动挂起 关闭合盖挂起 1. ...

  9. windows线程挂起与唤醒,SuspendThread与ResumeThread的一些相关问题

    总结一下,创建进程有好多种方法, CreateThread:这个函数WIN32api函数,最好不要用这个函数,会造成一些错误(原因还是很深刻的) AfxBeginThread:这个方法是MFC特有的创 ...

最新文章

  1. 李开复:天才将占领创业领域
  2. JS实现生成一个周对应日期数组
  3. 关于Dapper.NET的相关论述
  4. elementui表格宽度适应内容_elementui表格中的列怎么实现自适应列宽
  5. 【转】Python自动化测试 (一) Eclipse+Pydev 搭建开发环境
  6. 使用 vsftpd 服务传输文件
  7. linux看注册的定时任务,Linux下定时任务的查看及取消
  8. 如果您已经熟悉K8s,现在不妨试试K9s
  9. 7.10 18级多校适应训练1题解
  10. S-PTAM:Stereo Parallel Tracking and Mapping论文笔记
  11. Netty(四十一) - 心跳(heartbeat)源码剖析
  12. 错宗复杂的进程标识PID
  13. 年薪50W京东软件测试工程师的成长路 —— 我们都曾一样迷茫
  14. matlab在概率统计中的应用
  15. 仓储物流行业英文术语、缩略词
  16. 读书笔记专业投机原理
  17. 服务器 无线 有线,【干货】有线无线一体化移动网
  18. 解决谷歌浏览器不能打开Axure原型的问题
  19. 朴素贝叶斯分类(Python)
  20. Pandas之unique和nunique傻傻分不清楚

热门文章

  1. 鼓励研究生参加数学建模竞赛_请问,全国研究生数学建模竞赛获奖的话,申请上海户口是否可以加分啊?...
  2. 生活,又怎能鱼和熊掌兼得?
  3. Debian与Ubuntu到底有什么不同,应该如何选择?
  4. CSS做个五颜六色的风车
  5. vsco和lr哪个好_我为什么选择了Lightroom,抛弃了VSCO、snapseed?(附508个预设)
  6. 计算机桌面用什么实木板好,这才叫实木桌面,教你怎么做出来,拿去不谢
  7. 爱普生Epson EPL-N3000 打印机驱动
  8. 计算机实现原理专题--逻辑门
  9. 【计算机网络】TCP为什么需要4次挥手
  10. 故宫景点功课17:内廷西路(中)