摘要: I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL ,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线。 因此,I2C总线被非常广泛地应用在EEPROM,实时钟,小型LCD等设备与CPU的接口中。linux下的驱动思路 在linux系统下编写I2C驱动,目前主要有两种方法,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux下I2C驱动体系结构来完成。下面比较下这两种方法: 第一种方法: 优点:思路比较直接,不需要花很多时间去了解linux中复杂的I2C子系统的操作方... 阅读全文
posted @ 2013-09-03 00:05 Leo.cheng 阅读(14372) 评论(5) 推荐(5) 编辑
摘要: linux操作系统下nand flash驱动框架 当我们需要在操作系统上读写普通文件的时候,总是需要一层层往下,最终到达硬件相关操作,当然底层设备大多数都是块设备 NAND FLASH就作为一个最底层的块设备。 而写驱动,就是要构建硬件与操作系统之间的联系,因此我们需要知道nand flash在Linux操作系统下的框架。 框架如下: 1.即使nand flash是一个块设备,它也能作为一个字符设备使用,因为说到底,也只是从寄存器内部读取值而已。 2.对于不同的文件系统,会有不同的文件组织形式。 3.由于块设备的硬件操作繁琐,就像nand flash的读写操作就需要发送地址跟命令... 阅读全文
posted @ 2013-09-01 16:10 Leo.cheng 阅读(1902) 评论(0) 推荐(0) 编辑
摘要: 总线设备驱动框架 总线设备驱动框架是一种类似于输入子系统的框架。 总线设备驱动,顾名思义,共有三个模块负责硬件资源的设备(device)负责处理硬件事务并且连接其他功能模块的驱动(driver)连接这两者的总线(bus)。以usb为例子展示总线设备驱动其过程分为以下步骤: 1.当加入一个设备时, 如果该设备支持中断唤醒线程,那么在中断处理程序内部就获取该设备的资源信息,然后构建device结构体,加入总线的device链表, 或者我们可以自己编写模块,在模块中填写该硬件的资源,然后构建device结构体,加入device链表。 2.对于新加入的device,通过比对driv... 阅读全文
posted @ 2013-09-01 15:57 Leo.cheng 阅读(520) 评论(0) 推荐(0) 编辑
摘要: 大体上跟windows的消息处理机制差不多app所要做的事情 1.绑定信号处理函数 2.通知驱动该程序的pid,好让驱动能够通过pid返回信号 3.设置异步标志位驱动程序所要做的事情 1.添加.fasync函数 2.构造fasync_struct结构体指针,该结构体用于存放pid 3.中断处理函数内部调用kill_fasync,当中断到来的时候就会发送信号流程如下 阅读全文
posted @ 2013-09-01 15:45 Leo.cheng 阅读(493) 评论(0) 推荐(0) 编辑
摘要: input输入子系统整体流程 input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层。 在开头部分会从设备驱动层做为线索,分析输入子系统和事件处理层是如何配合的,最后从用户角度出发,从“/dev/input/*”接口如何使用输入子系统提供的服务。 既然需要详细分析,有一个这样的流程图能够帮助我们在被绕进代码的过程中,找到出口,你能够知道你现在位于代码框架的什么位置,不会忘记正在分析的代码的“身份”。 设备驱动层注册到input子系统 以S3C2440触摸屏的驱动代码代例,初始化函数定义了struct input... 阅读全文
posted @ 2013-09-01 11:48 Leo.cheng 阅读(4897) 评论(0) 推荐(0) 编辑
摘要: 初识linux输入子系统 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler)、输入子系统核心层(InputCore)和输入子系统设备驱动层。设备驱动层:主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。核心层:为设备驱动层提供了规范和接口。设备驱动层只要关心如何驱动硬件并获得硬件数据(例如按下的按键数据),然后调用核心层提供的接口,核心层会自动把数据提交给事件处理层。事件处理层:则是用户编程的接口(设备节点),并处理驱动层提交的数据处理。input输入子. 阅读全文
posted @ 2013-08-31 17:15 Leo.cheng 阅读(7674) 评论(1) 推荐(6) 编辑
摘要: 系统说明 前段时间做的一个智能点餐系统,从0开始,用时3天,其中调bug(内存拷贝)调了一天,囧,现记一些架构文档 这个系统涉及到的知识点还是挺多的典型的c/s模式,socket通信多线程操作数据库操作临界资源的互斥操作 其它的就是功能架构上的一些细节问题,具体问题具体分析,分析过程已经全部留... 阅读全文
posted @ 2013-08-11 11:48 Leo.cheng 阅读(1563) 评论(0) 推荐(0) 编辑
摘要: 协议 在计算机网络中通信各方面所达成的、共同遵守和执行的一系列约定计算机网络的体系结构 计算机网络的层次结构和各层协议的集合。 OSI分层原则 根据不同层次的抽象分层 每层应该实现一个定义明确的功能 每层的选择应当有助于制定网络协议的国际标准 每层的边界的选择因该尽量减少... 阅读全文
posted @ 2013-08-05 22:47 Leo.cheng 阅读(605) 评论(0) 推荐(0) 编辑
摘要: 条件变量 条件变量用来阻塞线程等待某个事件的发生,并且当等待的事件发生时,阻塞线程会被通知。 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定。 而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。 使用时,条件变量被用来阻塞一个线程,当条件不... 阅读全文
posted @ 2013-08-04 17:42 Leo.cheng 阅读(2572) 评论(0) 推荐(0) 编辑
摘要: 互斥锁 互斥锁用来保证同一时间内只有一个线程在执行某段代码(临界区)。多线程编程最容易出问题的地方,就是临界区的界定和访问控制。 下面是一个生产者,消费者的简单例子。生产者、消费者公用一个缓冲区,这里假定缓冲区只能存放一条消息。生产者,消费者互斥 1 //生产者,消费者问题 2 //生产者、消费... 阅读全文
posted @ 2013-08-04 16:24 Leo.cheng 阅读(1343) 评论(0) 推荐(0) 编辑
摘要: 多线程优点 使用线程的理由之一: 和进程相比,它是一种“节俭”的多任务操作方式。在linux系统下,启动一个新的进程必须分配给他独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种“昂贵的”多任务工作方式。运行于一个进程中的多个线程,他们之间使用相同的地址空间,而且线程间彼... 阅读全文
posted @ 2013-08-04 15:47 Leo.cheng 阅读(630) 评论(0) 推荐(0) 编辑
摘要: 共享内存 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一 个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。应用 共享内存的使用,主要... 阅读全文
posted @ 2013-08-04 14:52 Leo.cheng 阅读(770) 评论(0) 推荐(0) 编辑
摘要: 信号量 信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源。 进程可以根据它判断是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。 当进程A要获取临界资源S时,首先要获取临界资源的信号量M,M的初始值为1,当获取到M并发现M的值大于1时,可以反问临界资源M... 阅读全文
posted @ 2013-08-04 12:17 Leo.cheng 阅读(1150) 评论(0) 推荐(0) 编辑
摘要: 发展 unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便。消息队列(报文队列)则克服了这些缺点。定义 消息队列就是一个消息的链表。可以把消息看做一个记录,具有特定的格式。进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列... 阅读全文
posted @ 2013-08-04 11:27 Leo.cheng 阅读(419) 评论(0) 推荐(0) 编辑
摘要: 什么是管道 管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。管道的分类 管道包括无名管道和命名管道两种,前者用于父进程和子进程间的通信,后者可用于运行于同一系统中的任意两个进程间的通信。无... 阅读全文
posted @ 2013-08-04 10:58 Leo.cheng 阅读(866) 评论(0) 推荐(0) 编辑
摘要: 信号方式(中断)信号的基本概念 每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向... 阅读全文
posted @ 2013-08-04 10:09 Leo.cheng 阅读(1527) 评论(0) 推荐(1) 编辑
摘要: 进程创建-->进程表 系统用一个叫做“进程表”的东西来维护系统中的进程,进程表中的一个条目维护着存储着一个进程的相关信息,比如进程号,进程状态,寄存器值等等... 当分配给进程A的“时间片”使用完时,CPU会进行上下文切换以便运行其他进程,比如进程B,这里所谓的“上下文切换”,主要就是在操作那个... 阅读全文
posted @ 2013-08-03 23:34 Leo.cheng 阅读(660) 评论(0) 推荐(0) 编辑
摘要: 项目要求 1.已经给出链表定义(本系统用双链表实现更为方便,但是由于要求用单链表,所以按照规定做事) 2.信息录入(当然是添加航班与取消航班了) 3.按照起飞时间先后顺序排列(可以在插入时即顺序插入,但为了体现排序过程,封装成了排序函数) 4.可根据不同关键字进行查询(实现了三种具有代表性的... 阅读全文
posted @ 2013-08-03 19:31 Leo.cheng 阅读(1382) 评论(0) 推荐(0) 编辑
摘要: fwrite实现文件复制 1 //@ author 成鹏致远 2 //@ net http://infodown.tap.cn 3 //@ qq 552158509 4 //@ blog lcw.cnblogs.com 5 6 #include 7 #include 8 #include 9 10 #define BUFSIZE 10011 12 int main(int argc, char * argv[])13 {14 FILE *read_fp,*write_fp;15 char buf[BUFSIZE];16 17 if(3 != argc)18 ... 阅读全文
posted @ 2013-08-03 19:17 Leo.cheng 阅读(460) 评论(0) 推荐(0) 编辑
摘要: 头文件 1 //@ author 成鹏致远 2 //@ net http://infodown.tap.cn 3 //@ qq 552158509 4 //@ blog lcw.cnblogs.com 5 6 #ifndef _MYINCLUDE_H 7 #define _MYINCLUDE_H ... 阅读全文
posted @ 2013-08-03 19:11 Leo.cheng 阅读(439) 评论(0) 推荐(0) 编辑
摘要: 顺序哈希表头文件 1 //@ author 成鹏致远 2 //@ net http://infodown.tap.cn 3 //@ qq 552158509 4 //@ blog lcw.cnblogs.com 5 6 #ifndef __HASHSQ_H 7 #define __HASHSQ_H... 阅读全文
posted @ 2013-08-03 19:02 Leo.cheng 阅读(1292) 评论(0) 推荐(0) 编辑
摘要: 二叉树头文件 1 //@ author 成鹏致远 2 //@ net http://infodown.tap.cn 3 //@ qq 552158509 4 //@ blog lcw.cnblogs.com 5 6 #ifndef __BINTREE_H 7 #define __BINTREE_H... 阅读全文
posted @ 2013-08-03 18:53 Leo.cheng 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 单向链表头文件 1 //@ author 成鹏致远 2 //@ net http://infodown.tap.cn 3 //@ qq 552158509 4 //@ blog lcw.cnblogs.com 5 6 #ifndef _LINKLIST_H 7 #define _LINKLIST_... 阅读全文
posted @ 2013-08-03 17:57 Leo.cheng 阅读(1804) 评论(0) 推荐(0) 编辑
摘要: 顺序队列头文件 1 //@ author 成鹏致远 2 //@ net http://infodown.tap.cn 3 //@ qq 552158509 4 //@ blog lcw.cnblogs.com 5 6 #ifndef __SQUEUE_H 7 #define __SQUEUE_H ... 阅读全文
posted @ 2013-08-03 17:47 Leo.cheng 阅读(541) 评论(0) 推荐(0) 编辑
摘要: 顺序栈头文件 1 //@ author 成鹏致远 2 //@ net http://infodown.tap.cn 3 //@ qq 552158509 4 //@ blog lcw.cnblogs.com 5 6 //顺序栈 7 8 #ifndef __SQSTACK_H 9 #define ... 阅读全文
posted @ 2013-08-03 17:37 Leo.cheng 阅读(960) 评论(0) 推荐(0) 编辑
摘要: list_entry定义/*** list_entry - get the struct for this entry* @ptr: the &struct list_head pointer.* @type: the type of the struct this is ... 阅读全文
posted @ 2013-07-30 12:53 Leo.cheng 阅读(843) 评论(0) 推荐(0) 编辑
摘要: void指针 void指针平时用的地方不多,但是不代表它不重要#include typedef int*(*TY)[5]; //指针数组的指针类型int main(void){ void *p1,*p2,*p3; int a1 = 100; int *px = &a1; //一级指针 int **py = &px; //二级指针 int a[5] = {1,2,3,4,5}; int *b[5] = {a,a+1,a+2,a+3,a+4}; //指针数组 p1 = &py; p2 = b; p3 = &b; ... 阅读全文
posted @ 2013-07-25 13:14 Leo.cheng 阅读(1024) 评论(0) 推荐(1) 编辑
摘要: arm-linux-gcc -o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 -Wall 指定产生全部的警告信息 -O2 编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高 -c 表示只要求编译器进行编译,而不要进行链接,生成以源文件的... 阅读全文
posted @ 2013-07-23 20:25 Leo.cheng 阅读(888) 评论(0) 推荐(0) 编辑
摘要: 反射反射: 在运行时动态分析或使用一个类进行工作。 java.lang.Class类:描述类信息的类。 类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Class是类对象的类型。 获得类对象的方式: 用" 类名.class "获得这个类的类对象。 用类的对象掉用getClass(),如object.getClass()得到这个对象的类型的类对象。 可以使用Class.forName(类名),也可以得到这个类的类对象,(注意,这里写的类名必须是全限定名(全名),是包名加类名,XXX.XXX.XXXX)。 基本类型也有类对... 阅读全文
posted @ 2013-07-22 19:58 Leo.cheng 阅读(339) 评论(0) 推荐(0) 编辑
摘要: 判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且输入月份大于3时需考虑多加一天 5 */ 6 7 /* 8 *@author: 成鹏致远 9 *@net: http://infodown.tap.cn10 */11 12 #include 13 #include 14 15 struct year_mon_day16 {17 int year;18 int mon;19 int day;20 };21 22 int ... 阅读全文
posted @ 2013-07-22 11:24 Leo.cheng 阅读(3174) 评论(7) 推荐(3) 编辑
摘要: 冒泡排序 1 package com.lcw.bubble; 2 3 public class BubbleSort 4 { 5 /** 6 * 冒泡排序 7 * @param args 8 * @author 成鹏致远 9 */10 11 public static int[] bubleSort(int[] before)12 {13 int temp;14 for (int i = 0; i before[j+1])19 {20 ... 阅读全文
posted @ 2013-07-22 08:52 Leo.cheng 阅读(1109) 评论(0) 推荐(0) 编辑
摘要: 修饰符abstract 抽象的,定义框架不去实现,可以修饰类和方法abstract修饰类: 会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型 抽象类就相当于一个类的半成品,需要子类继承并覆盖其中的抽象方法,这时子类才又创建实例的能力,如果子类没有实现父类的抽象方法,那么子类也要为抽象类。abstract修饰方法: 会使这个方法变成抽象方法,也就是只有声明而没有实现,实现部分以";"代替,需要子类继承实现。 抽象方法代表了某种标准,定义标准,定义功能,在子类中去实现功能(子类继承了父类并需要给出从父类继承的抽象方法的实现).. 阅读全文
posted @ 2013-07-21 17:59 Leo.cheng 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 安装 NFS servermystery@lcw:~$ sudo apt-get install nfs-kernel-server 编辑/etc/exports,添加目标系统的根文件系统映射目录,假如目标系统的根文件系统最后映射到/home/mystery/nfs_files,则/etc/exp... 阅读全文
posted @ 2013-07-21 16:15 Leo.cheng 阅读(2528) 评论(0) 推荐(0) 编辑
摘要: 类和对象类:主观抽象,是对象的模板,可以实例化对象 习惯上类的定义格式:package xxx; import xxx; public class Xxxx{ 属性 ······; 构造器 ······; 方法 ······;}View Code 定义属性:实例变量格式:[ 修饰符 ] 类型 变量名 [ = ? ]实例变量定义在类中但在任何方法之外。实例变量有默认值:各种各样的0。(同数组)实例变量的作用域至少在本类 阅读全文
posted @ 2013-07-20 14:53 Leo.cheng 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 配置java环境变量JAVA_HOME:配置JDK的目录CLASSPATH:指定到哪里去找运行时需要用到的类代码(字节码)PATH:指定可执行程序的位置LINUX系统 (在" .bash_profile "下的环境变量设置)JAVA_HOME=/opt/jdk1.5.0_06CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarPATH=$PATH:$JAVA_HOME/bin:.export JAVA_HOME CLASSPATH PATHView Code 将指定的环境变量声明为全局的windows系统 右击 阅读全文
posted @ 2013-07-20 11:54 Leo.cheng 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 一、准备工作 首先更新software sources,找到最快的源lcw@ubuntu:~$ sudo apt-get update二、安装sambalcw@ubuntu:~$ sudo apt-get install samba smbfs samba-common smbclient三、创建... 阅读全文
posted @ 2013-07-19 16:45 Leo.cheng 阅读(1121) 评论(0) 推荐(0) 编辑
摘要: 在x86平台下分析下面的代码输出结果 1 int main(void) 2 3 { 4 5 int a[4] = {1, 2, 3, 4}; 6 7 int *ptr1=(int *)(&a+1); 8 9 int *ptr2=(int *)((int)a+1);10 11 printf("%x, %x/n", ptr1[-1], *ptr2);12 13 return 0;14 15 }&a+1 首先明确,a是一个具有4个整型变量的数组的名字,具体地说是这种数组的首元素的首地址,而&a是数组的首地址,请注意措辞。而关于指针加1,则需要指针运算... 阅读全文
posted @ 2013-07-13 18:21 Leo.cheng 阅读(896) 评论(0) 推荐(1) 编辑
摘要: 对数组名进行取地址运算int a[] = {1,2,3};int (*p)[3] = &a; //注意左值对数组名取地址,得到的指针为指向整个数组的指针。形参数组形参为数组时勿须带数组长度,因为计算机不会处理,如果需要传数组长度,需要另外加参数。一维数组指针 1 #include 2 3 //void array_add(int a[], int len) 4 void array_add(int *p, int len) 5 { 6 int i = 0; 7 8 for(i=0; i 2 3 //void array_add(int a[][], int len... 阅读全文
posted @ 2013-07-13 17:26 Leo.cheng 阅读(849) 评论(0) 推荐(1) 编辑
摘要: 题目以下两个程序片段A 和B ,问哪个能进入循环?片段A:unsigned short i;unsigned short index = 0;for(i=0; i < index-1; i++){ ........}片段B:unsigned short i;unsigned long index = 0;for(i=0; i < index-1; i++){ ........}解答 此题主要考虑类型之间的隐式转换问题,答案是B能进入循环 对于片段A:short - int 的结果是int 型的,所以结果是:0<-1,不满足条件; 对于片段B:unsigned long - i 阅读全文
posted @ 2013-07-12 11:42 Leo.cheng 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 对于一个无符号数字x,截断它到k位的结果就相当于计算xmod2^k.在大多数的机器上,整数乘法指令相当地慢,需要12或者更多的始终周期,然而其他整数运算-例如加法、减法、位移运算和移位-只需要1个时钟周期.因此,编译器使用的一项重要的优化就是试着使用移位和加法运算的组合来代替乘以常数因子的乘法.在大多数的机器上,整数除法要比整数乘法更慢-需要30或者更多的始终周期.除以2的幂也可以用移位运算来实现,只不过我们用的是右移,而不是左移.对于无符号和二进制补码数,分别使用逻辑移位和算术移位来达到目的.注意系统的分类:主流的IA32(也就是x86),以及x86-64(也就是x64),还有种Intel的 阅读全文
posted @ 2013-07-09 23:33 Leo.cheng 阅读(679) 评论(0) 推荐(0) 编辑