在本主题中,让我们谈谈Linux中的计时器。
在Linux内核中,有一个称为内核计时器的计时器。
内核计时器用于控制某个功能,即该计时器要处理的功能将在将来的某个时间执行。
内核计时器注册的处理功能仅执行一次,即不会循环执行。
如果延迟的精度不高,则最简单的实现方法如下:忙等待:无符号长j =吉非+ jit_delay * HZ; While(jiffies& lt;& nbsp; j){& nbsp; & nbsp; & nbsp; & nbsp; & nbsp;……}以下是特定参数的含义:jiffies:全局变量,用于记录自系统启动以来的总拍数。
内核在启动时将此变量初始化为0;否则,它将初始化为0。
之后,时钟中断处理程序会每次增加此变量的值。
每秒的中断数为HZ,跳动会在一秒钟内增加HZ。
系统运行时间= jiffie / HZ。
Jiffies的目的:计算经过的时间和时间管理Jiffies内部表示形式:extern u64 jiffies_64;外部未签名的长volatilejiffies;& nbsp;& nbsp;& nbsp; //与位长改变系统相关的32/64 ----& gt; | | 32位:497天后溢出64位:...计时器中有一个这样的概念来测量时间差:时钟中断是由系统的计时硬件按固定的时间间隔生成的。
这个间隔很简单。
实际上,频率是由内核根据HZ确定的。
HZ是一个与体系结构无关的常数。
可以将其配置为(50-1200)。
在X86平台上,其值默认为1000;默认值为1000。
计时器与内核中的头文件有关。
并且数据结构如下:#include< linux / timer.h& gt; & nbsp; / *计时器* /#include& lt; asm / uaccess.h& gt; & nbsp; / * jiffies * / struct timer_list {/ * *在正常运行时更改的所有字段都分组到*相同的缓存行* / //该计时器可用作链接列表struct list_head条目的节点; //定时值基于无符号长过期的jiffies; //计时器的内部值struct tvec_base * base; //定时器处理Function void(* function)(unsigned long); //定时器处理函数参数无符号长数据; int松弛#ifdef CONFIG_TIMER_STATS int start_pid;无效* start_site; char start_comm [16]; #endif #ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map; #万一 };使用计时器的最基本方法可以使用以下两个内核提供的宏://初始化计时器#define init_time r(timer)init_timer_key((timer),NULL,NULL)//注册一个timer#define setup_timer(定时器,fn,数据)setup_timer_key((timer),NULL,NULL,(fn),(data))和以下两个功能:添加定时器void add_timer(struct timer_list * timer)删除定时器int del_timer(struct timer_list *计时器)那么编写计时器的具体步骤是什么? 1.初始化内核计时器2.设置计时器执行功能的参数(可选)3.设置计时时间4.设置计时器功能5.启动计时器接下来,我们结合一个简单的驱动程序来了解过程,该驱动程序非常简单,即启动后,开发板上的蜂鸣器将在5s之后每1s交替响一次。
让我们看一下开发板上蜂鸣器的示意图:(1)蜂鸣器接口位于电路板的底部。
查看电路图,您可以看到它是高级有效的。
(2)相应地找到核心板的接口。
可以看出,我们的蜂鸣器是GPD0_0 接下来,查找数据手册,找到相应的寄存器,然后对其进行配置。
& nbsp; 2.检查数据手册,找到相关的寄存器,然后进行配置(1)找到GPD0CON,地址为0x114000A0,我们需要将GPD0CON(0)配置为输出状态。
即,将值0x1写入该寄存器。
& nbsp; (2)找到GPD0DAT寄存器,该寄存器用于配置蜂鸣器的高电平和低电平。
物理地址为0x114000A4,仅比前一个偏移4个字节。
我们只需要向该寄存器写入1和0,即可发出蜂鸣声,哈哈。
很简单吗?整个简单的驱动程序代码如下:#include& lt; linux / module.h& gt; #include& lt; linux / kernel.h& gt; #include& lt; linux / init.h& gt; #include& lt; linux / platform_device。
h& gt; #include& lt; linux / fb.h& gt; #include& lt; linux / backlight.h& gt; #include& lt; linux / err.h& gt; #include& lt; linux / pwm.h& gt; #include& lt; linux / slab。
h& gt; #include& lt; linux / miscdevice.h& gt; #include& lt; linux / delay.h& gt; #include& lt; linux / gpio.h& gt; #include& lt; mach / gpio.h& gt; #include& lt; plat / gpio- cfg.h& gt; #include&a