开发平台

*  芯灵思SinlinxA33开发板

淘宝店铺: https://sinlinx.taobao.com/

嵌入式linux 开发板交流 QQ:641395230

Linux 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件中。

内核定时器的数据结构

struct timer_list {
struct list_head entry; //双向链表元素list:用来将多个定时器连接成一条双向循环队列。
unsigned long expires; //expires 字段表示期望定时器执行的 jiffies 值,到达该 jiffies 值时,将调用 function 函数,并传递 data 作为参数。
void (*function)(unsigned long); //指向一个可执行函数。当定时器到期时,内核就执行function所指定的函数。而data域则被内核用作function函数的调用参数。
unsigned long data;
struct tvec_base *base;
/* ... */
};

时间比较操作

在定时器应用中经常需要比较两个时间值,以确定timer是否超时,所以Linux内核在timer.h头文件中定义了4个时间关系比较操作宏。这里我们说时刻a在时刻b之后,就意味着时间值a≥b。Linux强烈推荐用户使用它所定义的下列4个时间比较操作宏(include/linux/timer.h):

#define time_after(a,b) ((long)(b) - (long)(a) < 0)
#define time_before(a,b) time_after(b,a)
#define time_after_eq(a,b) ((long)(a) - (long)(b) >= 0)
#define time_before_eq(a,b) time_after_eq(b,a)

Linux 内核时间相关转换函数

1. unsigned long usecs_to_jiffies(const unsigned int u)

功能: 把微秒转换成时钟节拍
参数: u 时间微秒
返回: 对应的时钟节拍数量

2. unsigned long msecs_to_jiffies(const unsigned int m)

功能: 把毫秒转换成时钟节拍
参数: u 时间毫秒
返回: 对应的时钟节拍数量
示例: 要定时从现在开始, 3 毫秒执行一个函数
expires 设置为 jiffies+ msecs_to_jiffies(3)

Linux 内核定时器操作相关 API

  1. 静态定义结构体变量并且初始化(宏)

    DEFINE_TIMER(_name, _function, _expires, _data)

功能: 定义一个名字为_name 的 struct timer_list 结构的变量, 并且初始化它的 function, expires, data 成员

2. 定时器初始化(宏)

init_timer(timer)

功能: 只是对 struct timer_list 结构成员进行一些基础初始化操作, function, expires, data 成员还需要用户自

己填充。

3.设置定时器(宏)

setup_timer(timer, fn, data)

功能: 设置定时器中的 function, data 和一些基础成员, expires 并没有初始化, 需要用户自己进行初始化

4. 注册定时器到内核

void add_timer(struct timer_list *timer)

功能: 向内核注册一个定时器, 注册后会马上开始计时。

5.从内核注销定时器

int del_timer(struct timer_list * timer);

功能: 从内核定时链表上删除指定的定时器, 删除后就不会再执行绑定的函数

6. 修改定时器定时时间值, 并且重新注册

int mod_timer(struct timer_list *timer, unsigned long expire0.s);

功能: 修改定时器定时时间值, 并且重新注册, 不管这个定时的超时函数是否执行过。 执行完成后会马上启

动定时。

内核定时器编程步骤

Step1 定义timer_list 结构变量

Step2 定义超时函数

Step3 对timer_list结构变量进行初始化

Step4 注册定时器,启动定时

Step5 注销定时器

实验平台:芯灵思SinlinxA33开发板

驱动代码:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h> //Step1 timer_list 结构变量
struct timer_list timer;
//Step2 超时函数
void timer_fun(long data)
{
printk("%s is call! data:%d\r\n",__FUNCTION__,data);//__FUNCTION__ 获取当前函数名
mod_timer(&timer, jiffies + HZ*1); //再次修改本定时器超时时间为当前时间后1秒
}
static int __init timer_init(void)
{
//Step3 对timer_list结构变量进行初始
init_timer(&timer);
setup_timer(&timer, timer_fun, 666);
timer.expires = jiffies + HZ*2;
//Step4 注册定时器,启动定时
add_timer(&timer);
printk("Timer start!\r\n");
return 0;
}
static void __exit timer_exit(void) //Module exit function specified by module_exit()
{
//Step5 注销定时器
del_timer_sync(&timer);
printk("Timer over!\r\n");
}
module_init(timer_init);
module_exit(timer_exit);
MODULE_LICENSE("GPL");

Makefile代码:

KERN_DIR = /work/lichee/linux-3.4
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m += timer_drv.o

嵌入式linux 开发板交流 QQ:641395230

