Linux内核定时器-模块导出符号表

news2025/1/20 10:58:34

Linux内核定时器

  • 定时器的当前时间如何获取?

jiffies:内核时钟节拍数

jiffies是在板子上电这一刻开始计数,只要

板子不断电,这个值一直在增加(64位)。在

驱动代码中直接使用即可。

  • 定时器加1代表走了多长时间?

在内核顶层目录下有.config

CONFIG_HZ=1000

周期 = 1/CONFIG_HZ

周期是1ms;

  • 分配的对象

struct timer_list mytimer;

  • 对象的初始化

定时器结构体

struct timer_list 
{
			unsigned long expires;   //定时的时间
			void (*function)(unsigned long); //定时器的处理函数
			unsigned long data;      //向定时器处理函数中填写的值
};

定时器初始化

void timer_function(unsigned long data) //定时器的处理函数
{
			
}
init_timer(&mytimer);  //内核帮你填充你未填充的对象	
mytimer.expries = jiffies + 1000;  //1s
mytimer.function = timer_function;
mytimer.data = 0;

对象的添加定时器

void add_timer(struct timer_list *timer);
		//同一个定时器只能被添加一次,
		//在你添加定时器的时候定时器就启动了,只会执行一次

		int mod_timer(struct timer_list *timer, unsigned long expires)
		//再次启动定时器                          jiffies+1000
对象的删除

int del_timer(struct timer_list *timer)
//删除定时器

 Int gpio_get_value(int gpiono);//通过gpiono获取当权gpio的所处状态

  返回0,低电平   非0:高电平

#include<linux/init.h>
#include<linux/module.h>
#include<linux/printk.h>
#include<linux/timer.h>
#include<linux/gpio.h>
#include<linux/interrupt.h>

#define GPIONO(m,n) (m*32+n)
#define GPIO_B8 GPIONO(1,8)
#define GPIO_B16 GPIONO(1,16)

int gpiono[]={GPIO_B8,GPIO_B16};
char *name[]={"interrupt_b8","interrupt_b16"};

int i;

struct timer_list mytimer;

//中断处理函数
irqreturn_t irq_handler(int irq,void *arg)
{
    //启动定时器
    mod_timer(&mytimer,jiffies+100);
    return IRQ_HANDLED;
}
//定时处理函数
void timer_handler(unsigned long data)
{
    //检测引脚状态,如果是低电平,说明产生了中断
    if(gpio_get_value(GPIO_B8)==0)
    {
        printk(KERN_ALERT"+++++++++++++++++++++++++++++++++++\n");//设置为大于终端打印权限,不然只能在demsg中查看
    }
    if(gpio_get_value(GPIO_B16)==0)
    {
        printk(KERN_ALERT"-----------------------------------\n");//设置为大于终端打印权限,不然只能在demsg中查看
    }
}
static int __init timer_init(void)
{
    //初始化定时器
    init_timer(&mytimer);//内核自动初始化定时器
    mytimer.expires= jiffies+100;//定时时长
    mytimer.function=timer_handler;
    mytimer.data=0;
    //添加定时器
    add_timer(&mytimer);
    //注册中断
    for(i=0;i<sizeof(gpiono)/sizeof(int);i++)
    {
        if(request_irq(gpio_to_irq(gpiono[i]),irq_handler,IRQF_TRIGGER_FALLING,name[i],NULL)!=0)
        {
            printk("%s request_ire err.\n",name[i]);
            return -EBUSY;
        }
    }
    return 0;
}
static void __exit timer_exit(void)
{
    //注销中断
    for(i=0;i<sizeof(gpiono)/sizeof(int);i++)
    {
        free_irq(gpio_to_irq(gpiono[i]),NULL);
    }
}
module_init(timer_init);
module_exit(timer_exit);
MODULE_LICENSE("GPL");

模块导出符号表

思考1应用层两个app程序,app1中拥有一个add函数,app1运行时app2是否可以调用app1中的add函数? 不行,因为应用层app运行的空间是私有的(0-3G)没有共享。

