自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

转载 linux设备驱动程序——将驱动程序编译进内核

linux驱动程序——将驱动程序编译进内核模块的加载通常来说,在驱动模块的开发阶段,一般是将模块编译成.ko文件,再使用 sudo insmod module.ko或者 depmod -a modprobe module将模块加载到内核,相对而言,modprobe要比insmod更加智能,它会检查并自动处理模块的依赖,而insmod出现依赖问题时仅仅是告诉...

2019-03-26 15:09:00 717

转载 linux设备驱动程序-设备树(3)-设备树多级子节点的转换

linux设备驱动程序--设备树多级子节点的转换在上一章:设备树处理之——device_node转换成platform_device中,有提到在设备树的device_node到platform_device转换中,必须满足以下条件:一般情况下,只对设备树中根的一级子节点进行转换,也就是多级子节点(子节点的子节点)并不处理。但是存在一种特殊情况,就是当某个根子节点的compatibl...

2019-03-12 20:10:00 523

转载 linux设备驱动程序-i2c(2)-adapter和设备树的解析

linux设备驱动程序-i2c(2)-adapter和设备树的解析(注: 基于beagle bone green开发板,linux4.14内核版本)在本系列linux内核i2c框架的前两篇,分别讲了:linux设备驱动程序-i2c(0)-i2c设备驱动源码实现linux设备驱动程序-i2c(1):i2c总线的添加与实现而在linux设备驱动程序--串行通信驱动框架分析中,讲到l...

2019-03-12 15:25:00 608

转载 python调用C语言接口

python调用C语言接口注:本文所有示例介绍基于linux平台在底层开发中,一般是使用C或者C++,但是有时候为了开发效率或者在写测试脚本的时候,会经常使用到python,所以这就涉及到一个问题,用C/C++写的底层库,怎么样直接被python来调用?python作为一门胶水语言,当然有办法来处理这个问题,python提供的方案就是ctypes库。ctypesctypes...

2019-03-11 18:37:00 3403

转载 linux设备驱动程序--bus

linux 中bus驱动解析总线(bus)是linux发展过程中抽象出来的一种设备模型,为了统一管理所有的设备,内核中每个设备都会被挂载在总线上,这个bus可以是对应硬件的bus(i2c bus、spi bus)、可以是虚拟bus(platform bus)。简述bus的工作流程bus将所有挂在上面的具体设备抽象成两部分,driver和device。driver实现了同类型设备的...

2019-03-10 22:23:00 171

转载 linux设备驱动程序--在用户空间注册文件接口

linux字符设备驱动程序--创建设备节点基于4.14内核,运行在beagleBone green在上一讲中,我们写了第一个linux设备驱动程序——hello_world,在驱动程序中,我们什么也没有做,仅仅是打印了两条日志消息,今天,我们就要丰富这个设备驱动程序,在/dev目录下创建一个设备节点,用户通过读写文件来与内核进行交互。预备知识在linux中,一切皆文件,不管用户是...

2019-03-09 17:53:00 257

转载 linux设备驱动程序--gpio控制

gpio驱动程序上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就涉及到具体的目标板,博主在这里使用的开发板是开源平台beagle bone green,内核版本为4.14.今天我们来讲解gpio的设备驱动程序。gpio相关的库函数为了linux的可...

2019-03-09 16:22:00 1251

转载 linux设备驱动程序--sysfs用户接口的使用

linux sysfs文件系统本文部分内容参考自官方文档自2.6版本开始,linux内核开始使用sysfs文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持修改和调整。与ext系列和fat等文件系统不同的是,sysfs是一个系统在启动时构建在内存中虚拟文件系统,一般被挂载在/sys目录下,既然是存储在内存中,自然掉电不保存,不能存储用户数据。...

2019-03-09 15:53:00 623

转载 linux设备驱动程序--hello-world