最后使用 dmseg 命令查看,可以看到每隔1秒打印一次

芯灵思SinlinxA33开发板Linux内核定时器编程的更多相关文章

  1. 全志A33开发板Linux内核定时器编程

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...

  2. 芯灵思Sinlinx A64开发板Linux内核定时器编程

    开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 Linux 内核定时器是内 ...

  3. 芯灵思SinlinxA33开发板 Linux平台总线设备驱动

    1.什么是platform(平台)总线? 相对于USB.PCI.I2C.SPI等物理总线来说,platform总线是一种虚拟.抽象出来的总线,实际中并不存在这样的总线. 那为什么需要platform总 ...

  4. 芯灵思SinA33开发板怎样安装虚拟机

    芯灵思SinA33开发板怎样安装虚拟机 今天入手一块芯灵思的开发板,型号为SIN-A33,用的是全志的A33芯片,与其它开发板不同的是, 芯灵思开发板手册上用来搭建开发环境的linux系统是cento ...

  5. 芯灵思SINA33开发板怎样创建编译环境

    首先在Vmware安装好Centos,在此不再重复步骤,大家可以看以前的帖子有详细的步骤.本节主要介绍如何在Centos 搭建编译环境 Step 1 更新 CentOS 源 CentOS 由于很追求稳 ...

  6. 芯灵思SInA33开发板怎样烧写镜像文件

    上一节已经制作好了linux镜像文件,现在将它烧入开发板中需要的工具有 * SINLINX-A33_qt-4.8.7_lcd1024x600_v3.1 #镜像文件 * PhoenixSuit #烧写工 ...

  7. 芯灵思Sinlinx A64开发板 Linux内核等待队列poll ---阻塞与非阻塞

    开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 阻塞:阻塞调用是指调用结果 ...

  8. s5pc100开发板linux内核移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y 应用于FSC100开发板 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc linux-2.6 ...

  9. 全志A33 lichee 开发板 Linux中断编程原理说明

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 本节实验目标实现按键触发中断 ...

随机推荐

  1. java⑦

    1. 逻辑运算符 * 01. && 短路与 并且的关系 * 表达式1 && 表达式2 * 001.如果 表达式1为false,则不执行 表达式2 * 002.表达式1, ...

  2. day044 cssy其他样式 js初识

    float: 浮动 .t1{ float: right/left; } 关于浮动的两个特点: 1.浮动的框可以向左或向右移动,知道他的外边缘碰到包括框或另一个浮动框的边框为止. 2.由于浮动框不在文档 ...

  3. mac mamp环境 和linux下 安装redis 和可视化工具 Redis Desktop Manager

    mac下安装 第一步:安装redis 1. brew install redis 2.启动服务/usr/local/opt/redis/bin/redis-server 3.配置redis密码访问 编 ...

  4. 2.6 C++通过引用来传递和返回类对象

    参考:http://www.weixueyuan.net/view/6338.html 总结: C++语言中,由类声明的对象,和其它类型声明的变量一样,同样可以通过传值.引用和指针的方式作为函数的参数 ...

  5. 1.3用socketserver创建服务器

    socket服务器代码 # -*- coding: utf-8 -*-import socketserver,time myHost = '' myPort = 50007 def now(): #返 ...

  6. 对弈的Python学习笔记

    #主要序列类型 str list tuple #列表 list ls=[1,2,3,4]#末尾追加ls.append(5) #添加多个,扩展ls.extend([5,6,7]) #在某个位置插入一个值 ...

  7. nw.js的localStorage的物理储存位置

    前言 因为在做美团外卖商家端的nw.js壳子项目,需要保证在壳子里面使用localStorage的数据可以持久化保存. 发现nw可以保存,即使删除应用重写打包也可以保存,所以解决了这个需求,但是还是需 ...

  8. Java流对象理解

    马士兵老师,曾在Java的学习过程中,将Java的流比作管道,认为很贴切,在此笔者也建议读者在学习过程中作类似比喻,形象化的学习 Java根据数据流向的不同分为输入流和输出流: Java根据处理数据类 ...

  9. 从命令行模式运行Windows管理工具。

    从命令行模式运行Windows管理工具. 分类: Play Windows 2004-08-06 16:39 6076人阅读 评论(3) 收藏 举报 1.可以直接在开始-〉运行里面输入的管理工具: 文 ...

  10. 201621123001 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 通过IP地址和端口号可以进行建立Socket对象,然后进行通信 使用Socket的一般步骤: 建立Sock ...