linux驱动开发要知道的那些知识(三)------container_of,定时器 及系统调用
container_of宏
定义:
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr:the pointer to the member.
* @type:the type of the container struct this is embedded in.
* @member:the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({\
const typeof(((type *)0)->member) * __mptr = (ptr);\
(type *)((char *)__mptr - offsetof(type, member)); })
#endif
第一步:
Const typeof (((type *)0->member) * __mptr=(ptr)
Struct list_head *__mptr=(ptr)
第二步:
(type *)(char *)__mptr -offsetof(type,menber)
0x***-offset
第三步:offsetof(type,member)
((TYPE *)0)->MEMBER
&(TYPE *)0)->MENBER
(TYPE *)0 这是一个强制类型转换,把0地址强制类型转换成一个指针,这个指针指向一个TYPE类型的结构体变量。 (实际上这个结构体变量可能不存在,但是只要我不去解引用这个指针就不会出错)。
((TYPE *)0)->MEMBER (TYPE *)0是一个TYPE类型结构体变量的指针,通过指针指针来访问这个结构体变量的member元素
&((TYPE *)0)->MEMBER 等效于&(((TYPE *)0)->MEMBER),意义就是得到member元素的地址。但是因为整个结构体变量的首地址是0,
内核定时器
时钟中断
HZ:常数决定了时钟发生的频率
Tick:发生时间中断的时间间隔tick=1/HZ
Jiffies:核心变数,
struct timer_list
{
unsigned long expires;超时时间
void (*function)(unsigned long0)处理函数
unsigned long data;内核调用超时处理函数时传递给它的参数
}
静态初始化
TIMER_INITALIZER(_function,_expires,_data)
DEFINE_TIME(_name,_function,_expires,_data);
_name 待定义的内核定时器变量名称
Void init_timer(struct timer_list *timer);
修改定时器
init_timer(time)初始化定时器,传地址
#define BARK_TIMER 5
#deifne BARK_DATA 100
Xxx.expires = jiffies+HZ*BARK_TIMER;//BARK_TIMER=5五秒
Xxx.function=xxxxxx
Xxxx.data=BARK_DATA;
Add_timer(&xxxxx
del_timer()
2系统调用
ANSI C fopen(标准c的库函数)
UNIX C open (系统调用)
用户态的程序一般情况是不能访问内核态的资源,只有通过中断或者系统调用才能从用户态进入内核态
2.6.35有366个内核系统调用为应用程序服务。
系统调用的原理:
应用程序首先使用适当的值填充寄存器,然后调用一个特殊的指令,跳转到内核某个固定的位置,内核根据应用程序所填充的固定值来找到相应的函数执行。
适当的值:arch/arm/asm/unistd.h
调用特殊指令 arm->SWI(软中断)
X86 0x80
固定位置:在arm体系中,应用程序跳转到entry-conmmon ->vector_swi ->会用到sys_call_table(calls.S)
用户空间编程 fd=open(“aa.txt”...)
5->寄存器
SWI
____________________
vector_swi
sys_call_table[5]
sys_open
SYSCALL_DEFINR3 拼接
1)添加新的内核函数
vim arch/arm/kernel/sys_arm.c
Asmlinkage int sys_add(int x,int y)
{
printk(“entry sys_add!\n);
Return x+y;
}
2)更新头文件 arch/arm/include/asm/unistd.h
#define __NR_add (__NR_SYSCALL_BASE+366)
3)更新系统调用表(calls.S)
CALL(sys_add)
最后make下即可
转载于:https://blog.51cto.com/songmao/1876960
linux驱动开发要知道的那些知识(三)------container_of,定时器 及系统调用相关推荐
- linux驱动私有数据,linux驱动开发之字符设备--私有数据和container_of
前言 驱动开发中通常为设备定义一个设备相关的设备结构体,其包含该设备的cdev .私有数据.信号量.irq等这些信息. 驱动开发中通常将文件的私有数据private_data指向设备结构体,在read ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之Pinctrl子系统和GPIO子系统的使用
文章目录 前言 1.Pinctrl子系统 1.1.为什么有Pinctrl子系统 1.2.重要的概念 1.3.代码中怎么引用pinctrl 2.GPIO子系统 2.1.为什么有GPIO子系统 2.2.在 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架
文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树
文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型
文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型
文章目录 前言 1.驱动编写的三种方法 1.1.传统写法 1.2.总线驱动模型 1.3.设备树驱动模型 2.Linux实现分离:Bus/Dev/Drv模型 2.1.Bus/Dev/Drv模型 2.2. ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之驱动设计的思想:面向对象/分层/分离
文章目录 前言 1.分离设计 驱动程序分析---程序分层 通用驱动程序---面向对象 个性化驱动程序---分离 APP 程序分析 前言 韦东山嵌入式Linux驱动开发基础知识学习笔记 文章中大多内容来 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想
文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之第一个驱动
文章目录 前言 1.Hello驱动 1.1.APP打开的文件在内核中如何表示? 1.2.打开字符设备节点时,内核中也有对应的struct file 1.3.如何编写驱动程序? 1.4.驱动程序代码 1 ...
最新文章
- 015 Android之可执行文件dex
- 20162316刘诚昊 《程序设计与数据结构》 第三周学习总结
- 阿里《Java开发手册》中的 1 个bug!
- 物联网模式下的多活数据中心架构认识与实践
- c++ for循环 流程图_python 零基础必知--条件控制与循环语句
- linux下编译安装ACE-6.5.1
- python爬虫什么意思-Python爬虫是什么意思有啥用 python爬虫原理实例介绍
- 【IP 地址 和 端口 _简介】
- 电容电感充电曲线仿真图
- uCOSIII 实时操作系统(一) - 简介
- Proguard打包混淆报错:can't find superclass or interface
- nginx三种负载均衡的方式
- 免费网站建设应该要掌握哪些?
- dreamware html中加入flv,Dreamweaver插入FLV文件技巧
- 安全牛我们今天的网络安全问题源自1648年,其实我觉得其实早在资治通鉴上的中国法家们已经表示同样想法
- Vue 获取当前地理位置信息
- 软件工程师资格认证,你合格吗?
- 遇到不支持的 Oracle 数据类型 USERDEFINED。
- [I.MX6UL] U-Boot移植(六) 网络驱动修改 LAN8720A(对比原子和NXP官方测试板的网络芯片LAN8720A , KSZ8081 (也是飞凌)唯独复位引脚不同595芯片也涉及改动)
- 计算机里的游戏安装包怎么删除,游戏怎么清缓存?电脑中LOL更新留下的缓存垃圾删除的教程...
热门文章
- 一个比 Spring Boot 快 44 倍的 Java 框架
- Java 如何实现二维码?
- SpringBoot第十五篇:Springboot整合RabbitMQ
- SpringBoot第二十二篇: 创建含有多module的springboot工程
- 组合特征(四)linearsvm-tfidf(word)+lr-tfidf(article)
- 计算机视觉中的自注意力
- 魔改Attention大集合
- CNN如何用于NLP任务?一文简述文本分类任务的7个模型
- 推荐一位我的好朋友,8年码农,前鹅厂工程师!
- 曾捡破烂为生,穷到没饭吃,现在身家395亿,给员工发3亿年终奖!