内核定时器实验

  • 一、相关知识
  • 二、驱动源码
  • 三、APP源码
  • 四、实验总结

一、相关知识

jiffies

extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies;
/** Convert various time units to each other:*/
extern unsigned int jiffies_to_msecs(const unsigned long j);
extern unsigned int jiffies_to_usecs(const unsigned long j);
extern unsigned long msecs_to_jiffies(const unsigned int m);
extern unsigned long usecs_to_jiffies(const unsigned int u);

timer_list

struct timer_list {/** All fields that change during normal runtime grouped to the* same cacheline*/struct list_head entry;unsigned long expires;struct tvec_base *base;void (*function)(unsigned long);unsigned long data;int slack;#ifdef CONFIG_TIMER_STATSint start_pid;void *start_site;char start_comm[16];
#endif
#ifdef CONFIG_LOCKDEPstruct lockdep_map lockdep_map;
#endif
};

二、驱动源码

#include "nuc972_gpio.h"#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/timer.h>#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>#define TIMER_DEV_NUMS 1
#define TIMER_NAME "timerled"struct timer_dev{dev_t devid;int major;int minor;  struct cdev cdev;struct class *class;struct device *device;struct timer_list timer;
};struct timer_dev timerdev;/* */
#define SET_DIR 0X0100
#define GET_DIR 0X0200
#define SET_ODR 0X0300
#define GET_ODR 0X0400
#define GET_IDR 0X0500#define GPIOA 0x0000
#define GPIOB 0x0001
#define GPIOC 0x0002
#define GPIOD 0x0003
#define GPIOE 0x0004
#define GPIOF 0x0005
#define GPIOG 0x0006
#define GPIOH 0x0007
#define GPIOI 0x0008
#define GPIOJ 0x0009/* PF13-KEY1 PF14-KEY2 */
static int led_gpio_init(void)
{int temp;int ret = 0;set_gpio_direction(GPIOB,0xffff);set_gpio_odr(GPIOB,0xffff);return ret;
}void timer_function(unsigned long arg)
{int temp;temp = get_gpio_odr(GPIOB);if(temp &(int)(1<<4)){set_gpio_odr(GPIOB,~(unsigned short)(1<<4));}else{set_gpio_odr(GPIOB,0xffff); } mod_timer(&timerdev.timer,jiffies + msecs_to_jiffies(2000));
}
static int timerdev_open(struct inode *inode, struct file *filp)
{int ret = 0;init_timer(&timerdev.timer);timerdev.timer.function = timer_function;timerdev.timer.expires = jiffies + msecs_to_jiffies(2000);led_gpio_init();add_timer(&timerdev.timer);return 0;
}static ssize_t timerdev_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
{int temp;int ret = 0;temp = get_gpio_idr(GPIOF);ret = copy_to_user(buf,&temp,sizeof(temp));return 0;
}static int timerdev_release(struct inode *inode, struct file *filp)
{del_timer(&timerdev.timer);return 0;}static struct file_operations timerdev_fops = {.owner = THIS_MODULE,.open = timerdev_open,.read = timerdev_read,.release = timerdev_release,
};static int __init timer_init(void)
{int ret = 0; timerdev.major = 0;if(timerdev.major){timerdev.devid = MKDEV(timerdev.major, 0);ret = register_chrdev_region(timerdev.devid,TIMER_DEV_NUMS,TIMER_NAME);}else{ret = alloc_chrdev_region(&timerdev.devid,0,TIMER_DEV_NUMS,TIMER_NAME);   timerdev.major = MAJOR(timerdev.devid);timerdev.minor = MINOR(timerdev.devid);}if(ret < 0){printk("register chrdev failed!\r\n");goto fail_devid;}printk("timer major = %d, minor = %d \r\n", timerdev.major, timerdev.minor);cdev_init(&timerdev.cdev, &timerdev_fops);timerdev.cdev.owner = THIS_MODULE;ret = cdev_add(&timerdev.cdev, timerdev.devid, TIMER_DEV_NUMS);if(ret < 0){printk("cdev_add failed!\r\n");goto fail_cdevadd;}timerdev.class = class_create(THIS_MODULE, TIMER_NAME);if(IS_ERR(timerdev.class)){printk("class_create failed!\r\n");ret = PTR_ERR(timerdev.class);goto fail_class;}timerdev.device = device_create(timerdev.class, NULL, timerdev.devid, 0, TIMER_NAME);if(IS_ERR(timerdev.device)){printk("device_create failed!\r\n");ret = PTR_ERR(timerdev.device);goto fail_device;}printk("timer init success!\r\n");return 0; fail_device:class_destroy(timerdev.class);
fail_class:cdev_del(&timerdev.cdev);
fail_cdevadd:unregister_chrdev_region(timerdev.devid,TIMER_DEV_NUMS);
fail_devid:return ret;
}static void __exit timer_exit(void)
{del_timer(&timerdev.timer);device_destroy(timerdev.class,timerdev.devid);class_destroy(timerdev.class);cdev_del(&timerdev.cdev);unregister_chrdev_region(timerdev.devid, TIMER_DEV_NUMS);printk("timer_exit!\r\n");
}module_init(timer_init);
module_exit(timer_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("mx");

三、APP源码

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "unistd.h"int main(int argc, char *argv[])
{int keyvalue = 0;int destvalue = 0;int fd;int ret = 0;char *filename;if(argc != 2){printf("Error Usage!\r\n");return -1;}filename = argv[1];fd = open(filename,O_RDWR);if(fd < 0){printf("file %s open failed!\r\n",filename);return -1;}destvalue = 1<<13;while(1){}close(fd);return 0;
}

四、实验总结


【吃灰板子捡起来】内核定时器实验相关推荐

  1. 【吃灰板子捡起来】字符设备驱动开发实验

    字符设备驱动开发实验 一.驱动框架 二.Makefile 三.测试程序 四.过程总结 该实验与正点原子教程一致,先将该实验视频过一遍,然后根据文档进行实验. 一.驱动框架 (1)注册驱动 //incl ...

  2. 【吃灰板子捡起来】按键输入实验

    按键输入实验 一.驱动源码 二.应用源码 三.实验总结 一.驱动源码 硬件原理图 #include "nuc972_gpio.h"#include <linux/module ...

  3. 【吃灰板子捡起来】新字符设备驱动开发实验

    新字符设备驱动开发实验 一.设备号 二.字符设备 三.设备节点 四.驱动源码 五.总结 一.设备号 定义:/fs/char_dev.c #include <linux/fs.h>/*** ...

  4. 【吃灰板子捡起来】LED驱动开发实验

    LED驱动开发实验 一.地址映射 二.内存访问 三.应用源码 四.驱动源码 五.实验总结 一.地址映射 #include <asm/io.h>#define ioremap(cookie, ...

  5. 【吃灰板子捡起来】酷客NUC972开发板

    文章目录 酷客NUC972开发板 把吃灰一年的板子捡起来. -时间:2022.03.30 酷客NUC972开发板 4.3寸电阻屏套餐

  6. 10_linux内核定时器实验

    一.linux时间管理和内核定时器简介 1.内核时间管理简介 1)宏HZ ​ 硬件定时器产生的周期性中断,中断频率就是系统频率(拍率).系统拍率可以设置,单位是HZ,可在编译内核时通过图形化界面设置, ...

  7. Linux 内核定时器实验————复习到这

    目录 Linux 时间管理和内核定时器简介 内核时间管理简介 内核定时器简介 Linux 内核短延时函数 硬件原理图分析 实验程序编写 修改设备树文件 定时器驱动程序编写 编写测试APP 运行测试 编 ...

  8. linux内核定时器实验

    文章目录 一.linux时间管理和内核定时器简介 1.内核时间管理简介 2.内核定时器简介 1.init_timer 函数 2.add_timer 函数 3.del_timer 函数 4.del_ti ...

  9. 【正点原子MP157连载】第十六章 基本定时器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. 前端性能优化 —— 项目瘦身
  2. 发现以前的一些记录 shutdown AP CPU
  3. java thread_Java(多线程Thread)
  4. 《零基础》MySQL 正则表达式(二十一)
  5. Exchange邮箱的创建与配置
  6. Git(8)-- 撤消操作(git commit --amend、git reset 和 git checkout 命令详解)
  7. javaSE (四十二)javaSE阶段性总结
  8. 2021年国内外离线下载服务全面评测与总结
  9. 项目沟通管理和项目干系人管理
  10. 年度最高奖金【双百万】:2021年全国人工智能大赛开赛啦
  11. 解决u盘插入电脑提示扫描并修复
  12. 如何快速、有效地管理海量的、分散的数据?佳农靠它实现数智化
  13. 暴雪与网易宣布停止合作,多家厂商争夺暴雪代理权
  14. 禾瑞亚USB接口电阻触摸屏控制卡QNX 6.5 RTOS操作系统x86架构驱动安装与配置方法
  15. git: Couldn‘t find remote ref
  16. 《卓有成效的管理者》——学习心得(一)
  17. [2020.01加一套题]UMLChina建模竞赛题大全-题目全文+分卷自测(11套110题)
  18. SOD算法:PoolNet
  19. 江南大学人工智能与计算机学院拟录取名单,江南大学人工智能与计算机学院2021考研预调剂信息...
  20. 【智能车新手入门】-赛车行驶策略

热门文章

  1. oracle的常用l函数,oracle常用sql函数和语句
  2. 拍出天价,乔布斯1973年求职申请表曝光
  3. Hillstone(山石)靶机渗透—下
  4. Security Onion Solutions 2.3.10部署指南
  5. 从“互联网+”到“互联网医疗+”,免费互联网医院开创新格局
  6. html5.js百度网盘,HTML5 Canvas+js仿百度网盘扫描文件过程加载动画
  7. Python【摸鱼高效】自动化办公:自动分析数据制作报表+发送邮箱
  8. mysql安装服务 deied_Mysql安装错误:Install/Remove of the Service Denied!解决办法
  9. 给出以下程序,制作makefile文件,编译出可执行文件
  10. 10年软件测试工作总结-有迷茫,有痛苦,有弯路,有捷径。