自适应分级轮询超时机制

2023-05-16

自适应分级轮询超时机制

    • 超时概念
    • 实现原理
      • 基础:
      • 目标:
      • 实现:
      • 示例:



超时概念

程序运行中,操作后需要等待某个状态,正常返回,但实际未按预期状态出现,此时应该超时异常返回,不然会造成死循环。


实现原理

超时计数时间轴如下:

微秒计数
毫秒计数
开始: 0
微秒结束, 毫秒开始:N
超时:M

0到N为微秒计数,N到M为毫秒计数。计数从0开始,直到M表示超时异常返回,中间均为正常返回。

基础:

以vxwork系统为例,taskDelay(0)可为微秒级延时(cpu任务优先级调度);taskDelay(1)可为毫秒级延时(cpu释放一个时钟片)。
对于一个超时检测来说,超时计数粒度越小,返回越及时,保证运行速度,但会加重cpu负担;相反超时计数粒度越大,返回越慢,运行速度慢,但会释放更多的cpu。

目标:

a、保证程序正常运行时调整超时计数在微秒计数(0 -N)内,达到运行速度;
b、保证程序异常运行时调整超时计数在毫秒计数(N-M)内,达到cpu释放。

实现:

1、初始化超时M,为一个大于0的较小的值,最好按实际测试情况给定。毫秒计数(N-M)固定不变。
2、正常运行时,正常返回,若此时超时计数用到了毫秒计数(N-M),自动按步长L加到M上,如此多次调整后,超时计数最终落在微秒计数(0 -N)内。
3、异常运行时,超时返回,此时必定落在M点上,为了减小cpu的消耗,N和M同时按步长L减小,让超时计数尽可能落在N-M内。

示例:

可用在i2c、spi、eth等总线轮询等待情况。

/*
 * Function to ensure that the previous transaction was completed before
 * initiating a new transaction. It can also be used in polling mode to
 * check status of completion of a command
 * 注意: 此超时机制会自动调整超时次数。
 * 1,超时次数过短的话会自动增加超时次数,保证读取速率。
 * 2,总线异常的话会调整超时次数到最小值,控制cpu占用率。
 */
