这是因为delay_us()这个函数在HAL库中是没有的额,以前使用裸机的时候是我自己实现的,这里我们既然使用了 RT-Thread ,在我们《RT-Thread记录(四、RT-Thread 时钟节拍和软件定时器)》中正好介绍到过 RT-Thread 中有 us 延时函数,我们拿过来用用试试看。 我们把所有delay_us改成rt_hw_us_delay,记得包含一下...
RT-Thread 中, 时钟节拍的长度可以根据 RT_TICK_PER_SECOND 的定义来调整, 等于 1/RT_TICK_PER_SECOND 秒。 1.1 时钟节拍的实现方式 时钟节拍由配置为中断触发模式的硬件定时器产生, 当中断到来时, 将调用一次:void rt_tick_increase(void),通知操作系统已经过去一个系统时钟;不同硬件定时器中断实现都不同...
使用hwtimer可以提高定时精度和us级定时,配合回调函数和信号量也不用担心系统自带的us延迟函数 void rt_hw_us_delay(rt_uint32_t us)造成的阻塞问题 芯片:stm32g070 使用hwtimer需要改动的地方如下 board.h中打开timer的相关宏定义,比如使用timer15就打开 board.c中添加对应timer的HAL_TIM_Base_MspInit();初始化...
在RT-Thread 使用中,往往都会定义RT_USING_TIMER_SOFT ,使用软件定时器并且启动 SOFT_TIMER 模式 ,该模式被启用后,系统会在初始化时创建一个 timer 线程,用来对软件定时器经常管理,那么我们就通过源码来看看 RT-Thread 到底是如何操作的。 通过《RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)...
void rt_hw_us_delay(rt_uint32_t us) { rt_uint32_t delta; /* 获得延时经过的 tick 数 */ us = us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND)); /* 获得当前时间 */ delta = SysTick->VAL; /* 循环获得当前时间,直到达到指定的时间后退出循环 */ ...
需要注意的是,基于微秒的延时函数(如rt_hw_us_delay)通常不会让出CPU资源,因为它们需要在非常短的时间内完成延时操作。这意味着,在使用这些函数时,当前线程会一直占用CPU,直到延时结束。因此,在使用这些函数时需要特别小心,以避免对系统性能造成负面影响。 3. RT-Thread延时函数的使用示例 以下是一个使用RT-Thread...
voidrt_hw_us_delay(rt_uint32_t us) { rt_uint32_t delta;/*获得延时经过的 tick 数*/us= us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND));/*获得当前时间*/delta= SysTick->VAL;/*循环获得当前时间,直到达到指定的时间后退出循环*/while(delta - SysTick->VAL<us); ...
简介:【玩转RT-Thread】 时钟管理(原理+实战) 序言 操作系统需要通过时间来规范其任务的执行,操作系统中最小的时间单位是时钟节拍 (OS Tick)。 一、时钟节拍 任何操作系统都需要提供一个时钟节拍, 以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。
rt_hw_us_delay(50000); } void led_tick_thread(void *parameter) { rt_timer_t led1_timer; led1_timer = rt_timer_create("ledtim1", led1_timeout, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER); if (led1_timer != RT_NULL) { ...
时钟节拍 时钟节拍是特定的周期中断,可以看是系统心跳,中断之间的时间间隔取决于不同的应用,一般是 1ms–100ms,时钟节拍率越快,系统的额外开销就越大,从系统启动开始计数的时钟节拍数称为系统时间。 RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_PER_SECOND 的定义