杂项函数在 BSP 中也是非常重要的。我为了图省事,全部都放置在了:c/src/lib/libcpu/arm/at91sam9260/pmc/pmc.c中。

主要是获取CPU当前的频率和系统主时钟的频率。

前几篇连载中,我们在串口和时钟驱动里都是用了获取主时钟频率的函数。

 

另外一个就是 udelay 函数。udelay函数原来是posix的标准函数,但是rtems并没有实现,

我们不可能用时钟节拍去做微秒级别的时间延时。

许多驱动程序必须要延迟一定的时间才能工作,这里我给出了一个简单的实现方式。

启动定时器1,采用计数方式,选择一个合适的时钟平率,我选择的是主时钟的 32 分之一,一个脉冲大约是300ns。然后

给定时器一个初值,测量一段空循环的时间。得出循环多少次正好是1微秒。

这是通过 calc_delay 来实现的。实际实现中,为了防止除法的精度不够,还做了一下微调。

我是在c/src/lib/libbsp/arm/at9260/startup/bspstart.c中的bsp_start_default函数中调用这个函数,bsp_start_default会在bootcard函数一开始就调用。不用担心定时器1会和别的驱动冲突。只调用calc_delay一次,不要再调用,就绝对不会冲突。

 

 

闲话少说,看pmc.c的全部代码:

 

这里,杂项函数我们就搞定了。