思考2两个驱动模块,module1中的函数,module2是否可以调用?可以,他们公用(3-4G)内核空间,只是需要找到函数的地址就可以。好处:减少代码冗余性,代码不会再内存上被重复加载。代码更精简,一些代码可以不用写,直接调用别人写好的函数就可以。

编写驱动代码找到其他驱动中的函数,需要用模块导出符号表将函数导出,被人才可以使用这个函数。他是一个宏函数

在驱动的一个模块中,想使用另外一个模块中的函数/变量,只需要使用EXPORT_SYMBOL_GPL将变量或者函数的地址给导出。使用者就可以用这个地址来调用它了。

EXPORT_SYMBOL_GPL(sym)

sym:变量名或函数名

代码举例1:两个独立的代码驱动模块

代码举例2:提供者为内核已经安装使用的驱动

总结

编译:

1.先编译提供者,编译完成之后会产生一个Module.symvers

2.将Module.symvers拷贝到调用者的目录下

3.编译调用者即可

安装:

先安装提供者

再安装调用者

卸载:

先卸载调用者

再卸载提供者

如果调用者和提供者时两个独立(xx.ko)驱动模块,他们间传递地址的时候,是通过Module.symvers传递的。

如果提供者是内核的模块(uImage),此时调用者和提供者间就不需要Module.symvers文件传递信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaEE -19(9000 字 JavaScript入门 - 4)

一&#xff1a; jQuery jQuery是一个快速、小巧且功能丰富的JavaScript库。它旨在简化HTML文档遍历、事件处理、动画效果以及与后端服务器的交互等操作。通过使用jQuery&#xff0c;开发者可以以更简洁、更高效的方式来编写JavaScript代码。 jQuery提供了许多易于使用的方法和…

腾讯云轻量应用服务器优缺点介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、4核8G12M带宽646元15个月等&#xf…

【 C语言 】 | C程序百例

【 C语言 】 | C程序百例 时间&#xff1a;2023年12月28日13:50:43 文章目录 【 C语言 】 | C程序百例1.参考2.练习 1.参考 1.【 C语言 】 | C程序百例-CSDN博客 2.100Example: C程序百例-酷勤网&#xff08;kuqin.com&#xff09;提供.pdf (gitee.com) 3.cProgram/LinuxC - 码…

[JS设计模式] Module Pattern

随着应用程序和代码库的增长&#xff0c;保持代码的可维护性和模块化变得越来越重要。模块模式允许将代码分成更小的、可重用的部分。 除了能够将代码分割成更小的可重用部分之外&#xff0c;模块还允许将文件中的某些值保留为私有。默认情况下&#xff0c;模块内的声明范围(封…

Qt编写的exe程序上添加程序信息

1、qtcreator编写 在pro文件中添加如下信息 # 版本信息 VERSION 4.0.2.666# 图标 RC_ICONS Images/MyApp.ico# 公司名称 QMAKE_TARGET_COMPANY "Digia"# 产品名称 QMAKE_TARGET_PRODUCT "Qt Creator"# 文件说明 QMAKE_TARGET_DESCRIPTION "Qt …

Android : 画布的使用 简单应用

示例图&#xff1a; MyView.java&#xff1a; package com.example.demo;import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Vi…

node-red:modbus协议数据格式转换

node-red&#xff1a;MODBUS协议数据格式转换 一、32word无符号转换1.1 写操作1.2 读操作 二、字符串转换2.1 字符串写操作2.2 字符串读操作 三、有符号整数转换3.1 有符号16word转换3.1.1 负数 读 操作3.1.2 负数 写 操作 3.2 有符号32word转换 源码 本文将描述通过node-red采…

2024年【北京市安全员-B证】证考试及北京市安全员-B证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【北京市安全员-B证】证考试及北京市安全员-B证模拟考试题库&#xff0c;包含北京市安全员-B证证考试答案和解析及北京市安全员-B证模拟考试题库练习。安全生产模拟考试一点通结合国家北京市安全员-B证考试最新…

本地部署 text-generation-webui

本地部署 text-generation-webui 0. 背景1. text-generation-webui 介绍2. 克隆代码3. 创建虚拟环境4. 安装 pytorch5. 安装 CUDA 运行时库6. 安装依赖库7. 启动 Web UI8. 访问 Web UI9. OpenAI 兼容 API 0. 背景 一直喜欢用 FastChat 本地部署大语言模型&#xff0c;今天试一…

