硬件延时任务--hwdelay_task

【rtthread设备】第五篇:hwtimer设备 一、hwtimer概念 二、hwtimer api 查找设备获得定时器句柄,根据句柄打开定时器,设置定时器超时回调函数、设置定时器模式、设置定时器超时值后定时器启动,可以读取定时器经过的时间。 //查找设备 /* name:设备名称 */ rt_device_t rt_device_find(const char* name) //打开定时器设备 /* dev:定时器设备句柄 oflags:打开模式,一般取RT_DEVICE_OFLAG_RDWR */ rt_err_t rt_device_open(rt 阅读详情

hwdelay_task.h

#ifndef _HWDELAY_TASK_H_
#define _HWDELAY_TASK_H_

#include <rtthread.h>
#include <stdint.h>

#define DELAY_MAILBOX_MAX   5

/*
 * 值为10us, 那么该延时任务的误差就有10us, 该值设置要大量测试
 * 10us 出现了发送一次指令, 执行两次的情况(一次)
 * 20us 小幅度测试没出现异样
 */
#define DELAY_HWTIMER_INTERVAL_US   20

/*
 * 这个结果值要大于0
 */
#define HWDELAYTASK_CALC_DELAY_COUNT(us)        (us < DELAY_HWTIMER_INTERVAL_US ? 1 : us/DELAY_HWTIMER_INTERVAL_US)
/*
 * 这个 s 值不能超过 2147.483647; 因为 int 所能表示的最大范围为 2147483647
 */
#define HWDELAYTASK_CALC_DELAY_COUNT2(s, us)    (((s*1000000)+us)/DELAY_HWTIMER_INTERVAL_US)

struct DelayMailbox{
    volatile uint32_t count;//延时计数, 做减法, 减到0时,将数据发送到邮箱
    rt_mailbox_t send_mb;//任务到达后被发送到的邮箱
    void* data;
};

extern rt_mailbox_t MbGuidDataDelayHandle;

int8_t delaytask_init();
int8_t delaytask_add(struct DelayMailbox* dmb);

#endif

hwdelay_task.c

#include "hwdelay_task.h"
#include "bsp_gpt.h"

#define DELAY_HWTIMER_DEV_NAME   "gpt2"     /* 定时器名称 */

static struct imxrt_gpt* dev_hwtimer_hwdelay;
static int8_t state;

static volatile struct DelayMailbox DelayMbs[DELAY_MAILBOX_MAX] = {0};
static volatile uint8_t DelayMbsFront = 0;  //队首
static volatile uint8_t DelayMbsRear = 0;   //队尾,最后一个元素的索引+1

rt_mailbox_t MbGuidDataDelayHandle;

static void ht_timeout_cb(void* dev, uint32_t size){
    //这里要测验定时器超时回调中的代码执行时长, 其执行时长要小于定时器的超时时间
    uint8_t i = DelayMbsFront;
    while(i != DelayMbsRear){
        //printf("DelayMbs[%u].count: %u\r\n", i, DelayMbs[i].count);
        DelayMbs[i].count--;
        if(DelayMbs[i].count == 0){
            rt_mb_send(DelayMbs[i].send_mb, (rt_ubase_t)DelayMbs[i].data);
            DelayMbsFront = (DelayMbsFront+1)%DELAY_MAILBOX_MAX;
            return;
        }
        i = (i+1)%DELAY_MAILBOX_MAX;
    }
    return;
}

int8_t delaytask_init(){
    rt_err_t res;
    
    MbGuidDataDelayHandle = rt_mb_create("_MGDDH", DELAY_MAILBOX_MAX, RT_IPC_FLAG_FIFO);
    
    dev_hwtimer_hwdelay = bsp_gpt_init(DELAY_HWTIMER_DEV_NAME, ht_timeout_cb);
    if (dev_hwtimer_hwdelay == RT_NULL) {
        printf("hwtimer sample run failed! can't find %s device!\r\n", DELAY_HWTIMER_DEV_NAME);
        return -1;
    }
    hwtimerval_t timerval = {0, DELAY_HWTIMER_INTERVAL_US};
    bsp_gpt_start(dev_hwtimer_hwdelay, &timerval, HWTIMER_MODE_PERIOD);
    return 0;
}

