当前位置: 首页 > news >正文

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

使用ClockCycles完成计时功能

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

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

定时器常见的bug

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

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

Qnx使用ClockCycles完成计时功能

  • 函数原型
#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,否则计数清零。
#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();// 此处启动另一个线程,接收某些通知,并唤醒阻塞
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 零拷贝技术在现代编程语言和中间件中的应用
  • ROS 编程入门的介绍
  • LabVIEW 可以同时支持脚本编程和图形编程
  • 细胞分裂检测系统源码分享
  • 在线包装盒型生成工具,各种异型包装盒型,PDF导出方便
  • Edegex Foundry docker和源码安装
  • 快速入门Vue
  • 系统架构设计师:系统架构设计
  • 深入理解Redis:缓存穿透、缓存击穿、缓存雪崩及双写一致性
  • 一些学习three的小记录
  • 顶刊算法 | 鹈鹕算法POA-Transformer-LSTM多变量回归预测
  • 学习笔记-Golang中的Context
  • (算法)大数的进制转换
  • 【Webpack--000】了解Webpack
  • linux + 宝塔 + django + websocket 部署
  • [笔记] php常见简单功能及函数
  • 《Java编程思想》读书笔记-对象导论
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Akka系列(七):Actor持久化之Akka persistence
  • C++入门教程(10):for 语句
  • JavaScript服务器推送技术之 WebSocket
  • Meteor的表单提交:Form
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • OSS Web直传 (文件图片)
  • PHP 小技巧
  • rabbitmq延迟消息示例
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 反思总结然后整装待发
  • 工作手记之html2canvas使用概述
  • 后端_MYSQL
  • 面试遇到的一些题
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 入口文件开始,分析Vue源码实现
  • 我建了一个叫Hello World的项目
  • 2017年360最后一道编程题
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​【已解决】npm install​卡主不动的情况
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #pragam once 和 #ifndef 预编译头
  • #pragma预处理命令
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (35)远程识别(又称无人机识别)(二)
  • (rabbitmq的高级特性)消息可靠性
  • (WSI分类)WSI分类文献小综述 2024
  • (zt)最盛行的警世狂言(爆笑)
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (六)c52学习之旅-独立按键
  • (转)http协议
  • (转)关于多人操作数据的处理策略
  • (转载)hibernate缓存
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET分布式缓存Memcached从入门到实战