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

参考:Linux内核同步机制(2)_内存屏障

 

posted @ 2017-04-02 21:13  yuxi_o  阅读(5352)  评论(0编辑  收藏  举报