实验十 系统时间管理
驱动过外围芯片的筒子们都知道,芯片的时序是非常重要的,其实指的无非就是高低电平保持的时间和出现的顺序。尤其是各类总线器件,对时序的要求相当严苛。
那么对于一个操作系统而言,时间管理就显得尤为重要了。
μTenux提供的时间管理函数很简单,不过这里要整清楚系统时间和工作时间。
个人理解,系统时间是指上电初始化后,系统保存的时间,如果芯片自带RTC和电池的话,可以通过修改系统初始化,让系统保存真实世界的时间,那么每次调用tk_get_tim函数,将获得真实世界的时间,如果没有RTC或者支持RTC工作的电池,系统时间则为默认的1985年1月1日0点0时0分;而工作时间是指系统上电后,芯片会不断计时,每次调用tk_get_otm函数,将获得系统自上电以来经历的时间。
理清这两个概念,μTenux的基本时间管理就比较简单了。
实验代码调用的是tk_get_otm,那么获取的时间就应该是上电以来系统经历的时间。
上实验结果图
SYSTIM定义了高位和低位,低位保存时分秒,高位保存年月日。
我这里把高低位全部打印输出,实验代码调用tk_get_otm后,SYSTIM全为0,系统从0开始计时。
实验十 思考题
1) 如果把获取系统工作时间的 tk_get_otm 函数更换为获取系统时间的 tk_get_t im 函数,结果如何 ?
如果直接简单的把tk_get_otm更换为tk_get_tim,其实系统运行的结果和之前的是一样的,没变化。
这里有一点点没有想清楚,内核规范上所写“系统时间表示成从 1985 年 1 月 1 日 0:00:00(GMT) 开始以 ms 为单位的累加”,意思是说如果没有设置系统时间,那么默认时间应该是1985 年 1 月 1 日 0:00:00,但是实际试验的结果是从0000年00月00日0点0分0秒开始计时的。
如果我们调用tk_set_tim来设置系统时间,那就可以获得真实世界的时间了。
修改代码:
增加y、m、d代表年月日(大侠们不要吐槽变量命名方式)
直接将十进制数20130702赋值给otm.hi,用最粗俗的算法,计算年月日。
时分秒的计算比较坑,我尝试了一下,发现算法是这样:otm.lo=(小时*3600+分钟*60+秒)*1000+毫秒.
如果要从22点26分5秒开始作为系统时间,那么otm.lo=(22*3600+26*60+5)*1000+0=80766000=0x4d06340.
run......
2) 如果开发板带 RTC 电池,使用 tk_get_otm 函数和 tk_get_t im 函数的程序结果有没有不同?
手头上的sam3s4c芯片虽然支持RTC,但开发板没有带RTC电池。如果有的话,在系统初始化时调用相关函数,SYSTIM就能共RTC模块获取数据,应该就能始终保持实时的时间。那么调用tk_get_otm 函数和 tk_get_tim 函数,得到的结果肯定就不一样了。个人认为,tk_get_tim受到系统所保存时间的影响,而tk_get_otm只受系统上电时刻的影响。
为了验证想法,调用tk_set_tim模拟系统有RTC电池,然后同时调用tk_get_otm 函数和 tk_get_tim 函数并打印相关信息。
run..run...run......
从结果来看,系统运行时间和系统时间的概念就能很容易厘清了。
如果有RTC电池,这两者的结果肯定就不一样咧。
TBC......