标签:sylixos 操作系统
MPC8313芯片的Tick实现比较特殊,因为在MPC8313芯片中存在名为Decrementer的寄存器,如图 1.1 Decrementer寄存器所示。
图 1.1 Decrementer寄存器
Decrementer寄存器中保存的数据会每4个总线周期减1,当Decrementer寄存器递减到0时,触发Decrementer异常,CPU会执行异常服务程序。Decrementer的异常服务函数需要在startup.S文件中设置,如图 1.2 startup.S所示。
图 1.2 startup.S
第一步:当Decrementer寄存器递减到0时,触发Decrementer异常,CPU会执行异常服务程序,系统通过异常向量表跳转到archDecrementerInterruptEntry函数。
第二步:archDecrementerInterruptEntry函数会执行archDecrementerInterruptHandle函数,在archDecrementerInterruptHandle中会对Decrementer寄存器进行设置并调用系统的中断服务函数。
第三步:系统的中断服务函数会根据archDecrementerInterruptHandle传入的用户注册的伪中断向量查找用户注册的Tick中断服务函数。
根据上文所述,可以看出MPC8313的系统Tick可以在Decrementer寄存器的基础之上实现。由于Decrementer寄存器的控制接口已经在PowerPC的系统Base中实现,所以笔者无需自己实现,只需要调用系统接口即可。
Tick的实现分以下三个步骤:
第一步:使用非已有中断向量号并且大于255的非负数作为Tick的伪中断向量注册中断,如图 1.3 注册Tick中断所示。
图 1.3注册Tick中断
第二步:声明archDecrementerInit函数,如图 1.4 声明archDecrementerInit所示
图 1.4声明archDecrementerInit
第三步:初始化Decrementer,如图 1.5 初始化Decrementer所示
图 1.5初始化Decrementer
由于系统Tick是基于Decrementer寄存器实现的,所以高速定时器也需要基于Decrementer寄存器实现。
高速定时器实质上是为了补偿系统Tick的不足,用于统计比一个Tick粒度更小的时间。在MPC8313中笔者通过读取Decrementer寄存器中的值来实现高速定时器的功能。
由于Decrementer寄存器无状态位可读取,无法通过读取硬件获得是否产生了Tick中断,因此在base中添加了状态全局变量_G_bTickinterTag,并且在系统进入archDecrementerInterruptHandle时把_G_bTickinterTag置为LW_TRUE。
高速定时器在bspLib.c下的bspTickHighResolution函数实现,如程序清单 2.1 高速定时器所示。
程序清单 2.1高速定时器
VOIDbspTickHighResolution (struct timespec *ptv)
{
REGISTER UINT32uiCntCur,uiDone;
ULONGulCPUId =LW_CPU_GET_CUR_ID();
uiCntCur = ppcGetDEC ();
uiDone = GuiFullCnt - uiCntCur;
/*
* 由于Decrementer寄存器无状态位可读取,无法通过读取硬件获得是否产生
* 了Tick中断,因此在base中添加了状态全局变量_G_bTickinterTag
*/
if (_G_bTickinterTag[ulCPUId] ==LW_TRUE) {
/*
* 这里由于 TICK 没有及时更新, 所以需要重新获取并且加上一个 TICK 的时间
*/
uiCntCur= ppcGetDEC ();
uiDone =GuiFullCnt - uiCntCur;
if (uiCntCur != 0) {
uiDone +=GuiFullCnt;
}
}
ptv->tv_nsec += (LONG)((Gui64NSecPerCnt7 * uiDone) >> 7);
if (ptv->tv_nsec >= 1000000000) {
ptv->tv_nsec -= 1000000000;
ptv->tv_sec++;
}
}无
本文出自 “逍遥蓝云的家” 博客,请务必保留此出处http://xiaoyaolanyun.blog.51cto.com/2586643/1936661
标签:sylixos 操作系统
原文地址:http://xiaoyaolanyun.blog.51cto.com/2586643/1936661