T3 高精度时钟出现负数问题解决方案

T3 高精度时钟出现负数问题解决方案

问:T3 高精度时钟出现负数问题解决方案
1、问题描述

      问题现象主要表现为连续获取两次高精度时钟,时间差为负数。即后一次获取的时间小于前一次。现象出现随机性较高,属于偶发事件。连续多次获取可复现此问题。后一次出现时间约比前一次少 1ms 左右,即一个 tick 值。

答: 基本解决思路就是使用锁使得获取时刻无法出现在更新tick操作和清中断操作中间。但由于更新 tick 操作和获取操作都在 base 中施加内核锁。因此不可以再重复加锁否则会造成死锁。目前的解决方案是将清中断操作添加在内核回调函数 bspTickHook() 中,因为 bspTickHook() 会和更新 tick 操作一同施加内核锁,这样可以保证获取操作无法插入清中断和更新 tick 操作之间,即可以解决问题。经多次实验,此方案实测有效。

1、原因分析

      高精度时钟的基本原理是在 tick 中断基础上使用定时器当前值校正时间。定时器使用 T3 的 timer0,timer0 从一个默认值递减到 0 表示 1ms。并在递减到 0 时产生中断,定时器恢复到默认值。中断处理中主要执行更新 tick 值操作。获取高精度时钟分为如下两种情况:

1)获取时刻发生在两个 tick 中断之间

      获取时刻发生在两个 tick 中断之间,这时需要通过读取定时器计数值计算从上一次中断发生到当前经过的时间 △t,再在当前 tick 值的基础上加上△t得出高精度时钟值。如图 2.1所示。


                                            图 2.1:获取时刻发生在两个 tick 中断之间

2)获取时刻发生在某个 tick 中断处理时

      当获取时刻发生在 tick 中断处理时情况就比较复杂,主要是硬件定时器会复位,△t 的值是当前中断发生到现在时间差,即少了一个 tick 值。这里做了特殊处理,在获取高精度时间时判断中断状态寄存器中的值,若此时发生中断则将最终的结果加上一个 tick,如图 2.2所示。

                                         图 2.2:获取时刻发生在某个tick中断处理时

 

      从上述第二种情况可以看出实际的结果会被清中断的时刻所影响。若清中断操作在更新 tick 操作之前,且获取时刻在两者之间,则会缺少 1 个 tick,如图 2.3所示。


                                                             图 2.3:清中断在前

      若清中断操作在更新 tick 操作之后,且获取时间在两者之间,则会多计算 1 个 tick,如图 2.4所示。

                                                            图 2.4:清中断在后


    • Related Articles

    • SylixOS x86 HPET 定时器驱动

      HPET(High Precision Event Timer) 俗称高精度定时器,最低时钟频率为10MHZ,而且定义了比较严格的精确度(间隔 >= 1 毫秒的允许 +-0.05% 的误差,间隔 <=100 微妙的允许 +-0.2% 的误差)。x86 架构中一般支持 HPET 定时器。在 HPET 体系结构中规定 32 个定时器组成一个定时器块,最多可支持 8 个块,也就是 256 个定时器。实际设备中可使用的定时器数量可以从相关寄存器中查询。每个定时器均可以单独配置成一个中断。 在 x86 ...
    • 1ms 定时器如何进行调度执行的呢?

      1ms 定时器可以创建多个吗?如果可以的话,多个 1ms 的中断函数是如何进行调度执行的呢? 1、非 rms 调度的定时器可以创建多个 2、多个定时器是通过查分时间链的方式进行调度的。 若同一时间多个 timer 同时到期的情况,那就是通过链式方式进行调度,按注册顺序。 前一个 timer 的中断函数未执行完,不会执行下一个 timer 的中断函数,这是个回调处理。 如果一个 1ms 的定时器函数在 1ms 内执行不完,后面的会被延迟。
    • 在 SylixOS INT8 类型是否带有符号

      Q:在 SylixOS INT8 类型是否带有符号 INT8 类型在 BSP 中定义, SylixOS 要求 INT8 型为有符号 8 位整形, 有些编译器默认 char 为无符号数, 所以在 BSP 中定要将 INT8 定义为 signed char 型.  (int8_t 类型由 INT8 定义, C99 中要求 int8_t 为有符号数)INT8 类型在 BSP 中定义, SylixOS 要求 INT8 型为有符号 8 位整形, 有些编译器默认 char 为无符号数, 所以在 ...
    • SylixOS 进程资源回收机制

      SylixOS 中使用 t_reclaim 线程回收进程资源。t_reclaim 线程在系统启动时创建,优先级较低,为 253。线程执行流程非常简单,即接收消息队列值并执行 vprocReclaim() 进行回收,消息队列数据位待回收的线程控制块指针。如下图所示。 vprocReclaim() 执行流程如下: 1)等待所有线程被彻底删除; 2)回收线程全部资源(打开的文件、信号量、时间、定时器等); 3)释放模块资源; 4)回收进程控制块资源 通过调用 __resReclaimReq() ...
    • SylixOS 下内核线程简介

      1.概述      内核线程共享内核所有资源,例如内核文件描述符表,而进程内线程则共享使用进程内所有资源,例如进程文件描述符表。SylixOS 对于一些系统级功能是通过使用内核线程进行管理使用。 2.内核线程      基于 SylixOS Version:2.1.6 的内核,在终端上输入命令“ts”如图 2.1所示。                                                  图2.1  “ts”命令 2.1 内核线程工程       ...