GitOps实践指南:GitOps能为我们带来什么?

Git&#xff0c;作为开发过程中的核心工具&#xff0c;提供了强大的版本控制功能。即便在写代码的时候稍微手抖一下&#xff0c;我们也能通过 Git 的差异对比&#xff08;diff&#xff09;轻松追踪到庞大工程中的问题&#xff0c;确保代码的准确与可靠。这种无与伦比的自省能力…

python如何通过日志分析加入黑名单

python通过日志分析加入黑名单 监控nginx日志&#xff0c;若有人攻击&#xff0c;则加入黑名单&#xff0c;操作步骤如下&#xff1a; 1.读取日志文件 2.分隔文件&#xff0c;取出ip 3.将取出的ip放入list&#xff0c;然后判读ip的次数 4.若超过设定的次数&#xff0c;则加…

面向对象(高级)知识点强势总结!!!

文章目录 一、知识点复习1-关键字&#xff1a;static1、知识点2、重点 2-单例模式&#xff08;或单子模式&#xff09;1、知识点2、重点 3-理解main()方法1、知识点2、重点 4-类的成员之四&#xff1a;代码块1、知识点2、重点 5-关键字&#xff1a;final1、知识点2、重点 6-关键…

Python 网络编程之搭建简易服务器和客户端

用Python搭建简易的CS架构并通信 文章目录 用Python搭建简易的CS架构并通信前言一、基本结构二、代码编写1.服务器端2.客户端 三、效果展示总结 前言 本文主要是用Python写一个CS架构的东西&#xff0c;包括服务器和客户端。程序运行后在客户端输入消息&#xff0c;服务器端会…

ArcGIS Pro中Conda环境的Scripts文件解读

Scripts中包含的文件如下 1. propy.bat 用于在 ArcGIS Pro 外部运行 Python 脚本&#xff08;扩展名为 .py 的文件&#xff09;。使用的conda环境是与ArcGIS pro环境同步。propy.bat原理是代替各自python环境下的python.exe&#xff0c;主要区别是propy.bat使用的是与Pro同的…

YOLOv8算法优化:解决YOLOv8无法打印计算量(GFLOPs)的问题点

💡💡💡本文内容:解决YOLOv8无法打印计算量的问题点 💡💡💡本文提供:1)训练阶段自动打印计算量;2)提供离线打印计算量的代码; 1.计算量介绍 FLOPS:注意S是大写,是 “每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用…

JavaScript 工具库 | PrefixFree给CSS自动添加浏览器前缀

新版的CSS拥有多个新属性&#xff0c;而标准有没有统一&#xff0c;有的浏览器厂商为了吸引更多的开发者和用户&#xff0c;已经加入了最新的CSS属性支持&#xff0c;这其中包含了很多炫酷的功能&#xff0c;但是我们在使用的时候&#xff0c;不得不在属性前面添加这些浏览器的…

nodejs业务分层如何写后端接口

这里展示的是在node express 项目中的操作 &#xff0c;数据库使用的是MongoDB&#xff0c;前期关于express和MongoDB的文章可访问&#xff1a; Nodejs后端express框架 server后端接口操作&#xff1a;通过路由匹配——>调用对应的 Controller——>进行 Service调用——&…

基于YOLOv8深度学习的45种交通标志智能检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

TCP的三次握手

TCP 是一种面向连接的单播协议&#xff0c;在发送数据前&#xff0c;通信双方必须在彼此间建立一条连接。所谓的“连接”&#xff0c;其实是客户端和服务器的内存里保存的一份关于对方的信息&#xff0c;如 IP 地址、端口号等。 TCP 可以看成是一种字节流&#xff0c;它…

强化学习与推荐系统结合

强化学习与推荐系统结合&#xff0c;是在智能体的学习过程中&#xff0c;会根据外部反馈信息&#xff0c;改变自身状态&#xff0c;在根据自身状态进行决策&#xff0c;就是行动反馈&#xff0c;状态更新&#xff0c;在行动的循环。 深度强化学习推荐系统框架是基于强化学习的…