linux字符设备驱动程序--hello_world基于4.14内核, beagleBone green平台PC端的设备驱动程序有过电脑使用经验的人都知道,当我们将外部硬件设备比如鼠标键盘插入到电脑端口(通常是USB口)时,在windows系统右下角会弹出"安装设备驱动程序"的显示框,那么,为什么每个硬件都需要安装设备驱动程序才能使用呢?首先,每个硬件都有相应的功能,鼠标的功能就...

2019-03-09 14:59:00 403

转载 linux设备驱动程序-i2c(0)-i2c设备驱动源码实现

(基于4.14内核版本)为了梳理清楚linux内核中的i2c实现框架,从本文开始,博主将分几个章节分别解析i2c总线在linux内核中的形成过程、匹配过程、以及设备驱动程序源码实现。在介绍linux内核中i2c框架之前,我们最好是知道怎么使用它,实现一个相应的i2c设备驱动程序demo,然后从使用去深挖背后的实现原理,先知道怎么用,然后再知道为什么可以这么用。I2C的基本知识扫盲...

2019-03-07 23:11:00 723

转载 linux设备驱动程序-i2c(1):i2c总线的添加与实现

linux设备驱动程序-i2c(1):i2c总线的添加与实现(基于4.14内核版本)在上一章节linux设备驱动程序-i2c(0)-i2c设备驱动源码实现中,我们演示了i2c设备驱动程序的源码实现,从这一章节开始,我们来剖析i2c设备驱动程序框架的实现原理。前情回顾在这之前,建议各位先阅读博主之前的两篇博客以建立基本linux内核串行通信框架的概念:linux设备驱动程序--串...

2019-03-07 22:58:00 270

转载 linux设备驱动程序--串行通信驱动框架分析

linux 串行通信接口驱动框架在学习linux内核驱动时,不论是看linux相关的书籍,又或者是直接看linux的源码,总是能在linux中看到各种各样的框架,linux内核极其庞杂,linux各种框架理解起来并不容易,如果直接硬着头皮死记硬背,意义也不大。博主学习东西一直秉持着追本溯源的态度,要弄清一个东西是怎么样的,如果能够了解它的发展,了解它为什么会变成这样,理解起来就非常简...

2019-03-07 20:09:00 171

转载 linux内核模块编译makefile

linux内核可加载模块的makefile在开发linux内核驱动时,免不了要接触到makefile的编写和修改,尽管网上的makefile模板一大堆,做一些简单的修改就能用到自己的项目上,但是,对于这些基础的东西,更应该做到知其然并知其所以然。本篇文章中只讨论linux内核模块编译的makefile,linux内核makefile总览可以参考另一篇博客:linux内核makefil...

2019-03-06 23:29:00 426

转载 linux内核makefile概览

linux内核makefile概览本博客参照内核官方英文文档linux的内核makefile主要用于编译整个内核源码,按照用户的需求生成各种目标文件,对于用户来说,编译内核时非常简单的,只需要几个指令就可以做到,但是对于一个驱动开发者而言,了解内核源码的编译机制是非常必要的。make 和 makefile需要了解的是:make是linux下的一个程序软件,makefile相当于针...

2019-03-06 23:20:00 247

转载 linux的initcall机制

linux的initcall机制(针对编译进内核的驱动)initcall机制的由来我们都知道,linux对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者通常提供一个xxx_init()函数接口以启动这个驱动程序同时提供某些服务。那么,根据常识来说,这个xxx_init()函数肯定是要在系统启动的某个时候被调用,才能启动这个驱动程序。最简...

2019-03-06 22:40:00 244

转载 linux设备驱动程序-设备树(2)-device_node转换成platform_device

设备树处理之——device_node转换成platform_device以下讨论基于linux4.14,arm平台platform device设备树的产生就是为了替代driver中过多的platform_device部分的静态定义,将硬件资源抽象出来,由系统统一解析,这样就可以避免各驱动中对硬件资源大量的重复定义,这样一来,几乎可以肯定的是,设备树中的节点最终目标是转换成pla...

2019-03-06 22:24:00 356

转载 linux设备驱动程序-设备树(1)-dtb转换成device_node

