自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 问答 (1)
  • 收藏
  • 关注

转载 UART通信协议

1.UART    UART(Universal Asynchronous Receiver and Transmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。   而RS232、RS499、RS423、RS422和RS485等,是

2017-07-06 17:47:23 2837

转载 spi协议及工作原理分析

说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.NET/thread-1916003-1-1.html一、概述.     SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处

2017-07-06 17:30:34 404

转载 I2C协议解析

1、基本概念      主机            初始化发送,产生时钟信号和终止发送的器件      从机            被主机寻址的器件      发送器        发送数据到总线的器件      接收器        从总线接收数据的器件      多主机        同时有多于一个主机尝试控制总线 但不破坏报文      仲裁 

2017-07-06 17:26:13 395

转载 ARM的编程模型

1. ARM处理器的工作状态1)从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:    • ARM状态:此时处理器执行32位的字对齐的ARM指令;    • Thumb状态:此时处理器执行16位的、半字对齐的Thumb指令。2) Thumb和ARM     THUMB指令是ARM指令的子集,可以相互调用,只要遵循一定的调用规则,Thumb

2017-07-04 14:30:03 397

转载 ARM的体系架构

1. ARM概述1.1 Application Cortex Processors (ARM Cortex 应用处理器 )       • Cortex™-A 系列 - 开放式操作系统的高性能处理器      Cortex 应用处理器在先进工艺节点中可实现高达 2GHz+ 标准频率的卓越性能,从而可支持下一代的移动 Internet 设备。这些处理器具有单核和多核种类,

2017-07-04 14:27:50 738

转载 ARM编程模型

1. ARM处理器的工作状态1)从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:    • ARM状态:此时处理器执行32位的字对齐的ARM指令;    • Thumb状态:此时处理器执行16位的、半字对齐的Thumb指令。2) Thumb和ARM     THUMB指令是ARM指令的子集,可以相互调用,只要遵循一定的调用规则,Thumb

2017-05-08 17:19:15 531

转载 I2C和SPI总线对比

I2C与SPI总线的对比一 IIC总线I2C--INTER-IC串行总线的缩写,是PHILIPS公司推出的芯片间串行传输总线。它以1根串行数据线(SDA)和1根串行时钟线(SCL)实 现了双工的同步数据传输。具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。在主从通信中,可以有多个I2C总线器件同时接到I2C总线 上,通过地址来识别通信对象。IIC 接口的协议

2017-05-04 17:23:40 625

转载 C语言的数据类型

1.概述  C 语言包含的数据类型如下图所示:2.各种数据类型介绍2.1整型  整形包括短整型、整形和长整形。2.1.1短整形  short a=1;2.1.2整形  一般占4个字节(32位),最高位代表符号,0表示正数,1表示负数,取值范围是-2147483648~2147483647,在内存中的存储顺序是地位在前、高位在后

2017-04-27 18:11:21 237

转载 GDB调试

db常用命令:命令描述backtrace(或bt)查看各级函数调用及参数finish连续运行到当前函数返回为止,然后停下来等待命令frame(或f) 帧编号选择栈帧info(或i) locals查看当前栈帧局部变量的值

2017-02-16 08:58:27 247

转载 Linux2.6.32下的spi驱动的移植

Linux2.6.32下SPI驱动的移植如下图所示:下面需要修改部分内核代码,具体操作如下:1.  修改arch/arm/mach-s3c2440/mach-mini2440.c文件在include头文件代码行之后增加如下代码//spi  add by shiguang #include Linux/spi/spi

2017-02-13 11:17:56 1074

转载 SPI设备的驱动

主要包括两个SPI设备,AT45DB321D和MCP2515,一个是串行的数据闪存,一个是可以总线设备芯片。前者对于我们来说非常重要,我们可以借助该设备对uboot的和内核以及根文件系统进行更新。    预备知识:设备和驱动是如何匹配的?系统的热插拔是如何实现的?    首先一点,设备和驱动是严格区分的,设备是设备,驱动是驱动,设备通过struct device来定义,当然用户也可以将该结

