开关机操作

来源:互联网 发布:高处不胜寒读音知乎 编辑:程序博客网 时间:2024/05/04 18:42

 

                                                                           开关机操作

 

本文使用的是JZ47xx的MIPS CPU,系统平台为公司内部的,因此有一定的局限性。

 

一.关机操作

 

   关机操作分为两种,一种是睡眠,另一种是深度睡眠.深度睡眠是在进入睡眠之后的一段时间(由系统设置的时间)内执行的.

 

睡眠操作

 

1.调用SleepEnterRequest函数进入睡眠

 

SleepEnterRequest函数的操作流程如下

1)停止向当前窗口发送paint消息

2)清除所有paint消息队列中的消息

3)获取所有存在的进程的信息

4)把所有进程的主窗体插入sleeplist

4)向所有进程的主窗体发送睡眠消息

5)置上一个关机标志位bLogoPass

2.结着程序会跑到IdleSleep中完成

 

    IdleSleep有如下操作

1)检测到bLogoPass,创建一个线程,运行睡眠的logo程序,并等待logo程序退出

    2)logo程序退出后再创建一个线程,向所有设备驱动发送睡眠消息(设备驱动收到这个消息后会关闭设备或做其他动作)然后调用MachineStandby函数进入睡眠

 

注:进入睡眠只是把一些外围设备的电源时钟关掉,CPU还是正常运转.睡眠只是在MachineStandby里面循环执行,等待唤醒.如果长时间不被唤醒将进入深度睡眠模式(CPU断电).

    当然此时也还没有退出IdleSleep函数.

 

深度睡眠

 

在睡眠的时候RTC时钟还在正常的跑,CPU不断的计数,当计数到达用户设置的深度睡眠时间时就调用MachiePowerOff进入深度睡眠模式

以下是MachinePowerOff的工作

1)等待串口输出完毕

2)设置闹铃唤醒

3)操作RTC,强制CPU掉电

 

二.开机操作

开机有两种情况对应着以上的睡眠模式和深度失眠模式.把从睡眠模式开机叫做唤醒开机,从深度睡眠模式开机叫做上电开机.

 

唤醒开机

 

    机器进入睡眠模式,还未进入深度睡眠模式的时候,按下Power键,就是唤醒开机.

    1)在睡眠模式下,CPU不停地检测Power键,如果发现Power键按下.立即向所有外设驱动发送唤醒消息.外设收到消息后立即重新初始化进入工作状态.

2)接着想SleepList中的进程的主窗体发送唤醒消息,,并从SleepList中删除之,恢复窗体的正常工作状态.

 

注:唤醒起始就是睡眠的反过程.唤醒之后程序才推出IdleSleep函数.

 

上电开机

 

机器进入深度睡眠模式,此时CPU已经掉电,此时按下Power键,外部电路会给外部设备控制器和CPU供电,上电开机的第一条指令是从固定的地址0x1FC00000处取并运行.此处的代码是固件(firmware),CPU出场时就固化好了.firmware的功能是把nand flash中的Boot程序载入SDRAM的0地址处(线性地址是0x80000000处).

 

1)BOOT

 

boot程序对GPIO,PLL,SDRAM,INAND,串口进行简单的初始化,然后从NAND中把loader程序载入SDRAM的0xA0600000处,并跳转到0xA0600000出运行

2)LOADER

 

loader先对cache,nand,键盘等初始化,然后检测当前电压,电压正常就开始把系统的IMG文件载入SDRAM中是0x80000000处,也就是SDRAM的起始位置.然后跳转到0x80000400处开始执行.

 

3)系统启动

 

系统的第一条指令从0x80000400出开始执行,初始化cache,初始化协处理器,初始化堆栈,初始化TLB,以上过程都在汇编程序中执行.接下来进入BootMain(C语言)

BootMain中调用KernelMain开始对内核进行初始化(内存,中断,设备驱动,MMU,GUI,进程管理,文件系统等)初始化最后是启动开机LOGO(LOGO结束前会启动桌面程序),形象的开机终于出现了.

 

注: 上电开机有几个地方要留意

1)Boot的第一条指令是在0x80000000的线性地址处开始执行的.因为0xA0000000~0xC0000000这段地址空间是uncache 和 unmaped的。

,此时代码中并没有对cache初始化。为什么不是0xA0000000处开始执行?

JZ47xx的MCU在0x1f7c00000处执行的代码,已经对cache,sdram,nand进行简单的初始化。

 

2)系统IMG的第一条指令为什么在0x80000400处?

因为前面的地址被CPU用来当做异常中断等的固定入口地址.

 

4)reset的行为和上电开机是一摸一样的,但是RTC的某个位会记录下当前的开机是reset开机还是上电开机.