linux设备驱动程序-设备树(1)-dtb转换成device_node本设备树解析基于arm平台从start_kernel开始linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂且不作过多讨论,在head.s完成部分初始化之后,就开始调用C语言函数,而被调用的第一个C语言函数就是start_kernel,start kernel原型是这样的:asmlinkage ...

2019-03-06 19:58:00 654

转载 linux设备驱动程序-设备树(0)-dtb格式

linux设备树dtb格式设备树的一般操作方式是:开发人员根据开发需求编写dts文件,然后使用dtc将dts编译成dtb文件。dts文件是文本格式的文件,而dtb是二进制文件,在linux启动时被加载到内存中,接下来我们需要来分析设备树dtb文件的格式。为什么要了解设备树dtb文件的格式dtb作为二进制文件被加载到内存中,然后由内核读取并进行解析,如果对dtb文件的格式不了解,那...

2019-03-06 19:47:00 377

转载 linux中container_of

linux 驱动程序中 container_of宏解析众所周知,linux内核的主要开发语言是C,但是现在内核的框架使用了非常多的面向对象的思想,这就面临了一个用C语言来实现面向对象编程的问题,今天我们就来讲讲其中一个例子。利用结构体中元素指针获取结构体指针Kobject是linux设备驱动模型的基础,也是设备模型中抽象的一部分。linux内核为了兼容各种形形色色的设备,就需要对...

2019-03-06 19:33:00 173

转载 RS232、RS485和TTL电平与串行通信

RS232、RS485和TTL作为一个底层软件开发工程师,经常会碰到RS232、RS485和TTL这一类的问题。之前总是碰到问题之后Google一下,把当下的问题解决了之后就不管了,过个一两天就忘得一干二净,结果后续每次都会碰到类似的问题,都是从零开始地去解决,这种方式看起来当时快速解决了问题,结果在后续的开发中浪费了更多的时间。为了解决这个问题,博主决定一次性把这些东西给弄清楚...

2019-03-06 15:25:00 784

转载 python函数调用时参数传递方式

python函数调用时参数传递方式C/C++参数传递方式对于C程序员来说,我们都知道C在函数调用时,采用的是值传递,即形参和实参分配不同的内存地址,在调用时将实参的值传给实参,在这种情况下,在函数内修改形参并不会影响到实参,但是这样带来一个问题,如果我们需要刻意地对实参进行修改,就不得不传递实参的指针到函数,然后在函数中修改指针指向的数据,以达到修改实参的目的。后来,C++中引入了...

2019-03-06 14:54:00 1268

转载 python变量的内存机制

python变量的内存机制作为一门简单易用的语言,且配备海量的库,python可谓是程序员手中的掌中宝,编程本身就是一种将人类思维转化为计算机思维的技术,如果不需要去追求极致的运行效率同时又不限制于计算机内存空间,python无疑是目前最方便的语言了。作为一个合格的程序员,自然是要知其然并知其所以然,除了能够应用python来放飞自我之外,同时也要探究python其内部的运行原理,首...

2019-03-06 14:19:00 172

转载 不同语言的负数取余问题

不同语言的负数取余问题问题的出现偶然在leetcode上看到一道这样的题:Given a 32-bit signed integer, reverse digits of an integer. 翻译成中文就是:给定一个32位有符号整数,将整数由低位到高位反向输出,例:输入:1230返回:321题目很简单,有很多种实现方式,大概十分钟左右就在脑海中想到了一个自认为最好的...

2019-03-06 13:45:00 172

转载 浅谈操作系统与内存

浅谈操作系统与内存对于计算机的发明,相信大家都有耳闻那个占地面积按平米算的第一台计算机。在那个时候,CPU的资源是极其珍贵的,随着这些年突飞猛进的发展,一片指甲盖大小的民用级CPU一秒钟能执行的指令数可以达到上亿级别。随着计算能力的增长,芯片外围的硬件和配套的软件也是一路高歌,发生了天翻地覆的变化,今天我们简单回顾历史,来看一看操作系统和内存机制的演变,不仅要了解它们是怎样,同时也看...

