03 2019 档案

摘要:linux驱动程序——将驱动程序编译进内核 模块的加载 通常来说,在驱动模块的开发阶段,一般是将模块编译成.ko文件,再使用 sudo insmod module.ko 或者 depmod a modprobe module 将模块加载到内核,相对而言,modprobe要比insmod更加智能,它会 阅读全文
posted @ 2019-03-26 15:09 牧野星辰 阅读(22839) 评论(0) 推荐(5) 编辑
摘要:linux设备驱动程序 设备树多级子节点的转换 在上一章: "设备树处理之——device_node转换成platform_device" 中,有提到在设备树的device_node到platform_device转换中,必须满足以下条件: 一般情况下,只对设备树中根的一级子节点进行转换,也就是多级 阅读全文
posted @ 2019-03-12 20:10 牧野星辰 阅读(4495) 评论(1) 推荐(1) 编辑
摘要:linux设备驱动程序 i2c(2) adapter和设备树的解析 (注: 基于beagle bone green开发板,linux4.14内核版本) 在本系列linux内核i2c框架的前两篇,分别讲了: "linux设备驱动程序 i2c(0) i2c设备驱动源码实现" "linux设备驱动程序 i 阅读全文
posted @ 2019-03-12 15:25 牧野星辰 阅读(7926) 评论(1) 推荐(0) 编辑
摘要:python调用C语言接口 注:本文所有示例介绍基于linux平台 在底层开发中,一般是使用C或者C++,但是有时候为了开发效率或者在写测试脚本的时候,会经常使用到python,所以这就涉及到一个问题,用C/C++写的底层库,怎么样直接被python来调用? python作为一门胶水语言,当然有办法 阅读全文
posted @ 2019-03-11 18:37 牧野星辰 阅读(7955) 评论(1) 推荐(3) 编辑
摘要:linux 中bus驱动解析 总线(bus)是linux发展过程中抽象出来的一种设备模型,为了统一管理所有的设备,内核中每个设备都会被挂载在总线上,这个bus可以是对应硬件的bus(i2c bus、spi bus)、可以是虚拟bus(platform bus)。 简述bus的工作流程 bus将所有挂 阅读全文
posted @ 2019-03-10 22:23 牧野星辰 阅读(6140) 评论(0) 推荐(1) 编辑
摘要:linux字符设备驱动程序 创建设备节点 基于4.14内核,运行在beagleBone green 在上一讲中,我们写了第一个linux设备驱动程序—— "hello_world" ,在驱动程序中,我们什么也没有做,仅仅是打印了两条日志消息,今天,我们就要丰富这个设备驱动程序,在/dev目录下创建一 阅读全文
posted @ 2019-03-09 17:53 牧野星辰 阅读(5533) 评论(0) 推荐(1) 编辑
摘要:gpio驱动程序 上一章节 "linux设备驱动程序 创建设备节点" 章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就涉及到具体的目标板,博主在这里使用的开发板是开源平台beagle bone green,内核版 阅读全文
posted @ 2019-03-09 16:22 牧野星辰 阅读(20380) 评论(1) 推荐(1) 编辑
摘要:linux sysfs文件系统 本文部分内容参考自 "官方文档" 自2.6版本开始,linux内核开始使用sysfs文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持修改和调整。 与ext系列和fat等文件系统不同的是,sysfs是一个系统在启动时构建在内存中 阅读全文
posted @ 2019-03-09 15:53 牧野星辰 阅读(12435) 评论(1) 推荐(3) 编辑
摘要:linux字符设备驱动程序 hello_world 基于4.14内核, beagleBone green平台 PC端的设备驱动程序 有过电脑使用经验的人都知道,当我们将外部硬件设备比如鼠标键盘插入到电脑端口(通常是USB口)时,在windows系统右下角会弹出"安装设备驱动程序"的显示框,那么,为什 阅读全文
posted @ 2019-03-09 14:59 牧野星辰 阅读(15838) 评论(0) 推荐(0) 编辑
摘要:(基于4.14内核版本) 为了梳理清楚linux内核中的i2c实现框架,从本文开始,博主将分几个章节分别解析i2c总线在linux内核中的形成过程、匹配过程、以及设备驱动程序源码实现。 在介绍linux内核中i2c框架之前,我们最好是知道怎么使用它,实现一个相应的i2c设备驱动程序demo,然后从使 阅读全文
posted @ 2019-03-07 23:11 牧野星辰 阅读(11038) 评论(1) 推荐(1) 编辑
摘要:linux设备驱动程序 i2c(1):i2c总线的添加与实现 (基于4.14内核版本) 在上一章节 "linux设备驱动程序 i2c(0) i2c设备驱动源码实现" 中,我们演示了i2c设备驱动程序的源码实现,从这一章节开始,我们来剖析i2c设备驱动程序框架的实现原理。 前情回顾 在这之前,建议各位 阅读全文
posted @ 2019-03-07 22:58 牧野星辰 阅读(8471) 评论(0) 推荐(3) 编辑
摘要:linux 串行通信接口驱动框架 在学习linux内核驱动时,不论是看linux相关的书籍,又或者是直接看linux的源码,总是能在linux中看到各种各样的框架,linux内核极其庞杂,linux各种框架理解起来并不容易,如果直接硬着头皮死记硬背,意义也不大。 博主学习东西一直秉持着追本溯源的态度 阅读全文
posted @ 2019-03-07 20:09 牧野星辰 阅读(2868) 评论(0) 推荐(2) 编辑
摘要:linux内核可加载模块的makefile 在开发linux内核驱动时,免不了要接触到makefile的编写和修改,尽管网上的makefile模板一大堆,做一些简单的修改就能用到自己的项目上,但是,对于这些基础的东西,更应该做到知其然并知其所以然。 本篇文章中只讨论linux内核模块编译的makef 阅读全文
posted @ 2019-03-06 23:29 牧野星辰 阅读(34958) 评论(2) 推荐(5) 编辑
摘要:linux内核makefile概览 本博客参照内核 "官方英文文档" linux的内核makefile主要用于编译整个内核源码,按照用户的需求生成各种目标文件,对于用户来说,编译内核时非常简单的,只需要几个指令就可以做到,但是对于一个驱动开发者而言,了解内核源码的编译机制是非常必要的。 make 和 阅读全文
posted @ 2019-03-06 23:20 牧野星辰 阅读(16374) 评论(0) 推荐(5) 编辑
摘要:linux的initcall机制(针对编译进内核的驱动) initcall机制的由来 我们都知道,linux对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者通常提供一个xxx_init()函数接口以启动这个驱动程序同时提供某些服务。 那么,根据常识来说,这 阅读全文
posted @ 2019-03-06 22:40 牧野星辰 阅读(15640) 评论(5) 推荐(13) 编辑
摘要:设备树处理之——device_node转换成platform_device 以下讨论基于linux4.14,arm平台 platform device 设备树的产生就是为了替代driver中过多的platform_device部分的静态定义,将硬件资源抽象出来,由系统统一解析,这样就可以避免各驱动中 阅读全文
posted @ 2019-03-06 22:24 牧野星辰 阅读(11341) 评论(2) 推荐(1) 编辑
摘要:linux设备驱动程序 设备树(1) dtb转换成device_node 本设备树解析基于arm平台 从start_kernel开始 linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂且不作过多讨论,在head.s完成部分初始化之后,就开始调用C语言函数,而被调用的第一个C语言函数就 阅读全文
posted @ 2019-03-06 19:58 牧野星辰 阅读(9318) 评论(0) 推荐(5) 编辑
摘要:linux设备树dtb格式 设备树的一般操作方式是:开发人员根据开发需求编写dts文件,然后使用dtc将dts编译成dtb文件。 dts文件是文本格式的文件,而dtb是二进制文件,在linux启动时被加载到内存中,接下来我们需要来分析设备树dtb文件的格式。 为什么要了解设备树dtb文件的格式 dt 阅读全文
posted @ 2019-03-06 19:47 牧野星辰 阅读(3700) 评论(1) 推荐(0) 编辑
摘要:linux 驱动程序中 container_of宏解析 众所周知,linux内核的主要开发语言是C,但是现在内核的框架使用了非常多的面向对象的思想,这就面临了一个用C语言来实现面向对象编程的问题,今天我们就来讲讲其中一个例子。 利用结构体中元素指针获取结构体指针 Kobject是linux设备驱动模 阅读全文
posted @ 2019-03-06 19:33 牧野星辰 阅读(2955) 评论(1) 推荐(1) 编辑
摘要:RS232、RS485和TTL 作为一个底层软件开发工程师,经常会碰到RS232、RS485和TTL这一类的问题。 之前总是碰到问题之后Google一下,把当下的问题解决了之后就不管了,过个一两天就忘得一干二净,结果后续每次都会碰到类似的问题,都是从零开始地去解决,这种方式看起来当时快速解决了问题, 阅读全文
posted @ 2019-03-06 15:25 牧野星辰 阅读(16403) 评论(0) 推荐(3) 编辑
摘要:python函数调用时参数传递方式 C/C++参数传递方式 对于C程序员来说,我们都知道C在函数调用时,采用的是值传递,即形参和实参分配不同的内存地址,在调用时将实参的值传给实参,在这种情况下,在函数内修改形参并不会影响到实参,但是这样带来一个问题,如果我们需要刻意地对实参进行修改,就不得不传递实参 阅读全文
posted @ 2019-03-06 14:54 牧野星辰 阅读(44146) 评论(2) 推荐(6) 编辑
摘要:python变量的内存机制 作为一门简单易用的语言,且配备海量的库,python可谓是程序员手中的掌中宝,编程本身就是一种将人类思维转化为计算机思维的技术,如果不需要去追求极致的运行效率同时又不限制于计算机内存空间,python无疑是目前最方便的语言了。 作为一个合格的程序员,自然是要知其然并知其所 阅读全文
posted @ 2019-03-06 14:19 牧野星辰 阅读(6937) 评论(0) 推荐(4) 编辑
摘要:不同语言的负数取余问题 问题的出现 偶然在leetcode上看到一道这样的题: Given a 32 bit signed integer, reverse digits of an integer. 翻译成中文就是: 给定一个32位有符号整数,将整数由低位到高位反向输出,例: 输入:1230 返回 阅读全文
posted @ 2019-03-06 13:45 牧野星辰 阅读(1718) 评论(0) 推荐(0) 编辑
摘要:浅谈操作系统与内存 对于计算机的发明,相信大家都有耳闻那个占地面积按平米算的第一台计算机。在那个时候,CPU的资源是极其珍贵的,随着这些年突飞猛进的发展,一片指甲盖大小的民用级CPU一秒钟能执行的指令数可以达到上亿级别。 随着计算能力的增长,芯片外围的硬件和配套的软件也是一路高歌,发生了天翻地覆的变 阅读全文
posted @ 2019-03-06 12:14 牧野星辰 阅读(2964) 评论(2) 推荐(3) 编辑
摘要:浅谈原子操作、volatile、CPU执行顺序 在计算机发展的鸿蒙年代,程序都是顺序执行,编译器也只是简单地翻译指令,随着硬件和软件的飞速增长,原来的工具和硬件渐渐地力不从心,也逐渐涌现出各路大神在原来的基础上进行优化,有些优化是完全地升级,而有些优化则是建立在牺牲其他性能之上,当然这种优化在大多数 阅读全文
posted @ 2019-03-05 23:12 牧野星辰 阅读(2616) 评论(3) 推荐(0) 编辑
摘要:程序的静态链接 程序的产生 程序是由程序员编写,经过编译链接过程,最终能够在计算机中运行的东西。本质上来说编译链接过程其实就是将由人能看懂的代码段翻译成机器能看懂的代码段,然后指导机器的运行,比起程序在机器中被运行,博主更喜欢程序指导机器运行这样的说法。 编译链接事实上分为4个过程:预编译、编译、汇 阅读全文
posted @ 2019-03-05 22:30 牧野星辰 阅读(1502) 评论(0) 推荐(0) 编辑
摘要:linux下强大的文件分析工具 nm 什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件、库文件、可执行文件中的符号表,返回二进制文件中各段的信息。 目标文件、库文件、可执行文件 首先,提到这三种文件,我们不得不提的就是gcc的编译流程:预编译,编译,汇编,链接。 阅读全文
posted @ 2019-03-05 16:44 牧野星辰 阅读(17975) 评论(1) 推荐(5) 编辑
摘要:SCP免密传输和SSH登录协议详解 在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu、树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的samba服务、SCP传输、ftp文件传输等等,今天我们就来聊聊出场频率最高的SCP传输。 SCP的使 阅读全文
posted @ 2019-03-05 16:29 牧野星辰 阅读(9536) 评论(1) 推荐(2) 编辑
摘要:linux下添加简单的开机自启动脚本 在linux的使用过程中,我们经常会碰到需要将某个自定义的应用程序设置为开机自启动以节省操作时间,这里提供两个设置开机自启动的方法。 注:博主使用的ubuntu 16.04进行实验,其它版本可能有偏差,但实现原理类似。 rc.local 在rc.local脚本中 阅读全文
posted @ 2019-03-04 22:56 牧野星辰 阅读(89878) 评论(0) 推荐(6) 编辑
摘要:apt get简介 在Ubuntu系统中,经常要用到apt get install指令来安装软件,由于常常需要root权限来操作,所以搭配sudo食用口感更佳,apt get指令对于安装、卸载、升级软件提供一条龙服务,对比于源码安装,实在是业界良心。 源码安装 源码安装的流程一般是三部曲: ./co 阅读全文
posted @ 2019-03-04 22:49 牧野星辰 阅读(90731) 评论(8) 推荐(23) 编辑
摘要:GCC GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙全套服务,开发者只需要关系代码逻辑与功能实现即可,但是,在享受便利的同时,必然也牺牲了一些灵活性。 阅读全文
posted @ 2019-03-04 17:52 牧野星辰 阅读(1029) 评论(0) 推荐(0) 编辑
摘要:C++ STL unordered_map用法 在C++11中,unordered_map作为一种关联容器,替代了hash_map,unordered_map的底层实现是hash表,所以被称为无序关联容器。 不管是map还是unordered_map都是一种 key map(value) 映射的容器 阅读全文
posted @ 2019-03-04 17:17 牧野星辰 阅读(34399) 评论(1) 推荐(4) 编辑
摘要:哈希表 先从数组说起 任何一个程序员,基本上对数组都不会陌生,这个最常用的数据结构,说到它的优点,最明显的就是两点: 简单易用,数组的简易操作甚至让大多数程序员依赖上了它,在资源富足的情况下,我们甚至会无意识地忽略其它更适用的数据结构而使用数组(别说你没这么干过..)。 查找的快速性,数组中查找元素 阅读全文
posted @ 2019-03-04 17:06 牧野星辰 阅读(4061) 评论(0) 推荐(0) 编辑
摘要:栈帧结构与函数调用约定 栈,是一种先入后出的数据结构,就像我们堆放书籍一样,先放的在最底下,后放置的在顶上,当我们要取的时候就是拿最上面一本,即最后放置的那一本。即FILO(first in last out)。 对大多数的应用程序员来说,栈就是这么一个数据结构的概念,而对于嵌入式工程师来说,栈还代 阅读全文
posted @ 2019-03-04 16:20 牧野星辰 阅读(1992) 评论(0) 推荐(0) 编辑
摘要:C/C++函数调用时传参过程与可变参数实现原理 C语言的经典swap问题 在学习C语言的时候,我们大都遇到过一些经典例题,这些经典例题背后所代表的是往往是C/C++背后的一些运行原理,比如下面这个示例: 请问下面这个swap()函数能否用来进行值交换? void swap(int x,int y) 阅读全文
posted @ 2019-03-04 15:59 牧野星辰 阅读(7579) 评论(2) 推荐(2) 编辑
摘要:C++中string的实现原理 背景 当我刚开始学习C++,对C还是有一部分的了解,所以以C的思维去学C++,导致我很长一段时间的学习都处于一个懵逼的状态,C++的各种特性,标准库,模板还有版本的迭代,简直是欲仙欲死。 后来在论坛中就有热心的朋友们出招了:你得放弃C的思维去学C++!!嗯,说得好有道 阅读全文
posted @ 2019-03-04 15:22 牧野星辰 阅读(11535) 评论(3) 推荐(4) 编辑
摘要:C++构造函数的理解 相对于C语言来说,C++有一个比较好的特性就是构造函数,即类通过一个或者几个特殊的成员函数来控制其对象的初始化过程。构造函数的任务,就是初始化对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。 构造函数的语法 构造函数的名字必须和类名相同,与其他函数不一样的是,构造 阅读全文
posted @ 2019-03-04 15:07 牧野星辰 阅读(18276) 评论(1) 推荐(6) 编辑
摘要:C语言强、弱符号,强、弱引用 符号定义 在编程中我们经常碰到符号重复定义的情况,当我们在同一个作用域内重复定义同一个变量时,有时是因为误写,有时是文件之间的冲突,编译器的处理方式就是报错: redefinition of 'xxx' 注意,这里针对于同一作用域才会有冲突,如果是不同作用域,比如全局和 阅读全文
posted @ 2019-03-04 14:51 牧野星辰 阅读(8084) 评论(2) 推荐(3) 编辑
摘要:不同平台下int类型、指针类型的数据大小 对于int类型数据和指针类型数据的大小,是非常基础的问题。 在一个具体的平台上,确定他们最好的办法就是使用sizeof(type)对其进行判断,返回当前数据类型的大小。 在不同的平台下,int类型和指针类型的数据类型大小时怎样的呢?如果要给出一个统一的答案, 阅读全文
posted @ 2019-03-04 12:27 牧野星辰 阅读(9285) 评论(3) 推荐(5) 编辑
摘要:C语言数组与指针的那些事儿 在C语言中,要说到哪一部分最难搞,首当其冲就是指针,指针永远是个让人又爱又恨的东西,用好了可以事半功倍,用不好,就会有改不完的bug和通不完的宵。但是程序员一般都有一种迷之自信,总认为自己是天选之人,明知山有虎,偏向虎山行,直到最后用C的人都要被指针虐一遍。 指针 首先, 阅读全文
posted @ 2019-03-04 12:00 牧野星辰 阅读(10126) 评论(2) 推荐(7) 编辑

点击右上角即可分享
微信分享提示