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

交互式多媒体网站开发wordpress 自定义帖子

交互式多媒体网站开发,wordpress 自定义帖子,360极速浏览器网站开发缓存,恩施网站建设教程【linux驱动】定时器的使用 文章目录 【linux驱动】定时器的使用1.介绍1.1相关名词1.2配置HZ的方法 2.API3.示例4.调试 1.介绍 1.1相关名词 HZ、jiffies、tick Linux系统启动后#xff0c;每隔固定周期就会发出timer interrupt(IRQ 0)#xff0c;HZ用来定义每一秒发生多少…【linux驱动】定时器的使用 文章目录 【linux驱动】定时器的使用1.介绍1.1相关名词1.2配置HZ的方法 2.API3.示例4.调试 1.介绍 1.1相关名词 HZ、jiffies、tick Linux系统启动后每隔固定周期就会发出timer interrupt(IRQ 0)HZ用来定义每一秒发生多少次timer interrupt 一般HZ的值并不确定可以被修改设定可供修改的值有100HZ 200HZ 250HZ 300HZ 500HZ 1000HZ; 具体修改方法下面有Tick是HZ的倒数意即timer 也就是发生一次中断的时间比如HZ是250时tick为1/250s也就是4msJiffies为Linux核心变数unsigned long用来记录系统开启以来发生的timer interrupt的次数这里需要注意的就是32位的类型会出现溢出导致数据不准确这个时间好像是30天还是40天记不住大概是这个时间;64位的类型就不会出现这个问题溢出都要几百万年了其他的倒是不用怎么关注定时器的使用程序里面都是套路下面是一些其他的内容提供给想了解的同志。1.2配置HZ的方法 menuconfig 打开menuconfig配置界面 cd xxx/Linux-xxx.xxx make menuconfig我的系统默认选择的是100HZ其他选项 .config cd 到对应linux源码顶层目录下 vi .config修改后可以使用下面的命令 esc 后 :wq! 要是只是看看就直接esc :q!2.API 头文件 #include linux/timer.h对应结构体 struct timer_list { struct hlist_node entry; //构成内核链表相关成员unsigned long expires; //定时器到期时间void (*function)(struct timer_list *); //定时器处理函数u32 flags; //一般填写为0};初始化定时器 方式1void timer_func(struct timer_list *timer){}mytimer.expires jiffiesHZ; //# define HZ CONFIG_HZ 定时1stimer_setup(mytimer, timer_func, 0);方式2/*我的好像是linux版本太低导致无法使用比较新的API,因此使用下面的方式*/void timer_func(struct timer_list *timer){} init_timer(mytimer); mytimer.expires jiffies HZ/50; mytimer.function timer_func; // 设置定时器到期时调用的回调函数还有其他的方式这里就不一一赘述有兴趣的可以多多探索启动定时器 void add_timer(struct timer_list *timer)//启动定时器定时器启动之后只会执行一次add_timer只能调用一次//如果第二次调用内核会崩溃int mod_timer(struct timer_list *timer, unsigned long expires)//功能再次启动定时器删除定时器 int del_timer(struct timer_list *timer)//删除定时器3.示例 key.h #ifndef __KEY_CTRL_H__ #define __KEY_CTRL_H__#include linux/timer.h #include linux/module.h #include linux/of.h #include linux/of_gpio.h #include linux/device.h #include linux/fs.h #include linux/init.h #include linux/io.h #include linux/module.h #include linux/uaccess.h #include linux/gpio/consumer.h #include linux/interrupt.h #include linux/of_irq.h #include linux/interrupt.h #include linux/timer.h#define KEY_NAME1 KEY_USER1 #define KEY_NAME2 KEY_USER2 #define CONSUMER_LABEL1 user1 #define CONSUMER_LABEL2 user2#define PATH_DTS_KEY_USR1 /psd_key_irqs/user1 #define PATH_DTS_KEY_USR2 /psd_key_irqs/user2#define KMD_ERR(str) \printk(%s %s line: %d %s \n, __FILE__, __FUNCTION__, __LINE__, str);typedef struct my_key {char *dev_name;struct device_node *key_node;unsigned int key_irq_no;int key_num;int key_status;//led开关状态int Level_state;//电平状态struct timer_list mytimer; // 分配定时器 } key_ctrl_t;/*key1设备树控制的初始化*/ int key1_ctrl_init(key_ctrl_t * key); /*key2设备树控制的初始化*/ int key2_ctrl_init(key_ctrl_t * key); /*led设备树控制的卸载处理函数*/ void key_ctrl_exit(key_ctrl_t * key);#endifkey.c #includekey_ctrl.h #include linux/timer.hvoid my_timer_callback1(unsigned long para) {printk(key1 down...\n); }void my_timer_callback2(unsigned long para) {printk(key2 down...\n); }irqreturn_t key1_irq_handle(int irq, void* dev) {key_ctrl_t *key1 (key_ctrl_t *)dev;// 启动定时器mod_timer(key1-mytimer, jiffies HZ/50);return IRQ_HANDLED; }irqreturn_t key2_irq_handle(int irq, void* dev) {key_ctrl_t * key2 (key_ctrl_t *)dev;// 启动定时器mod_timer(key2-mytimer, jiffies HZ/50);return IRQ_HANDLED; }int key1_ctrl_init(key_ctrl_t * key) {int ret;key-key_node of_find_node_by_path(PATH_DTS_KEY_USR1);if(IS_ERR(key-key_node)){KMD_ERR(of_find_node_by_path ERR);ret -ENODATA;goto exit;}// 2.解析得到软中断号key-key_irq_no irq_of_parse_and_map(key-key_node, 0);if (key-key_irq_no 0) {printk(irq_of_parse_and_map error\n);ret -EAGAIN;goto exit_node;// 资源暂时不可用}init_timer(key-mytimer);key-mytimer.expires jiffies HZ/50;// timer_setup_on_stack(key-mytimer, my_timer_callback1, 0);key-mytimer.function my_timer_callback1; // 设置定时器到期时调用的回调函数add_timer(key-mytimer); //将定时器加入到系统定时器链表中ret request_irq(key-key_irq_no, key1_irq_handle,IRQF_TRIGGER_LOW, KEY_NAME1, key);if (ret) {printk(request_irq key1 error\n);goto exit_irq;}return 0; exit_irq:free_irq(key-key_irq_no, NULL); exit_node:of_node_put(key-key_node); exit:return ret; // 出错返回 }int key2_ctrl_init(key_ctrl_t * key) {int ret;key-key_node of_find_node_by_path(PATH_DTS_KEY_USR2);if(IS_ERR(key-key_node)){KMD_ERR(of_find_node_by_path ERR);ret -ENODATA;goto exit;}// 2.解析得到软中断号key-key_irq_no irq_of_parse_and_map(key-key_node, 0);if (key-key_irq_no 0) {printk(irq_of_parse_and_map error\n);of_node_put(key-key_node); // 清理已获取的节点ret -EAGAIN;goto exit_node;// 资源暂时不可用}init_timer(key-mytimer); key-mytimer.expires jiffies HZ/50;// timer_setup(key-mytimer, my_timer_callback2, 0);key-mytimer.function my_timer_callback2; // 设置定时器到期时调用的回调函数add_timer(key-mytimer); //将定时器加入到系统定时器链表中ret request_irq(key-key_irq_no, key2_irq_handle,IRQF_TRIGGER_LOW, KEY_NAME2, key);if (ret) {printk(request_irq key2 error\n);goto exit_irq;}return 0; exit_irq:free_irq(key-key_irq_no, NULL); exit_node:of_node_put(key-key_node); exit:return ret; // 出错返回 }void key_ctrl_exit(key_ctrl_t * key) {free_irq(key-key_irq_no,key);if (timer_pending(key-mytimer)) {del_timer_sync(key-mytimer);}}MODULE_DESCRIPTION(key_ctrl_driver); MODULE_LICENSE(GPL);4.调试 这里的按键防抖需要注意以下几点首先不加定时器防抖看下按键硬件是否已经存在防抖机制 其次使用定时器的时候要确定linux的HZ是多少确定一次timer irq是多久再添加防抖代码 再一个就是一般来说按键抖动会在20ms左右 最后就是如果HZ是100hz、jiffies1就是在计数的基础上延时10ms触发自定义的定时器中断函数over祝各位定时器使用愉快
http://www.zqtcl.cn/news/368693/