2017-02-10 14:48:52 608

转载 Linux系统自带spi驱动加载及应用程序编写方法详解

硬件平台:飞思卡尔IMX6,内核版本:kernel3.0.35Linux系统中,和I2C一样,SPI也有系统自带的设备驱动程序,位于源码目录下drivers/spi/spidev.c,以下为驱动的移植和对应应用程序编写方法驱动代码移植要将此设备驱动加入到内核中,要做两件事情第一:将此驱动编译进内核步骤:make men

2017-02-10 14:46:48 2456

转载 linux内核中,在/drivers/char目录的Kconfig文件中加入自己编写的新驱动,make menuconfig却不显示的问题

修改了一个同学编写的基于i2c接口的气压传感器sht21驱动,文件名SHT21.c,文件中将sht21注册成字符设备,现需要将驱动重新编译。按照mini2440用户手册7.3.3节的步骤,将SHT21 module加入内核代码树并编译,第一步: 编辑配置文件Kconfig,加入驱动选项,使之在make menuconfig 的时候出现 打开 Linux-2.6.32.2/d

2017-02-09 11:20:38 741

转载 Linux驱动的两种加载方式过程分析

一、概念简述在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载。静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用。静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低。若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间。动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko

2017-02-09 10:56:36 5185 1

原创 linux驱动加载模块查看命令

驱动操作命令:      insmod / modprobe 加载驱动      rmmod                     卸载驱动      lsmod                       查看系统中所有已经被加载了的所有的模块以及模块间的依赖关系      modinfo                    获得模块的信息

2017-02-09 09:41:11 23608 2

原创 深入理解linux设备驱动