2019-03-06 12:14:00 569

转载 浅谈原子操作、volatile、CPU执行顺序

浅谈原子操作、volatile、CPU执行顺序在计算机发展的鸿蒙年代,程序都是顺序执行,编译器也只是简单地翻译指令,随着硬件和软件的飞速增长,原来的工具和硬件渐渐地力不从心,也逐渐涌现出各路大神在原来的基础上进行优化,有些优化是完全地升级,而有些优化则是建立在牺牲其他性能之上,当然这种优化在大多数情况下是正向的,只是在某些时候会体现出负面的效果,今天我们就来谈谈那些由于软硬件的优化产生...

2019-03-05 23:12:00 335

转载 程序的静态链接

程序的静态链接程序的产生程序是由程序员编写,经过编译链接过程,最终能够在计算机中运行的东西。本质上来说编译链接过程其实就是将由人能看懂的代码段翻译成机器能看懂的代码段,然后指导机器的运行,比起程序在机器中被运行,博主更喜欢程序指导机器运行这样的说法。编译链接事实上分为4个过程:预编译、编译、汇编、链接,在这里我们笼统地将其分为两个过程:编译和链接,编译包含预编译、编译、汇编。编译...

2019-03-05 22:30:00 226

转载 linux下nm命令的使用

linux下强大的文件分析工具 -- nm什么是nmnm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。目标文件、库文件、可执行文件首先,提到这三种文件,我们不得不提的就是gcc的编译流程:预编译,编译,汇编,链接。目标文件 :常说的目标文件是我们的程序文件(.c/.cpp,.h)经过预编译,编译...

2019-03-05 16:44:00 339

转载 SCP免密传输和SSH登录流程详解

