单片机实现非阻塞延时
非阻塞式延时是指程序在执行延时函数时可以继续执行其他任务,不会一直等待。E_Bool Ticker_Out(u32 *pTicker, u32 uCompareValue)
{
u32 uTicks = 0;
uTicks = BSP_Get_SysTick();
if(0 == uCompareValue)
{
*pTicker = uTicks;
return True;
}
else
{
if(uTicks >= (*pTicker))
{
uTicks = uTicks - (*pTicker);
}
else
{
uTicks = (U32_MAX_VALUE - (*pTicker)) + uTicks;
}
if (uTicks >= uCompareValue)
{
return True;
}
}
return False;
}上述代码中,BSP_Get_SysTick()是得到在滴答定时器中断函数中计数的值:
u32 BSP_Get_SysTick(void)
{
return gSystickTimes; /* 获取系统心跳 */
}
void SysTick_Handler(void)
{
gSystickTimes++; /* 系统心跳计数 */
}int main()
{
E_Bool eState = False;
static u32 uSampleTicker = 0;
while(1)
{
eState = Ticker_Out(&uSampleTicker, 500);
if(True == eState)
{
Ticker_Out(&uSampleTicker, 0);
LED_ON();
}
}
}
非阻塞延时用定时器中断实现 这种用法很巧妙 并不能完全保证精确的计时 定义了一个延时计数器delay_counter,在延时函数delay_ms()中将要等待的毫秒数作为参数传入,并通过SysTick_Config()函数配置SysTick定时器为1ms中断,并开启定时器。当delay_counter计数器倒计时到0后,函数返回并禁用SysTick定时器;在主程序中调用delay_ms()函数时,如果需要等待一定时间,则传入对应的毫秒数即可。 单片机实现延时一般有几种方法 传统的阻塞延时 方式会导致程序停顿,无法同时执行其他任务,因此通常不适用于多任务系统或对时序精度要求较高的场合。 在单片机的程序设计中,常需要使用延时函数来实现某些功能或任务。 需要考虑其他因素,如系统资源的占用、中断处理函数的编写等。 单片机延时程序怎么写?是根据什么原理写的? 这种方法具有精度高、可重复性好、计算量小等优点。 使用非阻塞延时时,要根据具体场景选择合适的方法,并进行相关参数的设置和优化 需要使用非阻塞延时实现定时功能,即不占用CPU处理资源的同时可以进行延时计数。 用定时器计数实现非阻塞 基于系统时钟的时间戳计数
页:
[1]