· 应用程序、库、内核、驱动程序的关系· 设备类型· 设备文件、主设备号与从设备号· 驱动程序与应用程序的区别· 用户态与内核态· Linux驱动程序功能一、应用程序、库、内核、驱动程序的关系1) 应用程序调用一系列函数库,通过对文件的操作完成一系列功能:       应用程序以文件形式访问各种硬件设备(Linux特有的抽象方式,

2017-02-07 10:07:39 704

原创 杨辉三角

杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来。在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和。这就是我们用C语言写杨辉三角的关键之一。在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n为行数减1。也就是说任何一个数等于这个是高中的组合数。n代表行数减1,不代表列数减1。如:第五行的第三个数就为=6。现在我们

2017-02-05 15:33:50 1715

原创 C语言指针的总结

指针(Pointer)就是内存的地址,C语言允许用一个变量来存放指针,这种变量称为指针变量。指针变量可以存放基本类型数据的地址,也可以存放数组、函数以及其他指针变量的地址。程序在运行过程中需要的是数据和指令的地址,变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符:在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地

2017-02-05 15:26:39 274

转载 Linux系统SPI驱动学习笔记(二)

五. SPI驱动的软件架构在内核的SPI驱动的软件架构中,进行了合理的分层和抽象,如下图所示:SPI控制器驱动程序SPI控制器不用关心设备的具体功能,它只负责把上层协议驱动准备好的数据按SPI总线的时序要求发送给SPI设备,同时把从设备收到的数据返回给上层的协议驱动,因此,内核把SPI控制器的驱动程序独立出来。SPI控制器驱动负责控制具体的控制器硬件

2017-02-04 14:15:54 618

转载 Linux系统SPI驱动学习笔记(一)

SPI是"Serial Peripheral Interface" 的缩写,是一种四线制的同步串行通信接口,用来连接微控制器、传感器、存储设备,SPI设备分为主设备和从设备两种,用于通信和控制的四根线分别是:CS    片选信号SCK  时钟信号MISO  主设备的数据输入、从设备的数据输出脚MOSI  主设备的数据输出、从设备的数据输入脚因为在大多数情况下,CPU或SOC一侧

2017-02-04 14:13:33 8598

转载 Linux 使用基本命令

1、建立虚拟机(相当于去电脑城diy主机)        网卡模式:三种(桥接、nat、hostonly),选择桥接        硬盘格式:三种(IDE、sata、scsi),选择scsi  2、添加系统光盘  3、安装系统        安装方式:            图形界面安装--安装介质(光盘):            分区规划:            

2017-02-04 10:52:13 245

转载 const在函数前与函数后的区别

const在函数前与函数后的区别一   const基础         如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况:         int   b   =   500;     const   int*   a   =   &b;              [1]     int   const   *a   =   &b;    

2017-01-19 16:39:22 160

原创 C语言中的冒泡排序法

冒泡排序法的原理:1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3.针对所有的元素重复以上的步骤,除了最后一个。4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较为止。算法稳定性冒

2017-01-17 09:41:20 641

原创 C语言atof()函数:将字符串转换为double(双精度浮点数)

头文件:#include 函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:double atof (const char* str);atof() 的名字来源于 ascii to floating point numbers 的缩写,它会扫描参数str字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直

2017-01-16 16:34:11 40627

原创 C语言strcat()函数:连接字符串

头文件:#include strcat() 函数用来连接字符串,其原型为:    char *strcat(char *dest, const char *src);【参数】dest 为目的字符串指针,src 为源字符串指针。strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的

2017-01-16 16:15:24 859

原创 C语言atoi()函数:将字符串转换成int(整数)

头文件:#include atoi() 函数用来将字符串转换成整数(int),其原型为:int atoi (const char * str);【函数说明】atoi() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并

2017-01-16 16:14:03 569

转载 gets和fgets函数的区别

1. gets与fgets  gets函数原型:char*gets(char*buffer);//读取字符到数组:gets(str);str为数组名。  gets函数功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。         读取的换行符被转换为null值,做为字符数组的最后一个字符,来结束字符串。

2017-01-16 16:02:27 866

转载 Linux设备驱动之I2C架构分析

一:前言I2c是philips提出的外设总线.I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL.正因为这样,它方便了工程人员 的布线.另外,I2C是一种多主机控制总线.它和USB总线不同,USB是基于master-slave机制,任何设备的通信必须由主机发起才可以.而 I2C 是基于multi master机制.一同总线上可允许多个master.关于I2C协议的知识,这里不再赘述.

2017-01-12 13:34:05 196

转载 调整内核printk打印级别--减少启动时的打印信息

有时调试内核模块,打印信息太多了,可以通过修改/proc/sys/kernel/printk文件内容来控制。默认设置是6   4   1   7# cat /proc/sys/kernel/printk7       4       1      7该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。关于不同日志级别的更多信息,请查阅syslog(2)联机

2017-01-12 13:31:29 2306

转载 《Linux内核设计与实现》读书笔记(二十)- 补丁, 开发和社区

linux最吸引我的地方之一就是它拥有一个高手云集的社区, 还有就是如果能=为linux内核中贡献代码, 一定是一件令人自豪的事情.下面主要总结一些和贡献代码相关的主要内容.加入社区编码风格提交补丁总结 1. 加入社区如果想为linux贡献代码, 那么加入linux社区是必须的, 加入了社区, 不仅可以及时内核的最新消息, 而且可以及时和社区内有经验的内核开

2017-01-11 11:10:24 237

转载 《Linux内核设计与实现》读书笔记(十九)- 可移植性

linux内核的移植性非常好, 目前的内核也支持非常多的体系结构(有20多个).但是刚开始时, linux也只支持 intel i386 架构, 从 v1.2版开始支持 Digital Alpha, Intel x86, MIPS和SPARC(虽然支持的还不是很完善).从 v2.0版本开始加入了对 Motorala 68K和PowerPC的官方支持, v2.2版本开始新增了 ARM

2017-01-11 11:09:13 277

转载 《Linux内核设计与实现》读书笔记(十八)- 内核调试

, 设置在 sys 文件系统的某个文件中. 当文件中的值变化时, 通知内核执行相应的代码. 2.6.3 使用统计量观察内核执行某段代码的频率实现思路就是在内核中的设置一个全局变量, 比如 my_count, 当内核执行到某段代码时, 给 my_count + 1 就行.同时还要将 my_count 打印出来(可以用printk), 便于随时查看它的值. 

2017-01-11 11:07:50 244

转载 《Linux内核设计与实现》读书笔记(十七)- 设备与模块

本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs。主要内容:设备类型内核模块内核对象sysfs总结 1. 设备类型linux中主要由3种类型的设备,分别是:设备类型代表设备特点访问方式块设备硬盘,光盘随机访问设备中

2017-01-11 11:06:55 557

转载 《Linux内核设计与实现》读书笔记(十六)- 页高速缓存和页回写

主要内容:缓存简介页高速缓存页回写 1. 缓存简介在编程中,缓存是很常见也很有效的一种提高程序性能的机制。linux内核也不例外,为了提高I/O性能,也引入了缓存机制,即将一部分磁盘上的数据缓存到内存中。 1.1 原理之所以通过缓存能提高I/O性能是基于以下2个重要的原理:CPU访问内存的速度远远大于访问磁盘的速度(访问速度差

2017-01-11 11:05:28 377

转载 《Linux内核设计与实现》读书笔记(十五)- 进程地址空间(kernel 2.6.32.60)

进程地址空间也就是每个进程所使用的内存,内核对进程地址空间的管理,也就是对用户态程序的内存管理。主要内容:地址空间(mm_struct)虚拟内存区域(VMA)地址空间和页表 1. 地址空间(mm_struct)地址空间就是每个进程所能访问的内存地址范围。这个地址范围不是真实的,是虚拟地址的范围,有时甚至会超过实际物理内存的大小。 现代

2017-01-11 11:03:18 344

转载 《Linux内核设计与实现》读书笔记(十四)- 块I/O层

主要内容:块设备简介内核访问块设备的方法内核I/O调度程序 1. 块设备简介I/O设备主要有2类:字符设备:只能顺序读写设备中的内容,比如 串口设备,键盘块设备:能够随机读写设备中的内容,比如 硬盘,U盘字符设备由于只能顺序访问,所以应用场景也不多,这篇文章主要讨论块设备。块设备是随机访问的,所以块设备在不同的应用场景中存在很大的优化空间。

2017-01-11 11:02:12 228

转载 《Linux内核设计与实现》读书笔记(十三)- 虚拟文件系统

虚拟文件系统(VFS)是linux内核和具体I/O设备之间的封装的一层共通访问接口,通过这层接口,linux内核可以以同一的方式访问各种I/O设备。虚拟文件系统本身是linux内核的一部分,是纯软件的东西,并不需要任何硬件的支持。 主要内容:虚拟文件系统的作用虚拟文件系统的4个主要对象文件系统相关的数据结构进程相关的数据结构小结  1. 虚拟

2017-01-11 11:00:52 310

转载 《Linux内核设计与实现》读书笔记(十二)- 内存管理

内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决)。所有内核的内存管理必须要简洁而且高效。主要内容:内存的管理单元获取内存的方法获取高端内存内核内存的分配方式总结 1. 内存的管理单元内存最基本的管理单元是页,同时按照内存地址的大小,大致分为3个区。 1.1 页页的大小与体系结构有关,在 x

2017-01-11 10:57:01 294

转载 《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理

系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要。 主要内容:系统时间定时器定时器相关概念定时器执行流程实现程序延迟的方法定时器和延迟的例子 1. 系统时间系统中管理的时间有2种:实际时间和定时器。1.1  实际时间实际时间就是现实中钟表上显示的

2017-01-11 10:55:28 289

转载 《Linux内核设计与实现》读书笔记(十)- 内核同步方法

内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我们在编写内核代码时选用合适的同步方法,从而即可保证代码中临界区的安全,同时也让性能的损失降到最低。主要内容:原子操作自旋锁读写自旋锁信号量读写信号量互斥体完成变量大内核锁顺序锁禁止抢占顺序和屏障总结 1. 原子操作原子操作是由编译器来保证的,保证一个线程对数据的操作不会被其他线程打断。原子操作有

2017-01-11 10:53:25 234

空空如也

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

TA关注的人

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