您的位置 首页 > 驱动程序

嵌入式系统接口设计与linux驱动程序开发

嵌入式系统接口设计与linux驱动程序开发

       大家好,今天我要和大家探讨一下关于嵌入式系统接口设计与linux驱动程序开发的问题。为了让大家更容易理解,我将这个问题进行了归纳整理,现在就让我们一起来看看吧。

1.有哪位可以帮我一篇“嵌入式linux操作系统的驱动程序设计与实现“的论文啊?有加分

2.嵌入式Linux驱动程序和系统开发实例精讲的图书目录

3.嵌入式系统开发流程

4.嵌入式工程师都学什么课程

5.嵌入式系统Linux内核开发实战指南的前言(序)

嵌入式系统接口设计与linux驱动程序开发

有哪位可以帮我一篇“嵌入式linux操作系统的驱动程序设计与实现“的论文啊?有加分

       这样的问题一篇文章解决不了,自己找本书看看吧。

       嵌入式Linux 操作系统设备驱动程序设计与实现

       屈晓平,刘涛

       (九江学院信息科学与技术学院,江西九江332005)

       摘要:主要阐述了嵌入式Linux 设备驱动程序的概念,归纳嵌入式Linux 设备驱动程序的共性,探讨嵌入式Linux 设备驱动程

       序具体开发流程以及驱动程序的关键代码,总结嵌入式Linux 设备驱动程序开发的主导思想。

       关键词:嵌入式系统;Linux;设备驱动程序;内核

       ·计算技术与自动化·

       Design and Implement at ion of Embedded Linux Device Drivers

       QU Xiao-ping,LIU Tao

       (Information Science and Technology College, Jiujiang University, Jiangxi Jiujiang 332005)

       Key words: Embedded System;Linux;device driver;kernel

       嵌入式系统被广泛运用到消费、汽车、电子、微控制、无线通

       信、数码产品、网络设备、安全系统等领域。越来越多的公司、研

       究单位、大专院校、以及个人开始进行嵌入式系统的研究,嵌入

       式系统设计将是未来相当长一段时间内研究的热点。

       1 Linux 设备驱动程序概述

       嵌入式Linux 以其可应用于多种硬件平台、内核高效稳定、

       源码开放、软件丰富、网络通信和文件管理机制完善等优良特

       性,成为嵌入式系统领域中的一个研究热点。嵌入式Linux 系统

       中,内核提供保护机制,用户空间的进程一般不能直接访问硬

       件。进行嵌入式系统的开发,很大的工作量是为各种设备编写驱

       动程序,除非系统不使用操作系统。Linux 设备驱动程序在Linux

       内核源代码中占有很大比例,从2.0、2.2 到2.4 版本的内核,源代

       码的长度日益增加,其实主要是设备驱动程序在增加。

       设备驱动程序在Linux 内核中占有极其重要的位置,它是内

       核用于完成对物理设备的控制操作的功能模块。除了CPU、内存

       以及其他很少的几个部分之外,所有的设备控制操作都必须由

       与被控设备相关的代码,也就是驱动程序来完成。内核必须包括

       与系统中的每个外部设备对应的驱动程序。否则设备就无法在

       Linux 下正常工作。这就是驱动程序开发成为Linux 内核开发的

       主要工作的原因。从内核源码的代码分布可以看出,设备驱动源

       码至少占据了一半的内核源码量,更能说明设备驱动程序对操

       作系统的意义和价值。

       2 嵌入式Linux 设备驱动程序开发

       2.1 设备驱动程序工作原理

       在Linux 操作系统下有3 类主要的设备文件类型:块设备、

       字符设备和网络设备。这种分类方法可以将控制不同输入/输出

       设备的驱动程序与其它操作系统软件分离开来。字符设备与块

       设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件

       I/O 一般紧接着发生。块设备则不然,它利用一块系统内存作缓

       冲区,若用户进程对设备的请求能满足用户的要求,就返回请求

       的数据;否则,就调用请求函数来进行实际的I/O 操作。网络设备

       可以通过BSD 套接口访问数据。所有嵌入式Linux 设备驱动程

       序都有一些共性,是编写所有类型的驱动程序都通用的,操作系

       统提供给驱动程序的支持也大致相同。这些特性包括:(1)读/写

       几乎所有设备都有输入和输出。每个驱动程序都要负责本设备

       的读/写操作,操作系统的其它部分不需要知道对设备的具体读/

       写操作是怎样进行的,这些都由驱动程序屏蔽掉了。操作系统定

       义好一些读/写接口,由驱动程序完成具体的功能。在驱动程序初

       始化时,需要把具有这种接口的读/写函数注册到操作系统。(2)

       中断中断在现代计算机结构中有重要的地位,操作系统必须

       提供驱动程序响应中断的能力。一般是把一个中断处理程序注

       册到系统中,操作系统在硬件中断发生后,调用驱动程序的处理

       程序。Linux 支持中断的共享,即多个设备共享一个中断。(3)时钟

       在实现驱动程序时,很多地方会用到时钟,例如某些协议里的

       超时处理,没有中断机制的硬件的轮询等。操作系统应为驱动程

       序提供定时机制,一般是在预定的时间过了以后,回调注册的时

       钟函数。

       嵌入式Linux 系统驱动程序开发与普通Linux 没有太多区

       别。嵌入式设备由于硬件种类非常丰富,在缺省的内核发布版中

       不可能包括所有驱动程序。可以在硬件生产厂家或者Intemet 上

       寻找驱动程序,如果找不到,可以根据一个相近硬件的驱动程序

       来改写。实现一个嵌入式Linux 设备驱动的大致流程如下:(1)定

       义主、次设备号,也可以动态获取;(2)实现驱动初始化和清除函

       数,如果驱动程序采用模块方式,则要实现模块初始化和清除函

       数;(3)设计所要实现的文件操作,定义file_operations 结构;(4)实

       现所需的文件操作调用,如read、write 等;(5)实现中断服务函数,

       并用request irq 向内核注册;(6)将驱动编译到内核或编译成模

       块,用insmod 命令加载;(7)生成设备节点文件。

       与普通文件相比,设备文件的操作要复杂得多,不可能简单

       地通过read、write 和llseek 等来实现。所有其它类型的操作都可

       以通过VFS 的ioctl 调用来执行,为此,只需要在驱动程序中实

       现ioctl 函数,并在其中添加相应的case 即可。通过cmd 区分

       操作,通过arg 传递参数和结果。

       2.2 设备驱动程序的开发流程

       2.2.1 设备驱动接口

       Struct file_operation IOdriver_fops=

       {read:1Odriver_read,

       write:IOdriver_write,

       };

       字符设备驱动接口中关键的file_operations 结构:

       <linux/fs.h>的定义如下:

       struct file_operations{

       struct module *owner;

       loft_t(*llseek)(struct file*,loff_t,int);

       45

       ssize_t(*read)(struct file*,char*,size_t,loft_t);

       ssize_t(*write)(struct file*,const char*,size_t,1off_t*);

       int(readdir struct inode*,struct file*,void*,filldir_t);

       int(*select)(struct inode*,struct file*,int,select table*);

       int(*ioct1)(struct inode*,struct file*,unsigned int,unsigned int);

       int(*mmap)(struct inode*,struct file*,struct vm_area_struct*);

       int( *open)(struct inode*,struct file*);

       void(*release)(struct inode*,struct file*);

       int(*fsync)(struct inode*,struct file*);

       };

       2.2.2 注册和注销模块

       2.2.2.1 设备注册模块

       static int_nit IOdriver_init(void)

       { int ret=0:

       ret=register_chrdv(MAJOR_NUM,"IOdriver",&IOdriv

       if(ret)

       { printk(KERN_ALERT"IOdriver register failure! ") }

       else

       { printk(KERN_AL ERT"IOdriver register success! ") }

       return ret;

       }

       2.2.2.2 设备注销模块

       static int_exit IOdriver_exit(void)

       { int ret=0;

       ret=unregister_chrdv(MAJOR_NUM,"IOdriver");

       if(ret)

       { printk(KERN_AL ERT"IOdriver unregister failure! ");}

       else

       { printk(KERN_AL ERT"IOdriver unregister success! '');}

       return ret;

       }

       2.2.3 基本入口点设备函数的具体实现

       2.2.3.1 设备读取模块

       static ssize_t IOdriver_read (struct file*file,char*buf,size_t len,

       loft_t*off)

       { if(_ _copy_to_user(bur,&IOdriver_var,sizeof(int)))

       { retum _EFAULT;}

       retum sizeof(int);

       }

       2.2.3.2 设备写入模块

       static ssize_t IOdriver_write (struct file*file,const char*buf,size_t

       len,loff_t*off)

       { if(_ _copy_from_user(&IOdriver_var,buf,sizeof(int)))

       { retum __EFAULT;}

       retum sizeof(int);

       }

       2.2.4 module_init 和module_exit 宏

       module_init(IOdriver_init);

       module_exit(IOdriver_exit);

       3 设备驱动程序编译到内核的过程

       把驱动程序编译进内核的步骤如下:

       (1)把IOdriver.c 复制到Linux-2.4.20-8/drivers/char 下,并修

       改该目录下的config.in 文件,config.in 是每个模块的配置脚本,

       在这个文件当中定义配置那些模块、怎样配置等,因此当添加了

       IO 的配置后,会在内核配置时出现这个模块的配置选项。

       (2)修改当前目录下的Makefile,在每个模块的Makefile 中

       包括该模块所包含的子模块,在char devices 中,要包括IO

       设备,就要告诉Makefile 编译IOdriver.c 并包含编译出的IOdriver.

       c 文件,这样最后内核做链接时,才会链接进这个模块。

       (3)重新配置内核,选中IO 模块执行命令make menuconfig,

       进入内核配置菜单。

       (4)重新编译内核,并更新嵌入式目标系统的内核。

       (5)创建设备文件,重新启动嵌入式目标系统的Linux,进入

       目录/proc,查看devices 文件,在devices 文件列出了当前系统所

       有的字符设备和块设备,包括设备号和设备名称,在Character

       devices 的最后移行的设备是:254 IOdriver,说明IOdriver 设备

       已经正确地加载到了内核。

       (6)添加设备文件节点,执行如下命令,添加设备文件节点,

       在此创建的设备名称用于在应用程序中访问对应的设备。如果

       为字符设备,设备号类型用c 表示,块设备则用b 表示;主设备

       号就是/proc/devices 中的IOdriver 的设备号,由于该类设备只有

       一个,因此次设备号为0,如果还有该类型的其他设备,则一次为

       1、2、3 等。

       5 结束语

       设备驱动程序是操作系统内核和机器硬件之间的接口。内

       核利用驱动程序的接口完成对设备的初始化和释放,在系统内

       核和硬件之间传送数据,并时刻检测和处理设备出现的错误。它

       是操作系统最基本的组成部分,因此熟悉驱动的编写是很重要

       的。

嵌入式Linux驱动程序和系统开发实例精讲的图书目录

       一:C语言 嵌入式Linux工程师的学习需要具备一定的C语言基础,C语言是嵌入式领域最重要也是最主要的编程语言,通过大量编程实例重点理解C语言的基础编程以及高级编程知识。包括:基本数据类型、数组、指针、结构体、链表、文件操作、队列、栈等。

       二:Linux基础 Linux操作系统的概念、安装方法,详细了解Linux下的目录结构、基本命令、编辑器VI ,编译器GCC,调试器GDB和 Make 项目管理工具, Shell Makefile脚本编写等知识,嵌入式开发环境的搭建。

       三:Linux系统编程 重点学习标准I/O库,Linux多任务编程中的多进程和多线程,以及进程间通信(pipe、FIFO、消息队列、共享内存、signal、信号量等),同步与互斥对共享资源访问控制等重要知识,主要提升对Linux应用开发的理解和代码调试的能力。

       四:Linux网络编程 计算机网络在嵌入式Linux系统应用开发过程中使用非常广泛,通过Linux网络发展、TCP/IP协议、socket编程、TCP网络编程、UDP网络编程、Web编程开发等方面入手,全面了解Linux网络应用程序开发。重点学习网络编程相关API,熟练掌握TCP协议服务器的编程方法和并发服务器的实现,了解HTTP协议及其实现方法,熟悉UDP广播、多播的原理及编程方法,掌握混合C/S架构网络通信系统的设计,熟悉HTML,Javascript等Web编程技术及实现方法。

       五:数据结构与算法 数据结构及算法在嵌入式底层驱动、通信协议、及各种引擎开发中会得到大量应用,对其掌握的好坏直接影响程序的效率、简洁及健壮性。此阶段的学习要重点理解数据结构与算法的基础内容,包括顺序表、链表、队列、栈、树、图、哈希表、各种查找排序算法等应用及其C语言实现过程。

       六:C++ 、QT C++是Linux应用开发主要语言之一,本阶段重点掌握面向对象编程的基本思想以及C++的重要内容。图形界面编程是嵌入式开发中非常重要的一个环节。由于QT具有跨平台、面向对象、丰富API、支持2D/3D渲染、支持XML、多国语等强大功能,在嵌入式领域的GUI开发中得到了广范的应用,在本阶段通过基于QT图形库的学习使学员可以熟练编写GUI程序,并移植QT应用程序到Cortex-A8平台。包括IDE使用、QT部件及布局管理器、信息与槽机制的应用、鼠标、键盘及绘图事件处理及文件处理的应用。

       七:Cortex A8 、Linux 平台开发 通过基于ARM Cortex-A8处理s5pv210了解芯片手册的基本阅读技巧,掌握s5pv210系统资源、时钟控制器、电源管理、异常中断控制器、nand flash控制器等模块,为底层平台搭建做好准备。Linux平台包括内核裁减、内核移植、交叉编译、GNU工具使用、内核调试、Bootloader介绍、制作与原理分析、根文件系统制作以及向内核中添加自己的模块,并在s5pv210实验平台上运行自己制作的Linux系统,集成部署Linux系统整个流程。同时了解Android操作系统开发流程。Android系统是基于Linux平台的开源操作系统,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件,目前它的应用不再局限于移动终端,还包括数据电视、机顶盒、PDA等消费类电子产品。

       八:驱动开发 驱动程序设计是嵌入式Linux开发工作中重要的一部分,也是比较困难的一部分。本阶段的学习要熟悉Linux的内核机制、驱动程序与用户级应用程序的接口,掌握系统对设备的并发操作。熟悉所开发硬件的工作原理,具备ARM硬件接口的基础知识,熟悉ARM Cortex-A8处理器s5pv210各资源、掌握Linux设备驱动原理框架,熟悉工程中常见Linux高级字符设备、块设备、网络设备、USB设备等驱动开发,在工作中能独立胜任底层驱动开发。

       以上就是列出的关于一名合格嵌入式Linux开发工程师所必学的理论知识,其实,作为一个嵌入式开发人员,专业知识和项目经验同样重要,所以在我们的理论学习中也要有一定的项目实践,锻炼自己的项目开发能力。

嵌入式系统开发流程

       第1篇 Linux基础知识

       第1章 嵌入式基础入门 2

       1.1 嵌入式操作系统简介 2

       1.1.1 嵌入式系统的基本概念 2

       1.1.2 嵌入式系统的内核介绍 3

       1.1.3 嵌入式系统的应用领域 4

       1.2 Linux操作系统概述 5

       1.2.1 嵌入式Linux发展现状 5

       1.2.2 Linux相关的常用术语 6

       1.3 Linux操作系统的移植 8

       1.3.1 BootLoader技术详解 8

       1.3.2 Linux内核基本结构 17

       1.3.3 移植Linux操作系统 28

       1.4 本章总结 32

       第 2章 Linux系统开发环境平台 33

       2.1 进程/线程管理 33

       2.1.1 进程/线程的概念 33

       2.1.2 进程基本操作 37

       2.1.3 进程通信与同步 49

       2.1.4 线程基本操作 57

       2.1.5 简单的多线程编程 59

       2.2 文件系统结构和类型 62

       2.2.1 FAT文件系统 62

       2.2.2 RAMFS内核文件系统 66

       2.2.3 JFFS与YAFFS文件系统 68

       2.2.4 EXT2/EXT3文件系统 71

       2.2.5 /proc文件系统 74

       2.2.6 Linux文件操作函数 75

       2.3 存储管理 79

       2.3.1 MTD内存管理 79

       2.3.2 Linux内存管理 83

       2.4 设备管理 84

       2.4.1 概述 84

       2.4.2 字符设备与块设备 84

       2.4.3 主设备号和次设备号 87

       2.5 本章总结 88

       第3章 嵌入式Linux程序设计基础 89

       3.1 建立嵌入式Linux交叉编译环境 89

       3.1.1 编译环境概述 89

       3.1.2 建立交叉编译环境流程 92

       3.2 工程管理器make 97

       3.2.1 make概述 97

       3.2.2 Makfile文件书写规则 101

       3.3 Linux C/C++程序设计 104

       3.3.1 C/C++程序结构 104

       3.3.2 C/C++数据类型 107

       3.3.3 表达式/语句、函数 108

       3.3.4 C/C++设计注意事项 111

       3.4 Linux汇编程序设计 117

       3.4.1 Linux汇编语法格式 118

       3.4.2 汇编程序实例 119

       3.5 Linux Shell语言编程 120

       3.5.1 Shell环境变量及配置文件 121

       3.5.2 Shell编程实例 123

       3.6 Linux Perl语言编程 124

       3.6.1 Perl基本程序 124

       3.6.2 Perl变量 125

       3.6.3 文件句柄和文件操作 128

       3.6.4 循环结构 129

       3.6.5 条件结构 130

       3.7 本章总结 131

       第4章 Linux常用开发工具 132

       4.1 GCC编译器 132

       4.1.1 GCC版本信息 132

       4.1.2 GCC目录结构 132

       4.1.3 GCC执行过程 133

       4.1.4 GCC的基本用法和选项 134

       4.1.5 g++ 134

       4.2 gdb调试器 135

       4.2.1 基本用法和选项 135

       4.2.2 gdb常用命令 135

       4.3 Linux汇编工具 136

       4.3.1 汇编器 136

       4.3.2 链接器 136

       4.3.3 调试器 137

       4.3.4 系统调用 137

       4.3.5 命令行参数 137

       4.3.6 GCC内联汇编 138

       4.4 Linux调试工具 139

       4.4.1 JTAG调试工具 139

       4.4.2 kgdb内核调试环境 144

       4.5 Linux图形开发工具 149

       4.5.1 GUI图形界面开发 149

       4.5.2 GTK图形开发工具 157

       4.5.3 QT图形开发工具 161

       4.6 本章总结 167

       第2篇 Linux驱动程序开发与实例

       第5章 Linux设备驱动基础 170

       5.1 驱动程序基本概念 170

       5.1.1 驱动程序与应用程序的区别 170

       5.1.2 内核版本与编译器的版本依赖 171

       5.2 设备驱动模块概述 171

       5.2.1 模块的基本概念 171

       5.2.2 模块的初始化和退出 172

       5.2.3 Linux内核模块加载 174

       5.3 Linux设备驱动结构分析 176

       5.3.1 内核和用户接口 176

       5.3.2 inode节点 177

       5.3.3 File结构 178

       5.4 常用接口函数介绍 181

       5.5 驱动程序的调试 187

       5.6 本章总结 189

       第6章 网卡驱动程序开发 190

       6.1 网卡概述 190

       6.2 RTL8193网卡驱动 190

       6.2.1 网卡驱动的初始化 191

       6.2.2 网卡数据收发 197

       6.3 典型实例——Ralink无线网卡驱动开发 198

       6.3.1 Ralink无线网卡 198

       6.3.2 802.11无线通信协议的选用 199

       6.3.3 设备驱动关键数据结构 200

       6.3.4 rt2500无线网卡驱动分析 202

       6.3.5 rt2500程序源代码 207

       6.4 本章总结 215

       第7章 显卡驱动程序开发 216

       7.1 显卡驱动概述 216

       7.1.1 Linux framebuffer 216

       7.1.2 帧缓冲设备数据结构 220

       7.2 典型实例——显卡Framebuffer驱动实现 225

       7.2.1 Framebuffer驱动框架程序 225

       7.2.2 NVDIA显卡设备驱动文件 231

       7.3 本章总结 233

       第8章 声卡驱动程序开发 234

       8.1 声卡驱动概述 234

       8.2 OSS声卡驱动 234

       8.3 ALSA声卡驱动 235

       8.4 典型实例——AC97声卡驱动实现 237

       8.4.1 AC97驱动分析 237

       8.4.2 Realtek声卡驱动配置 241

       8.5 本章总结 243

       第9章 USB驱动程序开发 244

       9.1 USB设备驱动概述 244

       9.2 USB驱动设备示例 245

       9.2.1 Linux驱动程序概述 245

       9.2.2 驱动程序分析 246

       9.3 典型实例——单片机的主从通信实例 253

       9.3.1 主从通信介绍 253

       9.3.2 USB设备驱动程序 254

       9.3.3 主机程序源代码 260

       9.4 本章总结 261

       第10章 闪存Flash驱动程序开发 262

       10.1 Flash闪存基础 262

       10.2 Flash MTD技术 264

       10.3 典型实例1——NAND Flash驱动实例 265

       10.3.1 NAND Flash驱动设备 265

       10.3.2 NAND Flash驱动源代码 266

       10.4 典型实例2——NOR Flash驱动实例 270

       10.4.1 芯片驱动与MTD原始设备 270

       10.4.2 NOR Flash驱动分析 270

       10.4.3 NOR Flash驱动源代码 274

       10.5 本章总结 276

       第3篇 Linux系统开发实例

       第11章 嵌入式系统开发的模式与流程 278

       11.1 嵌入式系统的结构 278

       11.1.1 嵌入式系统的硬件架构 278

       11.1.2 嵌入式系统的软件结构 278

       11.2 嵌入式开发的模式及流程 279

       11.2.1 嵌入式系统开发模式 279

       11.2.2 嵌入式系统开发流程 280

       11.3 本章总结 282

       第12章 工业温度监控设备开发实例 283

       12.1 应用环境与硬件设计概要 283

       12.1.1 嵌入式Linux在工业控制领域的应用 283

       12.1.2 工控串行通信协议标准 286

       12.2 相关开发技术——异步串行通信接口 288

       12.2.1 异步串行通信标准 288

       12.2.2 设置串口控制信号 290

       12.2.3 读入串口控制信号 291

       12.2.4 文件Open()系统调用 292

       12.3 实例——基于DS1820的实时温度监控系统 292

       12.3.1 系统基本结构 293

       12.3.2 系统工作流程 296

       12.3.3 系统模块源代码实现 298

       12.4 本章总结 306

       第13章 实时视频采集系统开发实例 307

       13.1 应用环境与硬件设计概要 307

       13.2 相关开发技术 308

       13.2.1 视频图像压缩技术 308

       13.2.2 视频采集驱动 310

       13.2.3 视频驱动加载运行 313

       13.3 实例——基于MV86S02实时视频采集系统设计 313

       13.3.1 系统基本结构 313

       13.3.2 系统工作流程 316

       13.3.3 系统模块源代码实现 319

       13.3.4 视频数据比较及分析 335

       13.4 本章总结 336

       第14章 指纹识别门禁系统开发实例 337

       14.1 应用环境与硬件设计概要 338

       14.2 相关开发技术 340

       14.2.1 指纹识别原理 340

       14.2.2 设备驱动编写框架 344

       14.2.3 指纹芯片驱动 346

       14.3 实例——基于ARM Linux的指纹识别门禁系统 347

       14.3.1 系统基本结构 347

       14.3.2 系统工作流程 349

       14.3.3 系统模块源代码实现 350

       14.4 本章总结 360

       第15章 基于RTL8019的以太网应用系统开发实例 361

       15.1 以太网应用技术概述 361

       15.2 相关开发技术 362

       15.2.1 基于RTL8019的以太网帧传输原理 362

       15.2.2 RTL8019的初始化 363

       15.2.3 RTL8019驱动程序的框架 364

       15.2.4 数据结构和函数 365

       15.2.5 RTL8109驱动程序的加载 368

       15.3 实例——基于RTL8019的以太网应用系统设计 368

       15.3.1 系统基本结构 368

       15.3.2 系统工作流程 371

       15.3.3 系统模块源代码实现 372

       15.3.4 系统调试 380

       15.4 本章总结 381

       第16章 无线网络数据传输系统开发实例 382

       16.1 无线网络传输系统简介 382

       16.2 相关开发技术 383

       16.2.1 无线网络接入技术 383

       16.2.2 基于PCMCIA的无线网卡接口 385

       16.2.3 PCMCIA驱动程序 386

       16.3 实例——基于PCMCIA的

       16.3 无线网络嵌入式前端系统设计 387

       16.3.1 系统基本结构 387

       16.3.2 系统工作流程 389

       16.3.3 系统模块源代码实现 391

       16.3.4 系统调试 398

       16.4 本章总结 398

       第17章 基于PDIUSBD12的数据传输系统实例 399

       17.1 USB应用环境与硬件设计概要 400

       17.2 相关开发技术——USB系统与总线驱动 401

       17.2.1 USB系统组成 401

       17.2.2 USB Host总线驱动 402

       17.2.3 USB Device总线驱动 403

       17.3 实例——基于PDIUSBD12的数据传输设计 406

       17.3.1 系统基本结构 406

       17.3.2 系统工作流程 412

       17.3.3 系统模块源代码实现 412

       17.4 本章总结 424

       第18章 家庭安全监控系统设计实例 425

       18.1 应用环境与硬件设计概要 425

       18.1.1 系统功能和组成 425

       18.1.2 系统模块功能描述 426

       18.2 系统硬件结构 430

       18.2.1 Linux客户端系统硬件结构 430

       18.2.2 传感器系统硬件结构 433

       18.3 系统软件结构 435

       18.3.1 Linux客户端系统软件结构 435

       18.3.2 传感器系统软件结构 438

       18.4 Linux客户端系统设计实现 440

       18.4.1 系统数据结构设计 440

       18.4.2 通信模块设计说明 441

       18.4.3 显示模块设计说明 442

       18.4.4 用户管理模块设计说明 443

       18.4.5 系统设置模块设计说明 445

       18.4.6 客户端主要代码与注释 445

       18.5 系统主要模块设计实现 447

       18.5.1 红外监控模块设计说明 447

       18.5.2 报警模块(warnning) 448

       18.5.3 触发监控模块 449

       18.5.4 管理模块 450

       18.5.5 主要代码与注释 453

       18.6 本章总结 459

       第19章 移动校园系统设计实例 460

       19.1 应用环境与硬件设计概要 460

       19.1.1 系统功能和组成 460

       19.1.2 系统模块功能和软件图 460

       19.2 系统硬件结构 462

       19.3 系统软件结构 463

       19.3.1 软件整体结构 463

       19.3.2 软件模块结构 464

       19.3.3 接口设计 467

       19.3.4 运行过程设计 468

       19.3.5 系统数据结构设计 469

       19.3.6 搭建开发环境 470

       19.4 系统模块程序代码 472

       19.4.1 主函数 472

       19.4.2 Syllabus课表模块 472

       19.4.3 BBS论坛模块 474

       19.4.4 Map地图模块 476

       19.4.5 Message系统消息模块 478

       19.5 本章总结 478

嵌入式工程师都学什么课程

       嵌入式系统开发就是对于除了电脑之外的所有电子设备上操作系统的开发,开发对象有手机,掌上电脑,机电系统等。

       嵌入式系统开发流程:

       第一步:建立开发环境

       操作系统一般使用Redhat Linux,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(比如,arm-linux-g、arm-uclibc-g),或者安装产品厂家提供的相关交叉编译器;

       第二步:配置开发主机

       配置MINICOM,一般的参数为波特率115200 Baud/s,数据位8位,停止位为1,9,无奇偶校验,软件硬件流控设为无。在Windows下的超级终端的配置也是这样。MINICOM软件的作用是作为调试嵌入式开发板的信息输出的监视器和键盘输入的工具。配置网络主要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。

       第三步:建立引导装载程序BOOTLOADER

       从网络上下载一些公开源代码的BOOTLOADER,如U.BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如,三星的ARV17、ARM9系列芯片,这样就需要编写开发板上FLASH的烧写程序,可以在网上下载相应的烧写程序,也有Linux下的公开源代码的J-FLASH程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是让系统可以正常运行的第一步。如果用户购买了厂家的仿真器比较容易烧写FLASH,虽然无法了解其中的核心技术,但对于需要迅速开发自己的应用的人来说可以极大提高开发速度。

       第四步:下载已经移植好的Linux操作系统

       如MCLiunx、ARM-Linux、PPC-Linux等,如果有专门针对所使用的CPU移植好的Linux操作系统那是再好不过,下载后再添加特定硬件的驱动程序,然后进行调试修改,对于带MMU的CPU可以使用模块方式调试驱动,而对于MCLiunx这样的系统只能编译内核进行调试。

       第五步:建立根文件系统

       下载使用BUSYBOX软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。由于默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等,自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs genromfs等工具产生烧写映像文件。

       第六步:建立应用程序的FLASH磁盘分区

       一般使用JFFS2或YAFFS文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性FLASH(NOR型)512KB~32MB,有的系统使用非线性FLASH(NAND型)8MB~512MB,有的两个同时使用,需要根据应用规划FLASH的分区方案。

       第七步:开发应用程序

       可以放入根文件系统中,也可以放入YAFFS、JFFS2文件系统中,有的应用不使用根文件系统,直接将应用程序和内核设计在一起,这有点类似于μC/OS-II的方式。

       第八步:烧写内核

       根文件系统和应用程序,发布产品。

嵌入式系统Linux内核开发实战指南的前言(序)

       嵌入式开发班课程体系

       一. Linux 开发基础

       第一讲: Linux 系统入门基础

       第二讲: Linux 程序设计基础 -C 环境

       第三讲: Linux Shell 编程

       第四讲:任务管理、同步与通信

       第五讲:嵌入式 Linux 下的串口通信

       第六讲:嵌入式 Linux 网络编程

       二. 嵌入式 Linux 的构建及应用开发

       第一讲:构建嵌入式 Linux 系统

       第二讲:嵌入式 BootLoader 技术

       第三讲: ARM-Linux 内核原理

       第四讲: ARM-Linux 移植技术

       第五讲:嵌入式 GUI

       第六讲:嵌入式数据库

       三. 嵌入式系统接口设计与 Linux 驱动程序

       第一讲: Linux 系统驱动概述

       第二讲:字符设备驱动程序

       第三讲:块设备驱动程序

       第四讲:一个双色 LED 的 Linux 驱动程序设计

       第五讲:触摸屏接口设计与 Linux 驱动程序

       第六讲: PS/2 接口设计与 Linux 键盘/鼠标驱动程序

       第七讲:异步串口与 Linux 驱动程序

       第八讲:显示接口与 Linux 帧缓冲

       课程目标:

       1、 培养 Linux 高端人才

       2、 掌握 Linux 原理的开发工具 GCC 与 GDB 的使用

       3、 掌握嵌入式 Linux 应用开发

       4、学会如何建立嵌入式 Linux 系统平台

       5、掌握 Linux 内核裁减与移植 6、 掌握 Linux 下设备驱动设计方法

       培训资料:提供全套嵌入式系统课程教学教学资料,包括:

       1、 授课用 PPT 讲稿

       2、 全部实验源代码光盘

       3、 设计型实验案例源代码

       4、综合实验案例源代码

       2007年8月,我从上家公司辞职出来,放弃了刚上市公司骨干中层干部的职位,放弃了丰厚的待遇。

       自1996年毕业以来,我一直从事嵌入式系统和Linux内核一线技术开发工作,我所承担的任务和项目基本都是由自己独立完成,即使担任了硬件部主管或技术总监职务,我对自己专长的工作仍是亲历亲为的。一方面,自己热爱这项工作,每攻克一个难题都能体验到莫大的成就感(相信技术工程师都有过这种体会);另一方面,目前国内做嵌入式系统和Linux内核开发的工程师供不应求,水平高的更是奇缺,相关职位的待遇相对其他职位的偏高,少招一个新员工就为公司节省一笔开支,减轻一份负担,所以对于比较简单和事务性的工作我会安排给其他员工,而难度大的工作我几乎都亲自上阵。我习惯加班,来了兴致甚至通宵达旦,凭着这股干劲,经过多年实践积累,自己常能在短时间内解决很多人长时间没有解决的问题。在我工作中接触到Linux之初,为了更好更深入地学习嵌入式系统和Linux内核开发技能,我在业余时间自己花钱设计制作了MC68VZ328和S3C4510两种开发板以及简易JTAG下载、烧写线缆,并成功移植、固化?Clinux到这两个开发板上——到目前为止,我已经在当今流行的各种嵌入式硬件平台(包括单片机、MC68K、PowerPC、ARM、MIPS、DSP)和嵌入式操作系统(包括VRTX、VxWorks、PSOS、Linux)上都做过实际开发工作,编写、移植或者调试过UART、Ethernet、I2C、HDLC+E1、LCD、Keyboard、VFD、SCSI、SATA、IDE、CVBS、VGA、PCI、USB等接口和设备的驱动程序。

       在与Linux打交道的这么多年里,我一心想把这个开放源码的优秀操作系统吃透,并理所当然地觉得,随着时间的推移和所做项目的增多,自己一定会逐渐认识Linux内核的真实面目;可是一直以来,每当我想在脑海中对Linux内核各组件及其原理进行全面系统概括描述时却总是如鲠在喉,不得其解,这让我心里一直潜藏着一丝隐忧和茫然:由于不了解Linux内核原理,尽管自己能凭借10多年的工作经验通过适当方法很快把任务完成、把难题解决,但却不能在碰到难题一开始就从原理上把握应该从哪儿下手,怎样做、做什么,缺乏全局预见性和高瞻远瞩的能力,这种心中“没底”的感觉驱使我去更深入钻研、发掘,去力争做到心中“有底”;这也让我意识到,虽然经过10多年的勤奋工作,自己已经积累了足够的工作经验,不过由于平时很少阅读理论书籍和Linux内核源代码,Linux内核原理知识并没有像我原来想象的那样自然而然地装进自己的大脑,所以自己的理论水平仍然很欠缺,要想提高就必须经过一个艰苦的沉淀过程;由于平时工作忙、任务紧,我很少有时间来做系统的总结和归纳,在这种情况下,出于对公司和自己负责任考虑,我决定辞去工作,在家专心、系统研读Linux内核源代码,同时也对自己10多年的工作进行一次全面概括和总结。

       我花了半年多时间阅读针对ARM处理器平台的Linux 2.6.10内核源代码,记了2000多页的源代码阅读笔记和心得。2008年4月,我在家坐不住想去找工作——辞职前,我常开车去兜风或带家人郊游,辞职后不久,为了节省支出,我把车卖了,这半年多时间里,我除了早晨出去锻炼外,一天难得出门,没有娱乐,没有朋友交流,没有旅游,这对于一个身处物欲横流的繁华都市闹市区的人来说会是一种怎样的生活体验呢?更何况对于英俊潇洒、才华横溢、热情好动的本人呢(?)——于是我在脑海中总结半年多来的学习成果和收获,虽然感觉眼前比以前亮堂了许多,但仍是朦朦胧胧,似是而非,不得已只好强迫自己继续坐下去。我把以前的工作笔记、工作总结、自制的开发板全部找出来,又买了几本介绍Linux内核原理、驱动程序编写方面的理论书籍,把所有这些与半年多来阅读Linux 2.6内核源代码的笔记和心得进行交叉学习,相互印证,加深理解,同时对这些资料再次进行总结、归纳、记笔记、写心得;到2008年6月,当我再次回头清理头绪,翻看新的笔记时,顿然感觉Linux 2.6内核的轮廓渐渐清晰起来,我很兴奋并突发想象:何不将新的笔记、心得整理完善一下,那样不就可以编辑成一本介绍嵌入式系统硬件原理及软硬件设计流程与方法、嵌入式Linux内核原理及开发方法与技能、常见设备工作原理及其驱动程序的编写方法的完整的书了?联想到现在越来越多的年轻人开始热衷于嵌入式系统Linux内核开发这项高科技、高薪工作,却苦于找不到一本从实战出发全面深入介绍这方面技术的指导书,他们有的不惜花重金去参加培训,可是当这些培训后的部分人到我那面试时,我却发现他们所学甚浅,不懂原理,只知道操作流程,有的甚至连基本的流程都不熟悉;加上以前在一些嵌入式系统和Linux论坛中看到很多网友呼吁有经验的开发人员把自己的工作经验总结一下写出来供大家参考,这更让我有了写这本书的冲动。于是我又耐心坐了3个多月,继续总结、归纳、提炼、整理、完善,到了2008年9月,原来的笔记和心得就浓缩成了《嵌入式系统Linux内核开发实战指南(ARM平台)》,我也实现了一次自我超越,从“摸着石头过河”的尴尬与无奈走向了“不管风吹浪打,胜似闲庭信步”的潇洒与从容!

       好了,关于“嵌入式系统接口设计与linux驱动程序开发”的话题就讲到这里了。希望大家能够通过我的讲解对“嵌入式系统接口设计与linux驱动程序开发”有更全面、深入的了解,并且能够在今后的工作中更好地运用所学知识。

热门文章