Linux外设寄存器
一、操作外设寄存器延时
Linux读写一个外部寄存器平均耗时0.7us(zynq上测试),使用gpiolib库时延时更长。
#define readb(c) ({ u8 __v = readb_relaxed(c); __iormb(); __v; }) #define readw(c) ({ u16 __v = readw_relaxed(c); __iormb(); __v; }) #define readl(c) ({ u32 __v = readl_relaxed(c); __iormb(); __v; }) #define writeb(v,c) ({ __iowmb(); writeb_relaxed(v,c); }) #define writew(v,c) ({ __iowmb(); writew_relaxed(v,c); }) #define writel(v,c) ({ __iowmb(); writel_relaxed(v,c); })
采用SET_BIT-> delay -> CLEAR_BIT->delay步骤测试gpio不同操作方式下zynq gpio延时,
测试时序:SET_BIT -> 延时1 -> CLEAR_BIT -> 延迟2 -> GET_BIT
|
延时1 |
延时2 |
低电平时间tl |
高电平时间th |
周期T |
readl_relaxed/… |
0 |
0 |
250ns |
750ns |
1000ns |
|
1us |
1us |
1250ns |
1850ns |
3100ns |
readl/writel |
0 |
0 |
380ns |
1020ns |
1400ns |
|
1us |
1us |
1400ns |
2100ns |
3500ns |
gpiolib |
0 |
0 |
600ns |
1120ns |
1720ns |
|
1us |
1us |
1750ns |
2250ns |
4000ns |
gpiolib+nsdelay |
500ns |
500ns |
1300ns |
1900ns |
3200ns |
|
1000ns |
1000ns |
1800ns |
2300ns |
4100ns |
|
500ns |
200ns |
1300ns |
1600ns |
2900ns |
|
1us |
200ns |
1750ns |
1550ns |
3300ns |