当前位置: 首页 > wzjs >正文

做配电箱的专门网站怎样做自己的小说网站

做配电箱的专门网站,怎样做自己的小说网站,优秀的设计案例及说明,关键词推广排名了解内核定时相关基础知识 文章目录 简要介绍timer_list 特点API 函数实验测试程序 - timer_mod.c编译文件-Makefile实验验证 注意事项总结 简要介绍 硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始…

了解内核定时相关基础知识

文章目录

  • 简要介绍
  • timer_list 特点
  • API 函数
  • 实验
    • 测试程序 - timer_mod.c
    • 编译文件-Makefile
    • 实验验证
  • 注意事项
  • 总结


简要介绍

硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始的起点, 以未来的某一时刻为计时的终点) , 内核只有在系统定时器的帮助下才能计算和管理时间, 但是内核定时器的精度并不高, 所以不能作为高精度定时器使用。并且内核定时器的运行没有周期性, 到达计时终点后会自动关闭。 如果要实现周期性定时, 就要在定时处理函数中重新开启定时器。

Linux 内核中使用 timer_list 结构体表示内核定时器, 该结构体定义在“内核源码/include/li
nux/timer.h”文件中, 具体内容如下所示


struct timer_list {struct hlist_node   entry;unsigned long       expires;/* 定时器超时时间,单位是节拍数 */void            (*function)(struct timer_list *);/* 定时处理函数 */u32         flags;#ifdef CONFIG_LOCKDEPstruct lockdep_map  lockdep_map;
#endifANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);
};

timer_list 特点

inux 内核定时器是基于 timer_list 结构的动态定时器,具有以下特点:

  • 不是周期性的,超时后会自动失效

  • 基于内核的 jiffies 计时

  • 在中断上下文执行,因此不能睡眠

  • 精度取决于 HZ 值(通常为 1ms 或 10ms)

API 函数

函数作用
void add_timer(struct timer_list *timer)向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会开始运行
int del_timer(struct timer_list * timer)删除一个定时器
int mod_timer(struct timer_list *timer,unsigned long expires)修改定时值,如果定时器还没有激活的话,mod_timer 函数会激活定时器

在使用add_timer()函数向 Linux 内核注册定时器之前,还需要设置定时时间,定时时间由timer_list结构体中的expires参数所确定,单位为节拍数

这里简要理解,节拍数 jiffies 和 时间之间的转换函数:

jiffies_64用于64位系统,而jiffies用于 32 位系统。为了方便开发,Linux 内核还提供了几个jiffies和ms、us、ns之间的转换函数,如下 所示:

函数作用
int jiffies_to_msecs(const unsigned long j)将 jiffies 类型的参数 j 分别转换为对应的毫秒
int jiffies_to_usecs(const unsigned long j)将 jiffies 类型的参数 j 分别转换为对应的微秒
u64 jiffies_to_nsecs(const unsigned long j)将 jiffies 类型的参数 j 分别转换为对应的纳秒
long msecs_to_jiffies(const unsigned int m)将毫秒转换为 jiffies 类型
long usecs_to_jiffies(const unsigned int u)将微秒转换为 jiffies 类型
unsigned long nsecs_to_jiffies(u64 n)将纳秒转换为 jiffies 类型

既然要定时,那么情形就是 把定时时间转换成节拍数,系统内核根据节拍数和节拍频率。内核里面只认节拍数,它对应的就是频率

例如:进行3秒钟的定时:

timer_test.expires = jiffies_64 +msecs_to_jiffies(3000)

实验

测试程序 - timer_mod.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/timer.h>static void function_test(struct timer_list  *t);//定义function_test定时功能的函数
DEFINE_TIMER(timer_test,function_test);static void function_test(struct timer_list *t){printk(" this is function test \n");mod_timer(&timer_test,jiffies_64+msecs_to_jiffies(5000));  使用mod_timer函数将定时时间设置为五秒后}static int __init time_module_init(void) //驱动入口函数
{timer_test.expires = jiffies_64 + msecs_to_jiffies(5000);//将定时时间设置为五秒后add_timer(&timer_test);//添加一个定时器return 0;}
static void __exit time_module_exit(void) //驱动出口函数
{del_timer(&timer_test);//删除一个定时器printk("module exit \n");}
module_init(time_module_init);
module_exit(time_module_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("wang fang chen");

源码分析

  • 这里用到了定时器timer_list 的三个api 函数:
    定义定时器:DEFINE_TIMER(timer_test,function_test); 参数为定时器名称和回调方法
    添加定时器:add_timer(&timer_test);
    修改定时器:mod_timer(&timer_test,jiffies_64+msecs_to_jiffies(5000));
    删除定时器:del_timer(&timer_test);

    **注意点:**定时器的名称并不是作为变量定义的,作为方法参数定义了的 DEFINE_TIMER的方法参数。
    回调函数 function_test 是先定义,然后实现 。

编译文件-Makefile

#!/bin/bash
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
obj-m += timer_mod.o
KDIR :=/home/wfc123/Linux/rk356x_linux/kernel
PWD ?= $(shell pwd)
all:make -C $(KDIR) M=$(PWD) modulesclean:make -C $(KDIR) M=$(PWD) clean

实验验证

加载驱动看打印信息
在这里插入图片描述

注意事项

  • 定时器精度:内核定时器的精度受 HZ 值影响,不适合需要高精度的场合

  • 执行上下文:回调函数在中断上下文执行,不能调用可能睡眠的函数

  • 多核处理:del_timer() 可能在 SMP 系统上返回后定时器仍在运行,使用 del_timer_sync() 更安全

  • 竞争条件:确保在模块退出时删除所有定时器

总结

这里了解的是内核的一个定时器timer_list 的使用。 了解基本知识即可。

http://www.dtcms.com/wzjs/546594.html

相关文章:

  • 政务网站的建设时期的概述安庆市住房和城乡建设局网站
  • 网站建设多少预算中国建设银行北京分行网站
  • 苏州外贸网站建设公司如何查看wordpress版本
  • 宝山做网站公司阜南县建设局网站
  • 网站开发 法律申明微信支付公司网站
  • 运城网站开发迅雷资源做下载网站
  • 帝国cms 网站迁移错版网站开发者密钥
  • 网站建设打造营销型网站用服务器ip怎么做网站
  • 中学校园网站建设方案wordpress怎么使用固定连接
  • 网站到底怎么做出来的安卓app制作公司
  • 如何代做网站专业seo服务商
  • 牡丹江3d网站开发中国市场网
  • 自己电脑做服务器上传网站 需要备案吗这个网站做海外推广
  • 长沙做企业网站ppt网站建设
  • 昆山做网站的jofuns汽车维修东莞网站建设
  • 网站建设与维护课难吗什么是网络营销促销?网络营销促销有何作用?
  • 淘宝网站建设素材10个零网站建设
  • 网站怎样绕过360认证衡水阿里巴巴网站建设
  • 网站设计风格化wordpress调用分类目录插件
  • 网站怎么做百度地图怎样学习网站建设
  • 一起做业网站建立网站策划
  • 阿米纳网站建设idc机房运维
  • 个人网站一年多少钱中铁建设集团有限公司单位代码
  • 网站板块设计有哪些线上推广的渠道
  • 个人外贸网站建设怎样做科技小制作视频网站
  • 涿鹿网站建设新品发布会的作用
  • 网站建设方案有关内容wordpress一个分类名字
  • 南昌盗网站少优化公司怎么看wordpress数据库位置
  • 公司英文网站多少钱网络设备具体有哪些
  • 郑州网站制作天强科技汽车网络营销方式