SCP免密传输和SSH登录协议详解在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu、树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的samba服务、SCP传输、ftp文件传输等等,今天我们就来聊聊出场频率最高的SCP传输。SCP的使用在linux环境中,当我们需要在两台机器之间传输数据时,经常会用到SCP指令,(SCP...

2019-03-05 16:29:00 1094

转载 linux开机自启动

linux下添加简单的开机自启动脚本在linux的使用过程中,我们经常会碰到需要将某个自定义的应用程序设置为开机自启动以节省操作时间,这里提供两个设置开机自启动的方法。注:博主使用的ubuntu-16.04进行实验,其它版本可能有偏差,但实现原理类似。rc.local在rc.local脚本中添加开机自启动程序ubuntu在开机过程之后,会执行/etc/rc.local(注意/e...

2019-03-04 22:56:00 491

转载 linux中apt-get使用

apt-get简介在Ubuntu系统中,经常要用到apt-get install指令来安装软件,由于常常需要root权限来操作,所以搭配sudo食用口感更佳,apt-get指令对于安装、卸载、升级软件提供一条龙服务,对比于源码安装,实在是业界良心。源码安装源码安装的流程一般是三部曲:./configuremakemake install ./configure是为了检测...

2019-03-04 22:49:00 147

转载 GCC编译流程浅析

GCC-GCC编译流程浅析序言对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套服务,开发者只需要关系代码逻辑与功能实现即可,但是,在享受便利的同时,必然也牺牲了一些灵活性。gcc是什么国际惯例,先得介绍gcc是什么,gcc的原名为GNU C Compiler,...

2019-03-04 17:52:00 116

转载 C++ STL hash表用法

C++ STL unordered_map用法在C++11中,unordered_map作为一种关联容器,替代了hash_map,unordered_map的底层实现是hash表,所以被称为无序关联容器。不管是map还是unordered_map都是一种 key-map(value) 映射的容器,提供非常高的查找效率,下面我们来了解unordered_map的用法。预备知识在讲解...

2019-03-04 17:17:00 738

转载 hash表的理解

哈希表先从数组说起任何一个程序员,基本上对数组都不会陌生,这个最常用的数据结构,说到它的优点,最明显的就是两点:简单易用,数组的简易操作甚至让大多数程序员依赖上了它,在资源富足的情况下,我们甚至会无意识地忽略其它更适用的数据结构而使用数组(别说你没这么干过..)。查找的快速性,数组中查找元素可以直接通过下标进行定位,速度快。我在刚开始写程序的时候,也会经常用到数组,而且往...

2019-03-04 17:06:00 216

转载 栈帧结构与函数调用约定

栈帧结构与函数调用约定栈,是一种先入后出的数据结构,就像我们堆放书籍一样,先放的在最底下,后放置的在顶上,当我们要取的时候就是拿最上面一本,即最后放置的那一本。即FILO(first in last out)。对大多数的应用程序员来说,栈就是这么一个数据结构的概念,而对于嵌入式工程师来说,栈还代表着另一种举足轻重的角色,今天我们就来聊一聊内存中的栈结构。什么是栈?在早期的计算机系...

2019-03-04 16:20:00 340

转载 C/C++函数调用时传参过程与可变参数实现原理

C/C++函数调用时传参过程与可变参数实现原理C语言的经典swap问题在学习C语言的时候,我们大都遇到过一些经典例题,这些经典例题背后所代表的是往往是C/C++背后的一些运行原理,比如下面这个示例:请问下面这个swap()函数能否用来进行值交换?void swap(int x,int y){ int temp=x; x=y; y=temp;}稍微有些...

2019-03-04 15:59:00 787

转载 C++中string的实现原理

C++中string的实现原理背景当我刚开始学习C++,对C还是有一部分的了解,所以以C的思维去学C++,导致我很长一段时间的学习都处于一个懵逼的状态,C++的各种特性,标准库,模板还有版本的迭代,简直是欲仙欲死。后来在论坛中就有热心的朋友们出招了:你得放弃C的思维去学C++!!嗯,说得好有道理,这就去试试!!但是我又发现一个问题,不用C的思维学C++,难道我以撸铁(博主业余喜欢...

2019-03-04 15:22:00 904

转载 C++ 构造函数的理解

C++构造函数的理解相对于C语言来说,C++有一个比较好的特性就是构造函数,即类通过一个或者几个特殊的成员函数来控制其对象的初始化过程。构造函数的任务,就是初始化对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。构造函数的语法构造函数的名字必须和类名相同,与其他函数不一样的是,构造函数没有返回值,而且其必须是公有成员,因为私有成员不允许外部访问,且函数不能声明为cons...

2019-03-04 15:07:00 229

转载 C语言强、弱符号,强、弱引用

C语言强、弱符号,强、弱引用符号定义在编程中我们经常碰到符号重复定义的情况,当我们在同一个作用域内重复定义同一个变量时,有时是因为误写,有时是文件之间的冲突,编译器的处理方式就是报错:redefinition of 'xxx'注意,这里针对于同一作用域才会有冲突,如果是不同作用域,比如全局和局部,即使是相同变量名,也是不会报错,编译器会默认根据一定的优先级处理,总是更小作用域的变...

2019-03-04 14:51:00 696

转载 不同平台下int类型、指针类型的数据大小

不同平台下int类型、指针类型的数据大小对于int类型数据和指针类型数据的大小,是非常基础的问题。在一个具体的平台上,确定他们最好的办法就是使用sizeof(type)对其进行判断,返回当前数据类型的大小。在不同的平台下,int类型和指针类型的数据类型大小时怎样的呢?如果要给出一个统一的答案,自然不可能集齐每个平台,一个个地去试,我们必须从底层进行分析。数据总线和地址总线计算机...

2019-03-04 12:27:00 653

转载 C语言中指针和数组

C语言数组与指针的那些事儿在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵。但是程序员一般都有一种迷之自信,总认为自己是天选之人,明知山有虎,偏向虎山行,直到最后用C的人都要被指针虐一遍。指针首先,明确一个概念,指针是什么,一旦提到这个老生常谈且富有争议性的话题,那真是1000个人有10...

2019-03-04 12:00:00 317

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除