wince5+2440的睡眠和唤醒

说明:网上转载,也没有说明作者是谁,如果作者看到我转载了,请说一声,我会把你的大名写上。

不管任何方式的系统挂起,最终都会调用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,恢复所有寄存器,恢复平台之前状态.

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

类似的帖子:http://topic.csdn.net/u/20081106/17/e1706866-71da-4044-b624-b28fad4d7fb1.html?seed=1939272327

wince5+2440的睡眠和唤醒——转载相关推荐

  1. wince5+2440的睡眠和唤醒

    转自:http://blog.csdn.net/gooogleman/archive/2009/03/26/4026968.aspx 说明:网上转载,也没有说明作者是谁,如果作者看到我转载了,请说一声 ...

  2. WINCE6.0+S3C2443睡眠和唤醒(sleep and wake up)的实现

    1. 系统进入睡眠状态的过程 1.1 硬件相关电路 我们的产品使用GPF0/EINT0作为系统进入睡眠和从睡眠中唤醒的唤醒源,如下图所示: EINT0作为唤醒源,而EINT0在S3C2443的data ...

  3. java 进程睡眠_Linux进程的睡眠和唤醒简析

    1.Linux进程的睡眠和唤醒 在Linux中,仅等待CPU时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为TASK_RUNNING.一旦一个运行中的进程时间片用完, ...

  4. 黑苹果睡眠无法唤醒_电脑睡眠后无法唤醒怎么办?

    有过电脑睡眠后不能开机情况的小可爱,请在评论区打卡,S姐好想知道,有多少人跟我一样啊! 作为一个懒癌晚期且不想抢救的人,每天下班电脑是绝对不会选择关机的!我浏览器里那么多资料窗口,文章刚写了一半,表格 ...

  5. windows睡眠(休眠)唤醒助手_一劳永逸解决WIN10所有睡眠问题

    1.初级阶段,解决因硬件的唤醒事件 powercfg -lastwake 查看上次唤醒电脑的设备 哪些硬件能唤醒电脑? powercfg /devicequery wake_armed 列出现在可以唤 ...

  6. linux查看睡眠进程,关于 Linux 进程的睡眠和唤醒 ,来看这篇就够了~

    1 Linux 进程的睡眠和唤醒 在 Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING.一旦一个运行中的进程时 ...

  7. 联想thinkpad待机怎么唤醒_笔记本睡眠怎么唤醒【步骤介绍】

    相信很多人都会遇到这么一种情况,电脑用到一半突然有事情被朋友叫去或者有什么事情需要出去一下,又不想关机,想着回来又得重新开机嫌麻烦.这时候就会选择给电脑休眠.也有些亲忘记了电脑就会自动进入到睡眠状态. ...

  8. 联想thinkpad待机怎么唤醒_联想电脑睡眠无法唤醒_联想电脑睡眠怎么唤醒

    2016-12-22 16:31:07 你好,你这现象看着像电脑过热,电脑用了多久了,如果久的话就去清理下机箱的灰尘,因为机箱风扇狂转只能是温度过高,你下个鲁大师看看平时电脑温度在多少,一般电脑自我保 ...

  9. 笔记本合上盖子不能从睡眠中唤醒解决办法

    一.命令 管理员身份运行cmd后: powercfg -h off //这个是关闭休眠,关闭重启后hiberfil.sys会删除,节省空间 睡眠是在内存中,休眠是在硬盘中. 因为电源设置里,没接电源是 ...

最新文章

  1. oracle convertobject,oracle.sql進行轉換。TIMESTAMPLTZ@71d9d55b Java時間戳
  2. “智源论坛Live”报名 | 清华大学高天宇:实体关系抽取的现状和未来
  3. php 枚举类型比较,java 枚举类比较是用==还是equals?
  4. Netflix Archaius用于物业管理–基础知识
  5. HDU 4619 Warm up 2 (多校)
  6. 厉害了!浙大研发出踹不倒四足机器人“绝影”,中国版波士顿动力来了
  7. ActionScript 3.0 编程
  8. 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常...
  9. Voxengo音频插件合集:Voxengo Total Bundle Mac
  10. 5月14日 打印100以内与7有关的数
  11. Android 中指纹识别的使用
  12. java的duplicate用法_Java FloatBuffer duplicate()用法及代码示例
  13. Visual Studio 2015 Enterprise - 企业版 - 简体中文
  14. js实现form的submit请求
  15. 华为设备路由器直连路由器配置
  16. python量化策略——混合择时策略(动量效应+pe_ttm、pb估值+美林时钟)——股债轮动
  17. C++ —— 宏对于简化类接口的奇技淫巧
  18. 高性能图片服务器–ZIMG
  19. ai决策_人工智能时代的决策
  20. ubuntu更新软件包

热门文章

  1. 快递100实时查询接口C#
  2. Linux系统Debian安装
  3. 台湾地震 涉及大陆光缆
  4. 免费无账号直接使用openAI的chatGPT
  5. 创客学院知识巩固-05ARM硬件工作原理
  6. ipxe无盘服务器,ipxe uefi pxe HTTP启动文件及启动菜单的个人体会
  7. 放弃笨重的 IDE,转而尝试 Emacs
  8. C++中%lu,%u,%hu,%i,%o,%x,%X,%E/e,%c,%s表示含义
  9. WARNING: Published ports are discarded when using host network mode
  10. 【数据结构】小项目:航班查询系统