鸿蒙源码分析(五十六)

WDT相关函数的定义

该文件主要是在time_adapter.c中定义,里面是WDT相关函数的封装(看门狗)

知识介绍

看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗置零,重新开始计数。如果看门狗增加到设定值就认为程序没有正常工作,强制整个系统复位。
工作原理: 使用时,WDT将递增,直到溢出,或称“超时”。除非处于休眠或空闲模式,WDT 超时会强制器件复位。为避免WDT超时复位,用户必须定期用PWRSAV 或CLRWDT 指令将看门狗定时器清零。如果WDT 在休眠或空闲模式下超时,器件将唤醒并从PWRSAV 指令执行处继续执行代码。在上述两种情况下,WDTO 位(RCON<4>)都会置1,表示该器件复位或唤醒事件是由于WDT超时引起的。如果WDT 将CPU从休眠或空闲模式唤醒,“休眠”状态位(RCON<3>)或“空闲”状态位(RCON<2>)也会置1,表示器件之前处于省电模式。
在正常操作期间,一次WDT超时溢出将产生一次器件复位。当器件处于休眠状态时,一次WDT超时溢出将唤醒器件,使其继续正常操作(即称作WDT 唤醒)。对WDTE 设置位清零可以永久性地关闭WDT。
后分频器分配完全是由软件控制,即它可在程序执行期间随时更改。
为避免发生不可预测的器件复位,当从Timer0 预分频器的分配改为WDT 后分频器的分配时,必须执行下列指令序列。即使WDT 被禁止,也要执行这个指令序列。

代码分析

下面几个函数是看门狗的基本函数:有开始、重置、关闭等

#define MS_PER_SECOND 1000  //采样频率
//函数封装
int32 WDT_Start(uint32 ms)
{
    
    
    return WDT_Reset(ms);
}
//重置函数
int32 WDT_Reset(uint32 ms)
{
    
    
    (void)ms;
    //使用void定义变量,可以防止变量未被使用时候的报错和警告
    return EC_FAILURE;
}

int32 WDT_Stop(void)
{
    
    
    return EC_FAILURE;
}

这里是计算进程运行时间的一个函数,主演计算公式在return中体现。

//来获取进程的运行时间
uint64 SAMGR_GetProcessTime(void)
{
    
    
    uint32 tick = osKernelGetTickCount();
    //获取 RTOS 内核计数。
    uint32 ticksPerSecond = osKernelGetTickFreq();
    //获取 RTOS 内核系统定时器频率。
    if (ticksPerSecond == 0) {
    
    
        return 0;
    }
    return (uint64)tick * MS_PER_SECOND / ticksPerSecond;
    //内核计数乘以
}

以上为time_adapter.c中的内容,以及看门狗模块的简单介绍感谢阅读和点赞

猜你喜欢

转载自blog.csdn.net/m0_46976252/article/details/120429678