int8_t delaytask_add(struct DelayMailbox* dmb){
    if((DelayMbsRear+1)%DELAY_MAILBOX_MAX == DelayMbsFront){
        return -1;
    }
    DelayMbs[DelayMbsRear].count = dmb->count;
    DelayMbs[DelayMbsRear].data = dmb->data;
    DelayMbs[DelayMbsRear].send_mb = dmb->send_mb;
    DelayMbsRear = (DelayMbsRear+1)%DELAY_MAILBOX_MAX;
    //printf("DelayMbsRear: %d\r\n", DelayMbsRear);
    return 0;
}
[RT-Thread实战指南] 高精度延时函数rt_hw_us_delay的调试技巧与性能提升 本文深入剖析了RT-Thread中高精度延时函数rt_hw_us_delay的工作原理与常见陷阱。通过对比新旧版本实现,揭示了其因算法缺陷可能导致系统卡死的根本原因,并提供了优化方案。文章重点分享了利用GPIO和示波器进行精度验证、使用系统tick进行宏观测试等实战调试技巧,最后总结了安全使用守则,并建议对复杂定时需求采用硬件定时器(HWTimer)作为更优替代方案。 阅读详情

相关推荐

RT-Thread学习笔记 -- 硬件定时器

RT-Thread学习笔记 – 硬件定时器 硬件定时器RT-Thread学习笔记 -- 硬件定时器1.硬件定时器配置2.添加RTT官方定时器设备代码总结 1.硬件定时器配置 根据board.h定时器使用方法进行操作 board.h 第3步. stm32cubemx定时器配置 生成工程,拷贝到board.c中 board.h第四步,拷贝HAL_TIM_Base_MspInit()放入到board.c中 2.添加RTT官方定时器设备代码 /* * 程序清单:这是一个 hwtimer 设备使

weixin_45383564的博客 4410

学习笔记(2)RT-Thread使用硬件定时器(HWTIMER)

这里需要注意的是,我们必须要定义一个main函数,才能在调试串口中使用hwtimer_sample这个指令,如果没有main函数的话,我们在串口调试中是运行不了hwtimer_sample。假如说程序报错说我们没有TIM_CONFIG,那我们可以打开tim_config.h文件,在TIM2_CONFIG前面加入TIM1_CONFIG.(rt-thread好像没有TIM1_CONFIG所以需要自己加),里面的参数和TIM2_CONFIG相同,只需要将TIM2改成TIM1即可)。这样我们就配置好了定时器2。

QQ1123456111的博客 4294

什么是无人机电源管理模块?电源管理模块有什么用处?

我来描述一下我的问题情景,电源管理模块的定义是,这里给出这个PX4官方对于电源管理模块的一些介绍,补充一下锂电池的放电原理大家就可以更好理解为什么需要电源管理模块

HRWVY0725的博客 2273

【rt-thread】硬件定时器(hwtimer)

前言本文使用的是env工具配置rt-thread。

weixin_51361507的博客 2184

用VSCode远程开发Jetson小车:告别Jupyter,在本地IDE高效调试Rosmaster Python程序

本文详细介绍了如何利用VSCode的Remote-SSH扩展在本地IDE中高效开发Jetson小车的Rosmaster Python程序。通过配置远程开发环境、调试技巧和项目管理方法,开发者可以告别Jupyter Notebook的碎片化编码,实现完整的机器人控制程序开发,显著提升工作效率。

weixin_30652491的博客 477

RT-Thread与LWIP协议栈在GD32F450XX上的移植实战:从FreeRTOS到RT-Thread的切换指南

本文详细介绍了将LWIP协议栈从FreeRTOS移植到RT-Thread系统,并在GD32F450XX开发板上实现的完整实战指南。重点解析了sys_arch适配层、邮箱与信号量接口的关键改造,以及网络驱动ethernetif.c的适配步骤,帮助开发者解决线程通信差异,实现稳定网络连接。

linux6sysadmin的博客 824

RT-Thread HWTIMER设备(学习)

硬件定时器一般有2种工作模式,定时器模式和计数器模式。不管是工作在哪一种模式,实质都是通过内部计数器模块对脉冲信号进行计数,下面是定时器的一些重要概念。计数器模式:对外部输入引脚的外部脉冲信号计数。定时器模式:对内部脉冲信号计数。定时器常用作定时时钟,以实现定时检测,定时响应,定时控制。计数器:计数器可以递增计数或者递减计数,16位计数器的最大计数值为65535.

Caramel_biscuit的博客 649

MineMap开发教程: 北斗网格位置码实时调度技术详解

本文介绍了MineMap4.0引擎中北斗网格位置码的实时调度技术。北斗网格位置码是我国自主研发的空间位置编码标准,具有层次化结构、三维编码等特点。MineMap4.0通过BeiDouGrid类实现了高效的实时调度机制,重点展示了按预想高度进行网格调度的核心功能。关键技术包括视锥体裁剪、LOD控制、高度筛选算法和交互式查询等。该技术在智慧城市、环境监测等领域具有广泛应用前景,凭借高性能、高精度等优势,为三维地理信息可视化提供了有力支撑。

weixin_42568040的博客 1442

RT-Thread HWTIMER驱动框架学习笔记

对HWTIMER设备来说,在驱动开发时需要从结构中派生车新的HWTIMER设备(

DH的博客 718

RK3588上从零部署Facenet人脸识别:PyTorch转ONNX再到RKNN的完整避坑指南

本文提供了在RK3588开发板上从零部署Facenet人脸识别模型的完整指南。详细介绍了从PyTorch模型导出、转换为ONNX格式,再通过RKNN-Toolkit2转换为RKNN格式的完整流程,并重点分享了环境配置、算子兼容性处理、量化调优及板端部署中的关键步骤与避坑经验。

river的博客 464

【无人机路径规划】基于强化学习实现多无人机路径规划附matlab代码

1 简介 本文提出一种基于强化学习实现多无人机路径规划。​ 2 部分代码 % This is used to measure the path length, service rate and risk explosure for each UAVs %% parameters function [PL,ServiceRate,Risk]=measure global N2; % divide [0,1]*[0,1] map into N2*N2 grid when calcul

qq_59747472的博客 6905

RT-Thread Studio学习(二)HWTIMER

RT-Thread Studio学习之HWTIMER简介新建项目并使用外部时钟启用HWTIMER测试 简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用PWM设备。 新建项目并使用外部时钟 打开RT-Thread Studio软件新建基于芯片的项目,并使用外部时钟系统,具体参见《RT-Thread Studio学习之使用外部时钟系统》 启用HWTIMER 根据board.h文件中的描述,启用HWTIMER需要完成如下四个步骤: /*-------------

iqiaoqiao的博客 2576

LDRA Testbed(TBrun)软件单元测试_操作指南

通过前面的几篇文章,使用Testbed进行软件静态分析的内容已经基本讲解完毕。从这篇文章开始,将继续讲解如何使用TBrun进行软件单元测试、软件集成测试。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 7768

[001] [RT-Thread学习笔记] 高精度延时函数rt_hw_us_delay的陷阱与优化

[RT-Thread学习笔记] 高精度延时函数rt_hw_us_delay的陷阱1 高精度延时函数简介2 隐藏的陷阱 RT-Thread版本:4.0.5 MCU型号:STM32F103RCT6(ARM Cortex-M3 内核) 1 高精度延时函数简介 RT-Thread定时器的最小精度是由系统时钟节拍所决定的,定时器设定的时间必须是 OS Tick 的整数倍。当需要实现更短时间长度的系统定时时,操作系统定时器将不能够满足要求,只能通过读取系统某个硬件定时器的计数器或直接使用硬件定时器的方式。 对于Co

柯西的彷徨的博客 1万+

Yolov8-pose关键点检测:训练准备篇 | 自己数据集从labelme标注到生成yolo格式的关键点数据

yolov8-pose关键点检测系列:从数据集标记到生成适合yolo的关键点格式

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 5875

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

关于标准c++ 利用clock()函数计算时间为负值原因及解决

由于没有在windows的环境下,所以在计算程序运行时间时不能利用GetTickCount()函数,在标准c++下计算时间的资料在网上也出现许多,比较详细的我可以推荐yunyin86的《linux 计算程序运行时间》一文,讲的很详细。于是我用了clock()函数来计算时间,由于程序比较大,运行的时间比较长,但每次运行完这后得到的结果都是负数,有些不解,查些资料后才明白了,原来clock_t是l

zhangwei_zone的专栏 8957

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

高精度延时函数rt_hw_us_delay在CH32V203C8T6的实现

高精度延时函数rt hw us delay在CH32V203C8T6单片机上的实现,其实有SysTick的单片机的用法都差不多

10+年嵌入式开发者 | STM32/沁恒WCH/乐鑫ESP32生态玩家 | RT-Thread/FreeRTOS | 专注开源组件移植与效能工具开发 | 记录底层踩坑与软硬件协同设计。 1265

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【RT-Thread基础教程】Delay函数与空闲线程及其钩子函数

在 RT-Thread 操作系统中,Delay 函数和空闲线程钩子函数是实现任务调度和系统优化的重要工具。Delay 函数用于在任务中创建延迟,而空闲线程及其钩子函数则可以用于执行系统空闲时间内的一些操作,如任务监控、能耗优化等。本文将介绍 Delay 函数的作用和用法,以及空闲线程及其钩子函数的概念,并简要讨论它们在 RT-Thread 中的应用。Delay 函数和空闲线程钩子函数是 RT-Thread 中重要的功能模块,有助于实现任务调度和系统优化。

m0_62599305的博客 4285

二、RT-Thread设备与驱动-7-HWTIMER

11

rrring的博客 329

rt-thread DS18B02 温度采集程序

下述代码为stm32在rt-thread平台下通过DS18B20采集温度的代码,温度较之实际温度扩大了10倍。

man_pangpang的博客 599

RT_Thread 调试笔记:时间相关,时钟管理函数,延时,定时器、 毫秒转换为时分秒 等

RT_Thread 调试笔记:时间相关,时钟管理函数,延时,定时器、 毫秒转换为时分秒 等

yutian0606的博客 1793

rtthread studio与正点原子apollo(3)--硬件定时器HTIMER

RT-Thread;apollo

hfh8130的博客 2491

AB32VG1之DHT11温湿度测量

新建工程步骤见中科蓝讯 AB32VG1 开发板 GPIO 控制RGB彩灯实验,建好工程之后,需要添加DHT11组件,方法双击打开RT-Thread Settings,如下图所示,点击Add按钮,弹出软件包搜索界面,输入DHT11点击搜索,如下图所示显示2个结果,点击添加第一个组件即可。 添加成功以后,返回,然后双击DHT11软件包,进入软件包配置界面,配置如下图所示。然后保存即可。 配置完成之后,展开packages,可以看到DHT11的源文件和demo已经存在了,如下图所示。 下一步

383

[技术讨论]关于单片机延时的实现讨论

总的来说,阻塞式延时会占用CPU的资源,无法执行其他任务,而非阻塞式延时可以让程序在执行延时函数时继续执行其他任务,提高了程序的效率。3、系统延时:一些单片机芯片提供了硬件延时和软件延时的组合方式,例如使用定时器和中断相结合的方式来实现精确的延时,这种方式既能够满足延时的精度要求,又能够减少CPU的占用率,提高系统的响应性能。4、外部时钟:通过外部时钟来实现精确的延时,这种方式需要使用外部时钟电路,并配置好单片机的时钟源,可以实现高精度的延时,但同时也增加了系统的复杂度和成本。来源:21ic.com。

ic2121的博客 4185

单片机硬件和软件延时、RTOS相对延时和绝对延时

已剪辑自: https://mp.weixin.qq.com/s/-RPLQn4KO9Aqu1fpfZeOKA前不久有个读者在问关于延时的问题,大概就是问:软件延时和硬件延时是啥意思?做项目时他俩有什么区别? 今天就来讲讲关于硬件延时和软件延时的内容,以及它们的区别。延时的种类很多,先给大家普及一下延时相关概念和分类。指利用具有计数功能的硬件进行延时。比如:定时器(Timer)、 实时时钟(RTC)、 系统滴答定时器(SysTick)等具有计数功能的硬件。相对硬件延时而言,软件延时就是写一段软件代码,通过消

qq_41854911的博客 1709

RT-Thread设备框架使用指南之二——硬件定时器设备

定时器简介 硬件定时器一般有 2 种工作模式,定时器模式和计数器模式。不管是工作在哪一种模式,实质都是通过内部计数器模块对脉冲信号进行计数。下面是定时器的一些重要概念。 计数器模式:对外部输入引脚的外部脉冲信号计数。 定时器模式:对内部脉冲信号计数。定时器常用作定时时钟,以实现定时检测,定时响应、定时控制。 计数器:计数器可以递增计数或者递减计数。16位计数器的最大计数值为65535,32...

FILLMOREad的博客 4759
上一篇: rtthread 字节对齐问题 int指针访问非对齐地址崩溃
下一篇: 单片机开发重点-字节对齐问题
returningprodigal
博客等级 码龄12年 53粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值