在大多数的实时操作系统中,并没有自带的udelay函数,但是我们的实际项目中,又需要经常使用延时,这个时候我们就得自己来实现udelay延时函数了;
1、首先,我们需要一个高频率的硬件定时器作为必备条件,比如工作频率为19.2M的定时器,一个silce大概是52ns;频率低的定时器不能满足要求,比如32K的,一个silce就31us 了,根本不可能实现udelay延时。
2、在合适的地方,使能选用的高频率定时器(通常是在系统启动前,比如fastboot阶段);
3、封装udelay接口,建议在头文件中封装成inline函数,假定我们选用19.2M的定时器,定时器通常都是递减计数的:
#define get_delta(begin,end) (end>begin?(end - begin):(0xffffffff - end + begin)) /*防止定时器计数回绕*/
static inline void udelay(unsigned int delay_us)
{
unsigned int delta = 0, begin = 0, end = 0;
unsigned long flags = 0;
delta = delay_us*19200000/1000000;
local_irq_save(flags); /*为了防止在延时时,被其他中断打断,需要做一下屏蔽中断操作*/
begin = readl(timer_count_base_addr);
do{
end = readl(timer_count_base_addr);
}while(get_delta(end,begin)<delta); /*防止定时器计数回绕*/
local_irq_restore(flags); /*回复中断状态*/
}
如此,我们便可以在需要的地方使用自己的udelay延时函数了。
实时操作系统中实现自己的udelay延时函数