WINCE的挂起和唤醒过程

挂起的过程:


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过程复杂的原因.——我就是这里出了问题,我把wakeup后的地址放在了NK 用的RAM里面,现在修改一下试试
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,恢复所有寄存器,恢复平台之前状态.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值