相关文章:

  • 外贸公司网站制作价格网络公司的经营范围有哪些
  • 东莞三合一网站制作海南省生态文明村建设促进会网站
  • 邯郸做企业网站设计的公司福田祥菱m2
  • 手表拍卖网站动漫做暧视频网站
  • 福州网站定制公司如何做p2p网站
  • 微信外链网站开发嘉兴市城市建设门户网站
  • 在手机上如何制作网站qq注册网页入口
  • asp.net程序做的网站安全吗国内什么网站用asp.net
  • 凡科网做网站网站编辑知识
  • c#做交易网站taxonomy wordpress
  • 统一门户网站开发员给我用织梦做的网站
  • 网站上有声的文章是怎么做的深圳市住房和建设局网站和市住宅租赁管理服务中心
  • 如何对网站进行爬虫页面设计存在的问题
  • 知名网站建设加盟合作企业邮箱如何登录
  • asp net mvc做网站软文推广是什么
  • 张家口住房和城乡建设厅网站如何做点击赚钱的网站
  • 网站在建设中无法访问贵州碧江区住房和城乡建设局网站
  • 营销类网站 英文东莞正规的免费网站优化
  • 柳州网站推广最好的公司百度seo优化培训
  • 哈尔滨门户网站建站哪个网站做农产品
  • 网站行业关键词如何建设网站
  • wordpress插件目录504wordpress访问优化插件
  • 固定ip做网站网页源码提取工具
  • php网站模板源码下载公司网络营销推广软件
  • 免费电子版个人简历模板温州快速排名优化
  • 网站修改titlewordpress显示icp备案
  • 中国国际贸易单一窗口登录南京专业网站优化公司
  • 手机网站建设合同wordpress案例分析
  • 深圳做网站什么公司好广州电商小程序开发
  • 郑州高新区做网站的公司如何欣赏网站