
| 何永琪:1962年8月出生,1996年获得丹麦技术大学(Technical University Of Denmark)博士学位,现任北京大学电子学系教授、博士生导师。长期从事光纤通信、无线通信和宽带接入领域的研究,已完成国家973计划、国家863计划、国家自然科学基金等项目十余项,发表学术论文二十余篇。 |
| 第1部分 嵌入式开发基础 1 第1章 引言 2 1.1 嵌入式产业概况 2 1.2 Linux 操作系统 5 1.3 ARM 体系概况 8 1.3.1 ARM7 10 1.3.2 ARM9 11 1.3.3 ARM9E 11 1.3.4 ARM10E 12 1.3.5 ARM11 12 1.3.6 Cortex 12 1.4 常见嵌入式产品及其基本平台简介 13 1.4.1 学习开发板 13 1.4.2 行业终端 16 1.4.3 工业控制 18 1.4.4 手持娱乐 19 1.4.5 医疗仪器 21 1.4.6 汽车电子 22 1.4.7 智能本 23 1.5 嵌入式产品开发基本流程 25 第2章 C语言编程要点 28 2.1 数据类型 28 2.2 常数 29 2.3 变量 31 2.3.1 变量的定义与初始化 31 2.3.2 变量的访问 31 2.3.3 左值与右值 31 2.3.4 只读变量 32 2.4 操作符 32 2.4.1 只读操作符 32 2.4.2 读写操作符 34 2.4.3 类型转换操作符 35 2.4.4 sizeof操作符 36 2.5 表达式和语句 36 2.5.1 表达式 36 2.5.2 语句 37 2.6 复合类型 38 2.6.1 数组 38 2.6.2 结构体 40 2.6.3 位域 42 2.6.4 数据的对齐 43 2.6.5 联合体 44 2.6.6 类型嵌套 44 2.6.7 类型别名 45 2.6.8 枚举类型 46 2.7 流程控制 46 2.7.1 顺序结构 46 2.7.2 分支结构 47 2.7.3 隐含的分支结构 49 2.7.4 循环结构 49 2.7.5 goto 52 2.8 函数 52 2.8.1 声明与定义 52 2.8.2 函数的调用与传值方式 54 2.8.3 函数与复合类型 55 2.8.4 内联函数 56 2.8.5 变量的作用范围与生存期 56 2.9 指针 59 2.9.1 指针与变量 59 2.9.2 指针与操作符 62 2.9.3 指针与数组 63 2.9.4 字符串 64 2.9.5 指针与结构体 65 2.9.6 指针与函数 66 2.9.7 回调函数 69 2.9.8 函数指针类型转换 70 2.10 预处理语句 71 2.10.1 文件包含 71 2.10.2 宏定义 71 2.10.3 宏与函数 73 2.10.4 代码分支 74 第3章 开发环境 76 3.1 Linux 使用基础 76 3.1.1 命令参数与选项 77 3.1.2 文件、目录和路径 77 3.1.3 用户与权限 78 3.1.4 硬链接与符号链接 78 3.1.5 命令使用技巧 79 3.2 Linux 常用命令 79 3.2.1 查阅手册 80 3.2.2 文件相关 81 3.2.3 文件内容相关 84 3.2.4 压缩与解压缩 86 3.2.5 文件系统与磁盘 88 3.2.6 用户与权限 89 3.2.7 进程管理 91 3.2.8 系统信息 92 3.2.9 网络 93 3.3 Shell 使用进阶 96 3.3.1 重定向 96 3.3.2 管道 98 3.3.3 变量与替换 98 3.3.4 环境变量 100 3.3.5 脚本 101 3.3.6 脚本编程 102 3.3.7 作业管理 103 3.4 Debian 5.0 的安装与使用 104 3.4.1 安装 Debian 5.0 105 3.4.2 Debian 5.0 的基本操作 105 3.4.3 常用软件的安装与使用 108 3.4.4 从源码安装软件 113 3.4.5 安装编译环境 115 3.5 建立交叉编译环境 117 3.5.1 下载安装 117 3.5.2 从源码编译安装 117 3.6 vi 编辑器 121 3.6.1 vi 的工作模式 121 3.6.2 普通模式 122 3.6.3 命令行模式 123 3.6.4 寄存器 124 3.6.5 与编程有关的技巧 124 3.7 gcc 工具链 124 3.7.1 编译过程 124 3.7.2 gcc 用法 125 3.8 make 与 Makefile 127 3.8.1 make 工具的使用 127 3.8.2 Makefile 128 3.9 gdb 调试工具 130 3.9.1 调试本地程序 130 3.9.2 远程调试 131 3.10 buildroot 开发工具 132 第2部分 ARM架构与编程 135 第4章 ARM处理器架构与编程模型 136 4.1 嵌入式硬件系统 137 4.1.1 嵌入式系统架构 137 4.1.2 S3C2410A 地址映射 138 4.1.3 HY2410A 开发板硬件配置 139 4.2 ARM 架构概述 139 4.2.1 ARM 处理器模式与寄存器组 139 4.2.2 ARM 异常与异常向量表 142 4.2.3 程序状态寄存器 143 4.2.4 大端与小端存储格式 145 4.3 ARM 指令集概述 146 4.3.1 ARM 汇编指令格式 146 4.3.2 数据处理指令 148 4.3.3 存储器访问指令 150 4.3.4 分支指令 152 4.3.5 软中断指令 153 4.3.6 程序状态寄存器传送指令 154 4.3.7 乘法指令 154 4.3.8 协处理器指令 155 4.3.9 伪指令 157 4.4 GNU ARM 汇编 158 4.4.1 基本语法 158 4.4.2 GNU ARM 汇编伪指令 159 4.5 汇编与 C 语言 163 4.5.1 程序及其二进制映像 163 4.5.2 程序的编译与运行 164 4.5.3 ATPCS 约定 165 4.5.4 汇编与 C 语言的对照 167 4.5.5 函数调用与栈 172 4.5.6 堆的概念 175 4.6 汇编与 C 语言混合编程 175 4.6.1 C 语言调用汇编函数 175 4.6.2 汇编语言中使用 C 全局变量 176 4.6.3 内嵌汇编 177 第5章 搭建嵌入式固件开发平台 181 5.1 硬件设备与软件环境 181 5.2 搭建开发环境 182 5.2.1 硬件连接 182 5.2.2 使用终端软件 183 5.2.3 下载和执行程序 184 5.3 创建固件程序 186 第6章 S3C2410接口与编程 189 6.1 软中断异常编程 189 6.1.1 软中断异常入口 189 6.1.2 软中断异常应用例程 190 6.2 中断控制器及外部中断编程 193 6.2.1 中断体系结构 193 6.2.2 中断控制器 194 6.2.3 中断源安排 194 6.2.4 中断控制器寄存器配置 196 6.2.5 中断应用例程 197 6.3 定时器及其编程 201 6.3.1 定时器体系 201 6.3.2 定时器单元工作原理 202 6.3.3 定时器寄存器配置 203 6.3.4 定时器应用例程 205 6.4 GPIO 接口 209 6.5 UART 控制器及串口通信应用 211 6.5.1 UART 通信原理 211 6.5.2 RS-232C 串行接口标准 212 6.5.3 UART 控制寄存器 213 6.5.4 串口通信应用例程 217 6.6 NAND Flash 芯片与控制器 219 6.6.1 NAND Flash 的访问 220 6.6.2 NAND Flash 控制器 222 6.6.3 NAND Flash 控制器编程实例 223 第7章 U-boot源码分析与移植 227 7.1 bootloader 的概念 227 7.1.1 bootloader 的启动过程 228 7.1.2 bootloader 的操作模式 228 7.1.3 ARM bootloader 的特点 229 7.2 使用 U-boot 230 7.2.1 U-boot 主要命令与环境变量 230 7.2.2 使用实例 232 7.3 U-boot 源码分析 233 7.3.1 总体架构与内存布局 233 7.3.2 源码目录 234 7.3.3 实现分析 235 7.4 U-boot 移植 244 7.4.1 源码修改 244 7.4.2 配置和编译 257 第3部分 Linux系统编程 259 第8章 Linux系统编程基础 260 8.1 系统调用与 API 260 8.2 程序的生成与执行 262 8.3 API 的错误处理 263 8.4 命令行参数与环境变量 263 第9章 Linux文件系统编程 266 9.1 文件的概念 266 9.2 文件描述符与索引节点 267 9.3 文件操作的系统调用接口 268 9.3.1 打开文件 268 9.3.2 从文件读取数据 270 9.3.3 写数据到文件 272 9.3.4 发送控制命令 273 9.3.5 关闭文件 274 9.4 标准 I/O 函数库 275 9.4.1 fopen 276 9.4.2 fread 和 fwrite 276 9.4.3 fclose 277 9.4.4 fflush 277 9.4.5 fseek 和 ftell 277 9.4.6 fgetc,getc 和 getchar 278 9.4.7 fputc,putc 和 putchar 278 9.4.8 fgets 和 gets 279 9.4.9 fputs 和 puts 280 9.4.10 fprintf,printf 和 sprintf 280 9.4.11 fscanf,scanf 和 sscanf 282 9.4.12 标准 I/O 错误处理 284 第10章 深入理解进程 285 10.1 Linux 中的进程 285 10.1.1 创建进程 286 10.1.2 执行程序 287 10.1.3 进程的内存布局 288 10.1.4 进程的状态迁移 290 10.1.5 进程的终止 290 10.2 进程与信号 291 10.2.1 Linux 中的信号处理机制 292 10.2.2 发送信号 293 10.2.3 捕捉信号 295 10.2.4 屏蔽信号 299 10.2.5 信号安全函数 301 10.3 进程与文件 302 10.3.1 内核文件管理 302 10.3.2 进程中的文件 303 10.3.3 文件的重定向 306 10.3.4 文件控制 307 10.4 进程间通信 308 10.4.1 Linux 中的 IPC 309 10.4.2 信号灯与进程同步 310 10.4.3 管道 313 10.4.4 命名管道 314 10.4.5 共享内存 317 10.4.6 消息队列 321 第11章 socket编程 326 11.1 网络协议层次模型 326 11.2 socket 编程接口 327 11.2.1 打开 socket 327 11.2.2 socket 地址 329 11.2.3 网络字节序 330 11.2.4 socket 与地址的绑定 331 11.2.5 侦听 331 11.2.6 接受连接请求 332 11.2.7 连接 332 11.2.8 关闭和切断连接 333 11.2.9 发送数据 333 11.2.10 接收数据 334 11.2.11 使用 socket 选项 335 11.2.12 阻塞与非阻塞操作 337 11.2.13 可靠的发送与接收操作 338 11.2.14 多路复用 339 11.3 socket 编程实例 340 11.3.1 TCP 与 UDP 程序流程 340 11.3.2 TCP 通信例程 340 11.3.3 多进程并发服务器应用 343 11.3.4 多路复用服务器应用 349 11.3.5 UDP 服务器应用 354 第12章 多线程并发程序设计 358 12.1 线程的概念 358 12.2 线程编程接口 358 12.2.1 线程的创建与退出 359 12.2.2 线程属性 359 12.2.3 线程的分离状态 361 12.2.4 线程应用实例 361 12.3 线程的同步 362 12.3.1 使用信号灯进行线程同步 363 12.3.2 使用互斥体 368 12.3.3 使用条件变量 371 12.4 多线程并发程序设计 375 12.4.1 多线程并发服务器应用 375 12.4.2 消费者/生产者模型 381 12.4.3 线程池应用 382 第4部分 内核与驱动编程 389 第13章 内核编程初步 390 13.1 从用户态到内核态 390 13.1.1 实模式与保护模式 390 13.1.2 用户态与内核态 391 13.1.3 内核编程的特点 391 13.1.4 内核模块与驱动 392 13.2 内核模块编程 393 13.2.1 编写源码 393 13.2.2 printk 函数 394 13.2.3 编译内核模块 396 13.2.4 加载与卸载 397 13.2.5 模块参数 397 13.3 字符设备驱动 399 13.3.1 设备文件与设备号 399 13.3.2 字符设备编程接口 400 13.3.3 文件操作 404 13.3.4 访问用户态内存 408 13.3.5 动态分配内存 409 13.3.6 内存操作 409 13.3.7 字符设备驱动例程 415 第14章 内核编程接口 421 14.1 双向环形链表 421 14.1.1 定义与初始化 421 14.1.2 链表操作 422 14.1.3 链表的使用 424 14.2 等待与延时 426 14.2.1 调度与抢占 426 14.2.2 进程运行状态 428 14.2.3 定时 429 14.2.4 等待队列 429 14.2.5 阻塞与非阻塞操作 432 14.2.6 延时 433 14.2.7 等待队列例程 434 14.3 定时器与延期工作 440 14.3.1 定时器 440 14.3.2 tasklet 444 14.3.3 工作队列 446 14.3.4 定时器例程 451 14.4 自旋锁与同步 455 14.4.1 并发与竞态 455 14.4.2 自旋锁 456 14.4.3 原子上下文 460 14.4.4 读写锁 462 14.4.5 原子类型 464 14.4.6 比特位操作 467 14.4.7 互斥体 468 14.4.8 信号灯 470 14.4.9 读写信号灯 472 14.5 端口 IO 和内存映射 IO 473 14.5.1 端口 IO 474 14.5.2 内存映射 IO 477 14.5.3 内存屏障 482 14.6 中断 483 14.6.1 申请和释放中断 483 14.6.2 中断处理函数 484 14.6.3 中断的禁止和使能 485 14.6.4 线程化中断 486 14.6.5 共享中断 486 第15章 Linux 2.6设备模型 488 15.1 对象与集合 488 15.1.1 引用计数 488 15.1.2 内核对象 489 15.1.3 内核对象的类型 492 15.1.4 内核集合 496 15.1.5 内核集合与对象例程 500 15.2 设备管理 504 15.2.1 设备 504 15.2.2 错误码与指针 507 15.2.3 驱动 507 15.2.4 总线 508 15.2.5 类别 510 15.2.6 接口 512 15.3 常见总线与类别 513 15.3.1 platform 总线 513 15.3.2 misc 类别 516 第16章 Linux驱动实例详解 518 16.1 输入设备驱动 518 16.1.1 输入设备编程接口 519 16.1.2 触摸屏驱动例程 523 16.2 USB 驱动 532 16.2.1 USB 概述 533 16.2.2 USB 驱动模型 534 16.2.3 USB 驱动编程接口 535 16.2.4 USB 接口与端点 537 16.2.5 USB 类别 540 16.2.6 URB 541 16.2.7 同步传输接口 546 16.2.8 USB 锚 547 16.2.9 USB 驱动范例分析 549 第5部分 嵌入式Linux系统构建 559 第17章 Linux内核构建 560 17.1 内核编译过程 560 17.2 内核配置系统架构 562 17.2.1 内核 Makefile 562 17.2.2 KBuild 配置系统 566 17.3 增加代码到内核 572 17.4 内核配置简介 573 17.5 启动内核 575 第18章 根文件系统构建 576 18.1 init 进程 576 18.2 创建根文件系统 578 18.2.1 创建目录 578 18.2.2 创建设备文件 579 18.2.3 安装共享库 579 18.2.4 安装 busybox 580 18.2.5 创建配置文件 582 18.3 挂载根文件系统 583 18.3.1 使用网络文件系统 583 18.3.2 使用 Flash 文件系统 584 第6部分 应用编程 587 第19章 C++语言编程要点 588 19.1 布尔型数据 588 19.2 引用 588 19.3 类和对象 590 19.3.1 类和对象的定义 590 19.3.2 构造与析构 590 19.3.3 类的实现 591 19.3.4 访问对象 592 19.3.5 this 指针 592 19.3.6 new 和 delete 593 19.3.7 静态成员 594 19.3.8 只读成员 594 19.3.9 复制构造函数 595 19.3.10 友元 596 19.4 类的继承 597 19.4.1 继承的语法 597 19.4.2 继承方式 597 19.4.3 多重继承 598 19.5 函数和操作符重载 598 19.5.1 函数重载 599 19.5.2 操作符重载 601 19.6 覆盖与虚函数 604 19.6.1 覆盖 604 19.6.2 虚函数和多态 604 19.6.3 虚函数的实现 606 19.6.4 纯虚函数与抽象类 606 19.7 名字空间 607 19.8 模板 608 19.8.1 模板函数 608 19.8.2 模板类 609 19.9 异常处理 609 19.10 C 与 C++ 混合编程 611 第20章 嵌入式GUI编程 612 20.1 建立开发环境 612 20.2 简单的 Qt 应用程序 614 20.2.1 编写源代码 615 20.2.2 编译 615 20.2.3 工程文件 616 20.2.4 运行 617 20.2.5 移植到目标机 618 20.3 窗口布局 619 20.3.1 水平布局与垂直布局 619 20.3.2 栅格布局 622 20.4 Qt 对象 623 20.4.1 层次化管理 624 20.4.2 信号与槽 625 20.4.3 事件 628 20.4.4 定时器 631 20.5 使用 designer 633 20.5.1 窗体设计 633 20.5.2 代码编写 635 20.5.3 运行结果 639 20.6 Qt 常用类 640 20.6.1 QChar 640 20.6.2 QString 641 20.6.3 QPoint 647 20.6.4 QSize 648 20.6.5 QRect 649 20.6.6 QFont 650 20.6.7 QPixmap 651 20.6.8 QIcon 652 20.6.9 QWidget 654 20.6.10 QDialog 662 20.6.11 QLabel 664 20.6.12 QAbstractButton 665 20.6.13 QPushButton 667 20.6.14 QCheckBox 667 20.6.15 QRadioButton 668 20.6.16 QLineEdit 669 20.7 Qt 综合应用 670 20.7.1 软件设计 670 20.7.2 源码实现 673 20.7.3 运行结果 680 20.7.4 Qt 国际化编程 680 第21章 嵌入式数据库编程 684 21.1 基本 SQL 语句 684 21.1.1 数据库与表 684 21.1.2 创建和删除表 685 21.1.3 插入、修改及删除记录 685 21.1.4 条件表达式 686 21.1.5 数据库查询 687 21.2 建立 SQLite3 开发平台 688 21.3 SQLite3 编程接口 689 21.3.1 打开和关闭数据库 689 21.3.2 执行 SQL 语句 690 21.3.3 查询数据库 691 21.4 使用 SQLite3 工具 691 21.5 SQLite3 数据库应用实例 692 21.5.1 使用 sqlite3_exec 查询数据库 693 21.5.2 使用 sqlite3_get_table 查询数据库 694 第22章 产品开发实例:无线信息终端 696 22.1 总体架构 696 22.2 硬件设计 697 22.3 软件设计 698 22.3.1 总体框架 698 22.3.2 协议报文格式 699 22.4 应用软件 701 22.4.1 GUI 应用模块 701 22.4.2 通信协议模块 705 22.4.3 业务功能模块 710 22.4.4 使用多线程读取设备 713 22.4.5 模块集成 714 附录A 缩略语 716 |
商品评论(0条)