#define I2C_REG_R_TIMES_MIN     500 
unsigned int i2c_reg_r_times = 1000;/* 测试发现大约为1200,可自动向上调整修正 */
unsigned int i2c_reg_r_times_ajust_step = 10;
static int iproc_i2c_startbusy_wait(unsigned char bus)
{
    unsigned int reg_val;
    unsigned int check_times = 0;
    unsigned int check_times_now = i2c_reg_r_times;
    /* 末尾用10ms */
    unsigned int check_times_10ms = check_times_now - 3;

    do{
        /* 检查ok */
        reg_val = iproc_i2c_reg_read(bus, CCB_SMB_MSTRCMD_REG);
        if(0 == (reg_val & CCB_SMB_MSTRSTARTBUSYCMD_MASK)){
        
            /* 1,用到10ms延时,说明微秒级延时不够,需增加超时次数 */
            if(check_times > check_times_10ms){
                i2c_reg_r_times += i2c_reg_r_times_ajust_step;
            }
                
            return 0;
        }

        /* 10ms延时 */
        if(check_times > check_times_10ms){
            taskDelay(1);
        }
        /* 微秒级延时 */
        else{
            taskDelay(0);
        }

    }while(check_times++ < check_times_now);

    /* 2,超时,说明总线异常,大幅减少超时次数 */
    if(i2c_reg_r_times > I2C_REG_R_TIMES_MIN){
        i2c_reg_r_times -= i2c_reg_r_times_ajust_step * 4;
    }
    
    return -ETIMEDOUT;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自适应分级轮询超时机制 的相关文章

  • Linux下c++串口编程

    1 NX串口管理 参见https blog csdn net weixin 42447868 article details 109051005 spm 61 1001 2014 3001 5506 2 串口权限管理 2 1 串口权限 xf
  • Jetson Nx 串口接收数据丢失首字节问题

    1 问题描述 I write a uart program using c 43 43 on Jetson Nx Jetpack 4 6 1 Ubuntu version 18 04 LTS to communicate with a PC
  • Linux下的一些基础功能

    1 关于命令行输出到文件 xff1a https www iplayio cn post 6296803 2 kz 64 JetsonNx ls l dev ttyS dev ttyUSB dev ttyTHS dev ttyCUDA ls
  • SpringBoot ☞ logback日志配置【屏蔽第三包中日志输出】

    一 项目配置文件如下 二 场景 项目启动时 xff0c 控制台无缘无故输出很多error级别的日志 xff0c 让人看着很不舒服 xff0c 断点调试 43 跟踪 xff0c 发现原来是第三方jar包里设置了日志输出 xff0c 如下 xf
  • 通过Xshell操作Jetson Nx

    1 Jetson Nx Nx留有Uart2 口 xff0c 便于使用xshell等进行操作 串口有三根线 链接后使用 2 XShell 软件 2 1 XShell软件介绍 XShell 软件是一个Windows上运行的终端模拟器 xff0c
  • Nx C++程序使用spdlog库进行日志存储

    1 spdlog简介 spdlog是一个开源的日志库 xff0c 在github上有 代码见这里 xff0c 文档这里 C 43 43 语言的 xff0c 支持Linux windows等系统 csdn上也有许多介绍 xff0c 这里列举两
  • C++下的Boost库

    1 介绍 xff08 引子网络 xff09 Boost库是为C 43 43 语言标准库提供扩展的一些C 43 43 程序库的总称 xff0c 由Boost社区组织开发 维护 Boost库可以与C 43 43 标准库完美共同工作 xff0c
  • Opencv之边界跟踪

    问题描述 一般是将二值化后的图像进行边界的提取 需要说明的是这个提取不是简单的找到边界 xff0c 而是按照顺序的找出来 即边界上的点是按照邻接关系依次给出 相关算法 xff08 1 xff09 这里解释 xff1a https blog
  • OpenCV之滤波

    图像滤波 xff0c 指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 xff0c 是图像预处理中不可缺少的操作 xff0c 其处理效果的好坏将直接影响后续图像处理和分析的准确性 这里有个概述 xff0c 很好的 xff1a Ope
  • C++文件读写

    这个不错 xff1a C 43 43 文件读写详解 xff08 ofstream ifstream fstream xff09 C 43 43 文件读写详解 xff08 ofstream ifstream fstream xff09 c 4
  • python及其工具

    目录 1 conda xff1a 包管理器2 Anoconda xff1a 开源的包 环境管理器3 labelme4 tensorflow5 cuda和cudnn6 使用yml文件创建环境并安装文件6 1 yml文件由来6 2 如何获得ym
  • C++之文件操作移动、复制、重命名

    1 C 43 43 笔记之CopyFile和MoveFile的使用 2 删除和重命名 include lt fstream gt include lt windows h gt 与opencv的命名空间CV有冲突 xff0c 不能在一个文件
  • (转)C#数字转固定长度的字符串

    转 C 数字转固定长度的字符串
  • 进程监视工具

    Process Monitor 搜索能下到 xff0c 记下 xff0c 以后用 Process Monitor分析某个应用行为 Process Monitor 系统进程监视器 介绍教程 Using Process Monitor 帮助文档
  • UML建模工具Enterprise Architect(EA) -- 安装及简单使用

    目录 一 什么是EA xff1f 二 安装EA 三 为什么要学会用EA 四 创建EA工程 五 创建类视图 xff0c 构建类和接口 六 选中模型目录 xff0c 自动检出Java代码 七 构建内部类 八 趁热打铁 xff0c 构建数据表视图
  • SVN目录结构与分支等

    TortoiseSVN打分支 合并分支 切换分支 SVN创建分支 合并分支 切换分支
  • WPF上下标

    这里有个介绍的文章 xff1a 定义显示的上标和下标 里面介绍了三种方法 我之前有的是这个方法 xff1a Typography Variants 61 Superscript xff0c 如下所示 xff1a lt TextBlock g
  • [WPF] HamburgerMenu

    有两个库支持的 xff1a Metro App库中的 VS自己的控件 xff1a https docs microsoft com zh cn windows communitytoolkit archive hamburgermenu
  • 面积误差三种计算表达的比较

    引自 xff1a 面积误差三种计算表达的比较 有三种理论 xff0c 最基本的经典的 xff0c 引用一个吧 xff1a 网上有个题目 xff0c 求桌面面积的测量结果 桌面为矩形 用米尺测量 xff0c 长L为100 0 cm xff0c

随机推荐

  • 【转】WPF:Canvas中元素的定位

    概述 xff1a Canvas中的元素的大小和位置都是相对于Canvas容器的 xff0c 他的左上角为原点 xff0c 长度也是相对于他的 WPF xff1a Canvas中元素的定位 https blog csdn net chz cs
  • 【转】C#中计时

    一般可以用Environment TickCount xff0c 但是25天后会翻转 有很多 xff0c 见下面两个转的 C 中精确计时的一点收获 https www cnblogs com jintianhu archive 2010 0
  • 利用python分析微信聊天记录

    文章目录 前言一 任务分析二 工具三 步骤1 数据获取获取DB计算密码导出数据库 2 数据清洗 xff08 具体方法以后补充 xff09 3 数据分析 前言 昨天跟女朋友讨论谁给对方发的消息比较多 xff0c 两人各执一词 xff0c 事实
  • C++学习之模板

    文章目录 xff1a 一 模板 二 函数模板 三 类模板 一 模板 模板 也称泛型编程 泛型编程 xff1a 编写与类型无关的通用代码 xff0c 是代码复用的一种手段 模板是泛型编程的基础 在这之前我们可以利用C 43 43 的函数重载来
  • ROS2 创建python包

    1 创建python包 ros2 pkg create build type ament python span class token string 39 demo 39 span dependencies rclpy 以上指令为创建一个
  • Springboot集成SpringSecurity过程中遇到的问题

    Spring Security 开发文档 xff1a https www springcloud cc spring security zhcn html 一 配置的免登录访问接口不生效 span class token annotatio
  • 在sublime text3中配置c/c++运行环境

    在参考网上诸多大神配置sublime text3后 xff0c 自己也想写一篇有关在sublime中配置c c 43 43 的运行环境的文章 xff0c 顺便总结一下 安装sublime text3 xff1a 下载地址 xff08 官方地
  • STM32CubeMX 新建工程详细步骤

    STM32CubeMX 新建工程详细步骤 1 MPU CPU选择step1 打开CubeMX 软件 xff0c 在主页面上 点击如下按钮 xff0c 进入芯片选择界面step2 在Part Number Search 栏搜索我们需要用到的芯
  • macOS 10.11、macOS 10.12、macOS 10.13、macOS 10.14、macOS 10.15 制作可用于虚拟机安装的 CDR/ISO 系统镜像指导教程

    开篇说明 xff1a 不论是用 UltraISO xff0c 或者是用 MacOS 系统中的 磁盘工具 的格式转换功能进行 原版 DMG 61 61 gt CDR ISO 转换出来的 CDR ISO 文件只是进行了格式 xff08 容器 x
  • win10安装wsl2

    一 环境准备 1 确保bios开启虚拟化支持 各品牌主板进入bios的方式可百度或看主板说明书 2 查看当前win10版本是不是最新版 xff0c 如果不是则升级到最新版 查看当前版本 xff0c win 43 r打开运行窗口输入 34 w
  • snprintf 函数用法心得

    前人挖坑 xff0c 后人种树 不能对同一段内存 xff08 同一个buf 或是两个重叠的内存使用snprintf xff0c 换句等方面说 xff0c 在使用snprintf 时 xff0c 就确保内存不重叠 先来看看一段问题代码的执行结
  • VMware改变虚拟机文件在真实机的位置2208262201

    VMware 改变虚拟机文件位置 1 查看打开i虚拟机文件目录2 关闭虚拟机 将虚拟机文件夹复制或剪切到想要的位置3 用VMware打开复制的文件夹下的 vmx 文件 生成一个新的同名的虚拟机4 开启这个新生成的虚拟机 出现对话框选择意图
  • Ubuntu22.04.01Desktop桌面版 允许root用户远程登陆 笔记221110

    先给root设置密码 span class token function sudo span span class token function passwd span root 启用远程密码登录 和允许root远程ssh登陆 进入 etc
  • MySQL8 创建用户,设置修改密码,授权

    MySQL8 创建用户 设置修改密码 授权 MySQL5 7可以 创建用户 设置密码 授权 一步到位 x1f447 span class token keyword GRANT span span class token keyword A
  • win10远程桌面AlmaLinux9.1,用xrdp

    win10远程桌面AlmaLinux9 1 用xrdp 默认 yum 和 dnf 都下载不到 xrdp 要先 install epel release 安装EPEL源 span class token function sudo span
  • Rocky9.1安装xrdp远程桌面 230315

    Rocky9 1安装xrdp远程桌面 230315 要先 install epel release 安装EPEL源 span class token function sudo span yum span class token funct
  • DNS默认的端口号是: 53

    DNS默认的端口号是 53 DNS 域名系统 主机命名系统 DNS 是 Domain Name System 的缩写 DNS协议运行在UDP协议之上 xff0c 使用端口号53
  • 【pandas】在Pandas中降低dataframe使用的内存

    想要降低dataframe的内存占用主要有两种方法 使用小一点的数值型 datatype把object类型的列转为categorical类型 df span class token operator 61 span pd span clas
  • 第一次ubuntu wsl ssh远程登录各种报错+解决

    首先将ssh默认的22端口改了 xff0c 以防端口被占用冲突 xff0c 这里我改为2222 xff08 感觉这步其实可有可无 xff09 sudo sed span class token operator span i span cl
  • 自适应分级轮询超时机制

    自适应分级轮询超时机制 超时概念实现原理基础 xff1a 目标 xff1a 实现 xff1a 示例 xff1a 超时概念 程序运行中 xff0c 操作后需要等待某个状态 xff0c 正常返回 xff0c 但实际未按预期状态出现 xff0c