【Qnx】使用ClockCycles完成计时功能

使用ClockCycles完成计时功能

定时器是很多需求场景下,会采用的功能实现。比如

  • 5秒内,进行计数。如果次数达到100次,执行某操作。如果超过5秒, 计数器清零。
  • 某条件触发后,3秒内,忽略从MCU接受的信号。3秒后,使用该信息最新值,进行HMI显示。
  • 状态机超时后的复归等等。

定时器常见的bug

  • 设备时间的改变,可能导致定时器没有预期执行。比如Android系统NTP(网络时间同步)导致的时间跳变情况下。
cpp 复制代码
// 伪代码
Timer timer;
// 表示timer 5秒后超时
// 此时时间是 10:00:00
// 正常:10:00:05的时候会超时
timer.start(5);
// 此时系统时间跳变成8:00:00
// 此timer,会等到2小时候5秒后,才执行
  • 多线程问题。比如timer运行的线程和处理数据的线程,不是一个。就会导致多线程的问题。

解决这个问题,可以考虑使用机器时间、以及加锁,或者让timer和数据处理在一个线程中。

Qnx使用ClockCycles完成计时功能

  • 函数原型
cpp 复制代码
#include <sys/neutrino.h>
#include <inttypes.h>

uint64_t ClockCycles( void );

The ClockCycles() function returns the current value of a free-running 64-bit cycle counter. This is implemented on each processor as a high-performance mechanism for timing short intervals. On Intel, ClockCycles() reads the Time Stamp Counter (RDTSC) and on an ARM 64-bit system, it reads the Generic Timer.

You can use the SYSPAGE_ENTRY(qtime)->cycles_per_sec field to get the number of ClockCycles() increments in one second.

根据Qnx官网的介绍,ClockCycles会返回系统时钟周期(与机器当前时间无关,只与硬件有关)。

并且,SYSPAGE_ENTRY(qtime)->cycles_per_sec表示了1秒钟有多个时钟周期。

利用ClockCycles可以完成计时功能,并且不会因为时间跳变导致问题。

ClockCycles计时功能代码
  • 下面是一段伪代码。利用ClockCycles完成计时功能。
  • 功能:5秒内,判断计数变量,是否达到30次。如果达到,则进行条件A,否则计数清零。
cpp 复制代码
#include <sys/neutrino.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/syspage.h>

int Count = 0;
void MyLoop() {

	uint64_t StartCps = ClockCycles( );
	while(true) {
		if (条件A满足) {
			Count++;
			// 阻塞等待唤醒
		}
		
		uint64_t CurCpsDif =  ClockCycles( ) - StartCps;
		if ( (float)CurCpsDif / SYSPAGE_ENTRY(qtime)->cycles_per_sec >= 5.0) {
			// 5秒超时,计数清零
			Count = 0;
		}
		
		if (Count > 30) {
			执行某段业务代码。
		}
	}

}

int main( void )
{
	MyLoop();
	// 此处启动另一个线程,接收某些通知,并唤醒阻塞
}
相关推荐
ZealSinger7 天前
Go的DefaultClient超时为何总不生效
go·超时·context·net/http·defaultclient
阿钱真强道8 天前
18 嵌入式操作系统 | uloop 定时器:周期任务与网络上报
c语言·定时器·周期任务·uloop
晊晌_h8 天前
IMX6ULL裸机开发:定时器(GPT/EPIT)与UART串口
arm·定时器·arm裸机开发
AAA代码批发商14 天前
Days 50 51 单片机与 i.MX6ULL 定时器对比:Timer、EPIT、GPT 原理与实验
51单片机·定时器·imx6ull·裸机开发
捷瑞电子工坊15 天前
蓝桥杯嵌入式STM32G431定时器入门:从原理到CubeMX配置(LL库)
cubemx·定时器·定时中断·led闪烁·蓝桥杯嵌入式·stm32g431·ll库
阿钱真强道1 个月前
24 极物科技 | DALI协议栈 - 定时器与中断系统
定时器·曼彻斯特编码·极物·极物智能·极物科技·dali协议栈·智慧照明
jufeng13071 个月前
STM32F103 定时器输入捕获实战:测频测周、编码器测速、红外解码全流程拆解
stm32·输入捕获·定时器·编码器
啦啦啦啦啦zzzz1 个月前
时间轮定时器
linux·服务器·网络·c++·定时器
保安大队王队长2 个月前
定时器知识
定时器
Dlrb12112 个月前
ARM---IMX6ULL定时器详解与应用:EPIT与GPT定时器,高精度延时函数
arm开发·gpt·arm·定时器·epit·高精度延时