📄 linux设备驱动程序学习(10)-时间、延迟及延缓操作 - linux设备驱动程序 - tekkaman ninja.htm
字号:
<linux/param.h></FONT>中定义或该文件包含的某个子平台相关文件中。作为通用的规则,即便如果知道
HZ
的值,在编程时应当不依赖这个特定值,而始终使用HZ。对于当前版本,我们应完全信任内核开发者,他们已经选择了最适合的HZ值,最好保持
HZ 的默认值。</P>
<P> 对用户空间,内核HZ几乎完全隐藏,用户 HZ 始终扩展为
100。当用户空间程序包含
param.h,且每个报告给用户空间的计数器都做了相应转换。对用户来说确切的 HZ 值只能通过
/proc/interrupts 获得:/proc/interrupts 的计数值除以
/proc/uptime 中报告的系统运行时间。</P>
<P> </P>
<P><FONT
color=#0000ff>对于ARM体系结构:在<linux/param.h>文件中的定义如下:</FONT></P>
<DIV>
<TABLE style="BORDER-COLLAPSE: collapse"
borderColor=#999999 cellSpacing=0 cellPadding=0
width="95%" bgColor=#f1f1f1 border=1>
<TBODY>
<TR>
<TD>
<P
style="MARGIN: 5px; LINE-HEIGHT: 150%"><CODE><SPAN
style="COLOR: rgb(0,0,0)"><FONT face=新宋体><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN><SPAN
style="COLOR: rgb(255,0,0)">ifdef</SPAN>
__KERNEL__<BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">define</SPAN>
HZ CONFIG_HZ <SPAN
style="COLOR: rgb(255,153,0)">/* Internal kernel
timer frequency */</SPAN><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">define</SPAN>
USER_HZ 100 <SPAN
style="COLOR: rgb(255,153,0)">/* <FONT
color=#ff0000>用户空间使用的HZ</FONT>,User interfaces
are in "ticks" */</SPAN><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">define</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">CLOCKS_PER_SEC</SPAN> <SPAN
style="COLOR: rgb(0,0,204)">(</SPAN>USER_HZ<SPAN
style="COLOR: rgb(0,0,204)">)</SPAN> <SPAN
style="COLOR: rgb(255,153,0)">/* like times()
*/</SPAN><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN><SPAN
style="COLOR: rgb(0,0,255)">else</SPAN><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">define</SPAN>
HZ 100<BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN><SPAN
style="COLOR: rgb(255,0,0)">endif</SPAN></FONT></SPAN></CODE></P></TD></TR></TBODY></TABLE></DIV>
<P><FONT color=#0000ff>也就是说:HZ
由__KERNEL__和CONFIG_HZ决定。若未定义__KERNEL__,HZ为100;否则为CONFIG_HZ。而CONFIG_HZ是在内核的根目录的.config文件中定义,并没有在make
menuconfig的配置选项中出现。Linux的\arch\arm\configs\s3c2410_defconfig文件中的定义为:
</FONT></P>
<DIV>
<TABLE style="BORDER-COLLAPSE: collapse"
borderColor=#999999 cellSpacing=0 cellPadding=0
width="95%" bgColor=#f1f1f1 border=1>
<TBODY>
<TR>
<TD>
<P
style="MARGIN: 5px; LINE-HEIGHT: 150%"><CODE><SPAN
style="COLOR: rgb(0,0,0)"><FONT face=新宋体><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN> Kernel
Features<BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN>
CONFIG_PREEMPT is <SPAN
style="COLOR: rgb(0,0,255)">not</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">set</SPAN><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN>
CONFIG_NO_IDLE_HZ is <SPAN
style="COLOR: rgb(0,0,255)">not</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">set</SPAN><BR><FONT
color=#ff0000><STRONG>CONFIG_HZ<SPAN
style="COLOR: rgb(0,0,204)">=</SPAN>200</STRONG></FONT><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN>
CONFIG_AEABI is <SPAN
style="COLOR: rgb(0,0,255)">not</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">set</SPAN><BR><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN>
CONFIG_ARCH_DISCONTIGMEM_ENABLE is <SPAN
style="COLOR: rgb(0,0,255)">not</SPAN> <SPAN
style="COLOR: rgb(255,0,0)">set</SPAN></FONT></SPAN></CODE></P></TD></TR></TBODY></TABLE></DIV>
<P><FONT
color=#0000ff><STRONG>所以正常情况下s3c24x0的HZ为200。这一数值在后面的实验中可以证实。</STRONG></FONT></P>
<P>每次发生一个时钟中断,内核内部计数器的值就加一。这个计数器在系统启动时初始化为 0,
因此它代表本次系统启动以来的时钟嘀哒数。这个计数器是一个 64-位 变量( 即便在
32-位的体系上)并且称为 “jiffies_64”。但是驱动通常访问 jiffies
变量(unsigned long)(根据体系结构的不同:可能是 jiffies_64
,可能是jiffies_64 的低32位)。使用 jiffies
是首选,因为它访问更快,且无需在所有的体系上实现原子地访问 64-位的 jiffies_64 值。
</P>
<P><FONT color=#0000ff size=4><STRONG>使用 jiffies
计数器</STRONG></FONT></P>
<P>这个计数器和用来读取它的工具函数包含在 <FONT
color=#0000ff><linux/jiffies.h>,</FONT>
通常只需包含 <FONT
color=#0000ff><linux/sched.h>,</FONT>它会自动放入
jiffies.h 。 jiffies 和 jiffies_64
必须被当作只读变量。当需要记录当前 jiffies 值(被声明为 volatile
避免编译器优化内存读)时,可以简单地访问这个 unsigned long 变量,如: </P>
<P>
<TABLE style="BORDER-COLLAPSE: collapse"
borderColor=#999999 cellSpacing=0 cellPadding=0
width="95%" bgColor=#f1f1f1 border=1>
<TBODY>
<TR>
<TD>
<P
style="MARGIN: 5px; LINE-HEIGHT: 150%"><CODE><SPAN
style="COLOR: rgb(0,0,0)"><FONT face=新宋体><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN><SPAN
style="COLOR: rgb(255,0,0)">include</SPAN> <SPAN
style="COLOR: rgb(0,0,204)"><</SPAN>linux<SPAN
style="COLOR: rgb(0,0,204)">/</SPAN>jiffies<SPAN
style="COLOR: rgb(0,0,204)">.</SPAN>h<SPAN
style="COLOR: rgb(0,0,204)">></SPAN><BR><SPAN
style="COLOR: rgb(0,0,255)">unsigned</SPAN>
<SPAN style="COLOR: rgb(0,0,255)">long</SPAN>
j<SPAN style="COLOR: rgb(0,0,204)">,</SPAN>
stamp_1<SPAN
style="COLOR: rgb(0,0,204)">,</SPAN>
stamp_half<SPAN
style="COLOR: rgb(0,0,204)">,</SPAN>
stamp_n<SPAN
style="COLOR: rgb(0,0,204)">;</SPAN><BR><BR><STRONG><FONT
color=#ff0000>j <SPAN
style="COLOR: rgb(0,0,204)">=</SPAN>
jiffies</FONT></STRONG><SPAN
style="COLOR: rgb(0,0,204)">;</SPAN> <SPAN
style="COLOR: rgb(255,153,0)">/* read the
current value */</SPAN><BR>stamp_1 <SPAN
style="COLOR: rgb(0,0,204)">=</SPAN> j <SPAN
style="COLOR: rgb(0,0,204)">+</SPAN> HZ<SPAN
style="COLOR: rgb(0,0,204)">;</SPAN> <SPAN
style="COLOR: rgb(255,153,0)">/* 1 second in the
future */</SPAN><BR>stamp_half <SPAN
style="COLOR: rgb(0,0,204)">=</SPAN> j <SPAN
style="COLOR: rgb(0,0,204)">+</SPAN> HZ<SPAN
style="COLOR: rgb(0,0,204)">/</SPAN>2<SPAN
style="COLOR: rgb(0,0,204)">;</SPAN> <SPAN
style="COLOR: rgb(255,153,0)">/* half a second
*/</SPAN><BR>stamp_n <SPAN
style="COLOR: rgb(0,0,204)">=</SPAN> j <SPAN
style="COLOR: rgb(0,0,204)">+</SPAN> n <SPAN
style="COLOR: rgb(0,0,204)">*</SPAN> HZ <SPAN
style="COLOR: rgb(0,0,204)">/</SPAN> 1000<SPAN
style="COLOR: rgb(0,0,204)">;</SPAN> <SPAN
style="COLOR: rgb(255,153,0)">/* n milliseconds
*/</SPAN></FONT></SPAN></CODE></P></TD></TR></TBODY></TABLE></P>
<P>以下是一些简单的工具宏及其定义: </P>
<P>
<TABLE style="BORDER-COLLAPSE: collapse"
borderColor=#999999 cellSpacing=0 cellPadding=0
width="95%" bgColor=#f1f1f1 border=1>
<TBODY>
<TR>
<TD>
<P
style="MARGIN: 5px; LINE-HEIGHT: 150%"><CODE><SPAN
style="COLOR: rgb(0,0,0)"><FONT face=新宋体><SPAN
style="COLOR: rgb(0,0,204)">#</SPAN><SPAN
style="COLOR: rgb(255,0,0)">define</SPAN>
time_after<SPAN
style="COLOR: rgb(0,0,204)">(</SPAN>a<SPAN
style="COLOR: rgb(0,0,204)">,</SPAN>b<SPAN
style="COLOR: rgb(0,0,204)">)</SPAN> \<BR> <SPAN
style="COLOR: rgb(0,0,204)">(</SPAN>typecheck<SPAN
style="COLOR: rgb(0,0,204)">(</SPAN><SPAN
style="COLOR: rgb(0,0,255)">unsigned</SPAN>
<SPAN
style="COLOR: rgb(0,0,255)">long</SPAN><SPAN
style="COLOR: rgb(0,0,204)">,</SPAN> a<SPAN
style="COLOR: rgb(0,0,204)">)</SPAN> <SPAN
style="COLOR: rgb(0,0,204)">&</SPAN><SPAN
style="COLOR: rgb(0,0,204)">&</SPAN>
\<BR> typecheck<SPAN
style="COLOR: rgb(0,0,204)">(</SPAN><SPAN
style="COLOR: rgb(0,0,255)">unsigned</SPAN>
<SPAN
style="COLOR: rgb(0,0,255)">long</SPAN><SPAN
style="COLOR: rgb(0,0,204)">,</SPAN> b<SPAN
style="COLOR: rgb(0,0,204)">)</SPAN> <SPAN
style="COLOR: rgb(0,0,204)">&</SPAN><SPAN
style="COLOR: rgb(0,0,204)">&</SPAN>
\<BR> <SPAN
style="COLOR: rgb(0,0,204)">(</SPAN><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -