- 博客(65)
- 资源 (1)
- 收藏
- 关注
转载 GIC驱动代码分析
一、前言GIC(Generic Interrupt Controller)是ARM公司提供的一个通用的中断控制器。GIC通过AMBA(Advanced Microcontroller Bus Architecture)这样的片上总线连接到一个或者多个ARM processor上。本文主要分析了linux kernel中GIC中断控制器的驱动代码。具体的分析方法是按照source code为索引...
2018-12-14 14:29:36
1049
转载 RFID技术总结
技术简介: 射频识别技术RFID(Radio Frequency Identification),又称为电子标签、无线射频识别,是一种非接触式的自动识别技术,通过无线电讯号识别特定目标并读写相关数据而无需识别系统与特定目标之间建立机械或光学接触。可用于识别高速运动物体并可同时识别多个标签,过程中无需人工干预,操作快捷方便。可工作于各种环境,实现对各类物体或设备(人员、物品)在不同状态
2017-11-14 18:23:41
8085
转载 三次握手四次挥手的原理
TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP 协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号 并交换 TCP窗口大小信息。1.第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待
2017-09-26 11:04:55
408
转载 GTK学习笔记之Linux下Gtk环境搭建
下面介绍下Ubuntu 环境下具体的安装过程: 1、配置安装gcc/g++/gdb/make 等基本编程工具(必须装好) 刚装好的Ubuntu系统中已经有GCC了,但是这个GCC几乎什么文件都不能编译,因为缺少一些必须的头文件,所以要安装build-essential这个软件包。 可以在新立得里面搜索build-essential或输入下面命令: sudo apt-get instal
2017-08-08 15:48:18
688
转载 Linux platform
从 Linux 2.6 起引入了一套新的驱动管理和注册机制 :Platform_device 和 Platform_driver 。Linux 中大部分的设备驱动,都可以使用这套机制 , 设备用 Platform_device 表示,驱动用 Platform_driver 进行注册。 Linux platform driver 机制和传统的 device driver
2017-07-14 10:57:31
267
转载 Linux SPI
Linux的SPI子系统采用主机驱动和外设驱动分离的思想,首先主机SPI控制器是一种平台设备,因此它以platform的方式注册进内核,外设的信息是以boardinfo形式静态定义的,在创建spi_master时,会根据外设的bus_num和主机的bus_num是否相等,来选择是否将该外设挂接在该SPI主控制器下。先看SPI子系统中几个关键的数据结构:struct spi_master用来
2017-07-11 11:04:33
1411
原创 linux IIC
关于probe函数Linux中总线、设备、驱动这3者是非常重要的数据结构,它们互相之间都有联系一旦一个设备和一个驱动能够匹配上,就会执行驱动里的probe。总之一句话,probe函数作为driver的最基本的函数指针,一旦你的device和driver匹配(match,由总(bus)来完成,匹配工作发生在device_register()和drvier_register()的时候),probe函数
2017-07-07 09:25:57
548
原创 linux 设备管理之 mem proc sysfs devfs udev
Jack:淫龙,Linux实现的设备管理机制是什么样子的呢?我:在2.4内核里,主流的解决方案是devfs。Jack:我知道。在2.6里,devfs已经被udev替代了。我:这种说法是不准确的,是一种外行看热闹的说法。Jack:怎么说?我:让我给你讲一讲proc文件系统的起源吧。听完了,你自然就明白了。Jack:proc文件系统?穿越了。我:在很久很久很久以前,Linux内核的所有代码都是写死的,
2017-07-07 09:25:54
313
原创 设备I/O 端口和I/O 内存的访问
几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种: (1)I/O映射方式(I/O-mapped) 典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令
2017-07-07 09:25:51
421
原创 内存和IO访问
一、1 .内存空间和IO空间 x86 CPU下存在IO空间 的概念,等于IO端口(外设寄存器)和IO内存(外设内存)。IO空间可寻址16位达到64K2.统一编址和独立地址CPU访问各种外设有2种方式:一种是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设寄存器,这时,IO与内存统一编址,IO的地址与内存的地址在同一个地址空间下,这种编址方式叫做IO与
2017-07-07 09:25:48
2152
原创 ARM MMU工作原理剖析
一、MMU的产生 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为
2017-07-07 09:25:45
238
原创 什么叫总线 地址总线、数据总线、控制总线
总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用
2017-07-07 09:25:42
5972
原创 linux内核模块
首先,一个内核模块,就是一个ELF文件。内核本身也是一个ELF文件。一个模块,可能是一个协议,一个文件系统,一个驱动,一种具体的应用,等等任何东西。也可能是多种东西的组合。内核在运行时,通过动态加载/卸载内核模块,可以动态扩展/删减内核的功能。每个模块在编译时(假设模块名为xxx),会自动生成一个xxx.mod.c的文件,该文件会链接到xxx模块中去。Linux使用下方把模块内部的变量或函数声明为
2017-07-07 09:25:39
224
原创 信号
1 信号本质软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而
2017-07-07 09:25:36
250
原创 linux输入子系统
Linux 系统提供了input 子系统,按键、触摸屏、键盘、鼠标、摇杆等输入都可以利用input 接口函数来实现设备驱动。input子系统仍然是字符设备驱动程序,但是代码量减少很多,input子系统只需要完成两个工作:初始化和事件报告struct input_dev *xx_dev;xx_init(){ xx_dev = input_allocate_device(); input
2017-07-07 09:25:33
227
原创 异步和同步
异步通知,就是信号,信号类似于在软件层次上对中断机制的一种模拟。原来上,系统收到一个信号和一个中断是一样的。同步和异步的区别是是否步调一致,同步等返回结果,异步不等返回结果。阻塞和非阻塞是指等结果返回前的两种处理方式,阻塞会挂起睡眠,非阻塞不睡眠直接返回结果。1、概念剖析相信很多从事linux后台开发工作的都接触过同步&异步、阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞、异
2017-07-07 09:25:30
855
原创 Linux软中断机制
中断服务程序往往都是在CPU关中断的条件下执行的,以避免中断嵌套而使控制复杂化。但是CPU关中断的时间不能太长,否则容易丢失中断信号。为此, Linux将中断服务程序一分为二,各称作“Top Half”和“Bottom Half”。前者通常对时间要求较为严格,必须在中断请求发生后立即或至少在一定的时间限制内完成。因此为了保证这种处理能原子地完成,Top Half通常是在CPU关中断的条件下执行的。
2017-07-07 09:25:27
434
原创 x86和arm在原子操作上的差别
x86和arm在原子操作上有些差别,下面一代码的形式来说明区别:首先比较单核: 由于x86是CISC指令集,允许在一条指令里进行两次内存操作,所以对i++,i__这些操作在单核条件下是原子,当然必须得是显示使用addl r,%1这种,就可在一条指令里完成读,写操作。 而arm属于RISC指令集,在一次指令执行期间只能有一次内存操作,所以像i++,i--这些需要先读取内
2017-07-07 09:25:22
674
原创 Linux阻塞和非阻塞
阻塞(休眠)调用是没有获得资源则挂起进程,被挂起的进程进入休眠状态,调用的函数只有在得到结果之后才返回,进程继续。非阻塞(休眠)是不能进行设备操作时不挂起,或返回,或反复查询,直到可以进行操作为止,被调用的函数不会阻塞当前进程,而会立刻返回。因为阻塞的进程会进入休眠状态,因此,必须确保有一个地方能够唤醒休眠的进程。唤醒进程的地方最大可能发生在中断里面,因为硬件资源获得的同时往往伴随着一个中断。使用
2017-07-07 09:25:19
1203
原创 自旋锁 读写锁 顺序锁
三者功能区别: 自旋锁:读写均互斥;读写锁:读读可并发,其他互斥;顺序锁:读读、读写可并发;三者写写均互斥。自旋锁 自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的 并发可简单采用关闭中断的方式,不需要自旋锁)。 自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用(已经被持有)的自旋锁
2017-07-07 09:25:16
845
原创 Linux RCU
RCU的设计思想比较明确,通过新老指针替换的方式来实现免锁方式的共享保护。但是具体到代码的层面,理解起来多少还是会有些困难。在《深入Linux设备驱动程序内核机制》第4章中,已经非常明确地叙述了RCU背后所遵循的规则,这些规则是从一个比较高的视角来看,因为我觉得过多的代码分析反而容易让读者在细节上迷失方向。最近拿到书后,我又重头仔细看了RCU部分的文字,觉得还应该补充一点点内容,因为有些东西不一定
2017-07-07 09:25:08
241
原创 GCC和C99 中的inline
内联函数是代码被插入到调用者代码处的函数。如同 #define 宏(但并不等同,原因见下文),内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。 gcc对C语言的inline做了自己的扩展,其行为与C99标准中的inline有较大的不同。1.1. static inline GCC的static inline定义很容易理解:你可以把它认为是
2017-07-07 09:25:05
1117
原创 空指针和野指针
空指针是指向NULL的指针;指针变量在定义后如果没有初始化是野指针,其值不为NULL,指向一个随机地址。故在使用*析取(dereference)之前,应确保指针指向合法的地址
2017-07-07 09:25:02
202
原创 linux内核定时器
timer的用法还是很简单的。主要需要定义一个timer_list变量timer、先初始化timerinit_timer(&timer);then 对timer的相关参数赋值:timer.function = fun;timer.expires = jiffies + TIMER_DELAY;add_timer(&timer);在定时器时间到的时候,会执行fun,如果继续定时,可以通过在fun中执
2017-07-07 09:24:59
156
原创 《深入理解Linux内核》软中断/tasklet/工作队列
软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间的关系。(函数细节将不会在本文中出现,可以参考文献,点这里)(1)上半部和下半部的区别上半部指的是中断处理程序,下半部则指的是一些虽然与
2017-07-07 09:24:55
391
原创 C/C++为什么比JAVA快
大多数程序员都认为C/C++会比Java语言快,甚至于觉得从Java语言诞生以来,“执行速度缓慢”的帽子就应当被扣在头顶,这种观点的出现是由于Java刚出现的时候JIT编译技术还不成熟,主要靠解释器执行的Java语言确实性能比较低下。但是在今天JIT编译技术已经发展成熟之后,Java语言有可能在速度上与C/C++争一日长短了吗?这个问题的答案,让我们从两者的编译器谈起。 Java与C/C++的编
2017-07-07 09:24:53
8382
原创 C函数参数传递
对于C语言的参数传递都是值传递,当传传递一个指针给函数的时,其实质上还是值传递,除非使用双指针。 在讲双指针之前,还是先讲讲关于C语言函数调用的本质。函 数调用操作包括从一块代码到另一块代码之间的双向数据传递和执行控制转移。数据传递通过函数参数和返回值来进行,包括局部变量的空间分配与回收,都是通过 栈来实现的。绝大多数CPU上的程序实现使用栈来支持函数调用操作。栈被用来传递函数参数
2017-07-07 09:24:50
288
原创 指针常量和常量指针
char * const c;指针常量 是 指针类型的常量,即指针本身是常量,只能指向固定的区域;但该区域中的内容可以改变。const char *c; 或 char const *c;常量指针 是 指向常量的指针,即指针指向区域的内容是常量,不能更改;但该指针可以指向其它区域。辨别方法可为:从左到右顺序读*读作指针,const读作常量,谁在后谁决定本质。①const int p; ②const
2017-07-07 09:24:47
147
原创 中断屏蔽 原子操作 信号量
在设计自己的驱动程序时,第一个要记住的规则是:只要可能,就应该避免资源的共享。若没有并发访问,就不会有竞态。这种思想的最明显的应用是避免使用全局变量。临界区:临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性,临界区同一时间只能被一个进程访问。一、中断屏蔽:local_irq_disable()和local_irq_enable()
2017-07-07 09:24:43
1097
原创 Linux 内核综述
OS主要目的:(1)与硬件交互;(2)为应用程序提供可执行的环境。OS尽量禁止用户程序直接与底层硬件打交道或随意访问内存,因此Linux分为用户模式和内核模式。要实现两种模式,需要CPU硬件支持,ARM处理器中,CPSR(当前程序寄存器)用了5个bit来识别处理器的7种模式,其中两种与linux两模式对应,其他5模式标识不同中断或出错场景。单核处理器是 分时的并发;多核处理器是真正并发运行。lin
2017-07-07 09:24:41
182
原创 linux命令总结
linux命令后参数繁多,很难记忆,也容易忘掉。经常linux开发的靠多用来记忆,并结合以下方式来缓解:(1)指令参数多 大多用“manual ”命令 man 命令名 格式来查询该指令的参数详细说明。(2)alias[别名]=[指令名称] 例如 alias ll='ls -alF',很多工程师建立自己的别名指令库。(3)Up键可以查看到之前输入过的命令,ctrl+r可以输入过的命
2017-07-07 09:24:38
174
原创 字符数组与字符指针
1.字符指针可以指向一个字符串。我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:char *str = "This is a string.";是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。这里要注意字符指针与字符数组之间的区别。例如,有说明语句:char string[ ]="This is a string.";此时,string是字符
2017-07-07 09:24:35
209
原创 I2S信号个人理解阐述
I2S信号是音频数据传输格式 CLK的意义这里总结下: 先对模拟信号数字化做一个基础了解 对于模拟信号的数字化,需要经过采样和量化两个过程。 1.采样: 这里模拟信号的采样,简单的理解就是在什么时候对模拟信号做一个取样。比如每隔0.001ms做一次采样。这样就有,FS=1/0.001S=1KHZ.FS就是采样频率。 采样决定什么时候对模拟信号进行取值。要多少的采样频率才能完整的还原一个模拟
2017-07-07 09:24:32
7812
原创 FreeRTOS STM32移植笔记
目录(?)[+]1.前言 【1】其实说不上移植笔记,FreeRTOS已经移植至众多平台(MCU),包括MSP430,STM32等,这份笔记完全建立在官方代码的基础之上,简单的说就是修改一些设置从而完成一个呼吸灯实验。 【2】虽然有官方移植代码,但是官方移植版本为STM32的V2.X库,与现在流行的V3.5有比较大的区别。本笔记也是总结网上几篇学习笔记,主要说明如果使用V3.5库,需要做
2017-07-07 09:24:29
335
原创 运放带宽相关知识!
运放的主要参数介绍集成运放的参数较多,其中主要参数分为直流指标和交流指标。 其中主要直流指标有输入失调电压、输入失调电压的温度漂移(简称输入失调电压温漂)、输入偏置电流、输入失调电流、输入偏置电流的温度漂移(简称输入失调电流温漂)、差模开环直流电压增益、共模抑制比、电源电压抑制比、输出峰-峰值电压、最大共模输入电压、最大差模输入电压。 主要交流指标有开环带宽、单位增益带宽、转换速率SR、全功率
2017-07-07 09:24:25
7844
原创 电容的各种用途
电容在电路中的作用:具有隔断直流、连通交流、阻止低频的特性,广泛应用在耦合、隔直、旁路、滤波、调谐、能量转换和自动控制等。 1、滤波电容:它接在直流电压的正负极之间,以滤除直流电源中不需要的交流成分,使直流电平滑,通常采用大容量的电解电容,也可以在电路中同时并接其它类型的小容量电容以滤除高频交流电。 2、退耦电容:并接于放大电路的电源正负极之间,防止由电源内阻形成的正反馈而引起的寄生振荡。
2017-07-07 09:24:23
708
原创 关于I2C和SPI总线协议
IICvs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for IIC)和Motorola(for SPI) 出于不同背景和市场需求制定了这两种标准通信协议。 S
2017-07-07 09:24:16
298
原创 二极管技术总结汇总
二极管的主要参数 用来表示二极管的性能好坏和适用范围的技术指标,称为二极管的参数。不同类型的二极管有不同的特性参数。对初学者而言,必须了解以下几个主要参数: 1、额定正向工作电流 是指二极管长期连续工作时允许通过的最大正向电流值。因为电流通过管子时会使管芯发热,温度上升,温度超过容许限度(硅管为140左右,锗管为90左右)时,就会使管芯过热而损坏。所以,二极管使用中不要超过二极管额定正向工作
2017-07-07 09:24:11
607
原创 指针
指针说白了就是地址。指针变量就是用来存放指针(地址)的变量。 1. 变量的指针和指向变量的指针变量变量的地址和用来存放变量地址的地址变量。因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向
2017-07-07 09:24:08
399
EMC-LAYOUT
2008-12-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人