展开全部

主编推荐语

一本专门为嵌入式读者打造的C语言进阶学习图书。

内容简介

本书的学习重点不再是C语言的基本语法,而是和嵌入式、C语言相关的一系列知识。

作者以C语言为切入点,分别探讨了嵌入式开发所需要的诸多核心理论和技能,力图帮助读者从零搭建嵌入式开发所需要的完整知识体系和技能树。

本书从底层CPU的制造流程和工作原理开始讲起,到计算机体系结构,C程序的反汇编分析,程序的编译、运行和重定位,程序运行时的堆栈内存动态变化。

目录

  • 版权信息
  • 内容简介
  • 前言
  • 第1章 工欲善其事,必先利其器
  • 1.1 代码编辑工具:Vim
  • 1.1.1 安装Vim
  • 1.1.2 Vim常用命令
  • 1.1.3 Vim配置文件:vimrc
  • 1.1.4 Vim的按键映射
  • 1.2 程序编译工具:make
  • 1.2.1 使用IDE编译C程序
  • 1.2.2 使用gcc编译C源程序
  • 1.2.3 使用make编译程序
  • 1.3 代码管理工具:Git
  • 1.3.1 什么是版本控制系统
  • 1.3.2 Git的安装和配置
  • 1.3.3 Git常用命令
  • 第2章 计算机体系结构与CPU工作原理
  • 2.1 一颗芯片是怎样诞生的
  • 2.1.1 从沙子到单晶硅
  • 2.1.2 PN结的工作原理
  • 2.1.3 从PN结到芯片电路
  • 2.1.4 芯片的封装
  • 2.2 一颗CPU是怎么设计出来的
  • 2.2.1 计算机理论基石:图灵机
  • 2.2.2 CPU内部结构及工作原理
  • 2.2.3 CPU设计流程
  • 2.3 计算机体系结构
  • 2.3.1 冯·诺依曼架构
  • 2.3.2 哈弗架构
  • 2.3.3 混合架构
  • 2.4 CPU性能提升:Cache机制
  • 2.4.1 Cache的工作原理
  • 2.4.2 一级Cache和二级Cache
  • 2.4.3 为什么有些处理器没有Cache
  • 2.5 CPU性能提升:流水线
  • 2.5.1 流水线工作原理
  • 2.5.2 超流水线技术
  • 2.5.3 流水线冒险
  • 2.5.4 分支预测
  • 2.5.5 乱序执行
  • 2.5.6 SIMD和NEON
  • 2.5.7 单发射和多发射
  • 2.6 多核CPU
  • 2.6.1 单核处理器的瓶颈
  • 2.6.2 片上多核互连技术
  • 2.6.3 big.LITTLE结构
  • 2.6.4 超线程技术
  • 2.6.5 CPU核数越多越好吗
  • 2.7 后摩尔时代:异构计算的崛起
  • 2.7.1 什么是异构计算
  • 2.7.2 GPU
  • 2.7.3 DSP
  • 2.7.4 FPGA
  • 2.7.5 TPU
  • 2.7.6 NPU
  • 2.7.7 后摩尔时代的XPU们
  • 2.8 总线与地址
  • 2.8.1 地址的本质
  • 2.8.2 总线的概念
  • 2.8.3 总线编址方式
  • 2.9 指令集与微架构
  • 2.9.1 什么是指令集
  • 2.9.2 什么是微架构
  • 2.9.3 指令助记符:汇编语言
  • 第3章 ARM体系结构与汇编语言
  • 3.1 ARM体系结构
  • 3.2 ARM汇编指令
  • 3.2.1 存储访问指令
  • 3.2.2 数据传送指令
  • 3.2.3 算术逻辑运算指令
  • 3.2.4 操作数:operand2详解
  • 3.2.5 比较指令
  • 3.2.6 条件执行指令
  • 3.2.7 跳转指令
  • 3.3 ARM寻址方式
  • 3.3.1 寄存器寻址
  • 3.3.2 立即数寻址
  • 3.3.3 寄存器偏移寻址
  • 3.3.4 寄存器间接寻址
  • 3.3.5 基址寻址
  • 3.3.6 多寄存器寻址
  • 3.3.7 相对寻址
  • 3.4 ARM伪指令
  • 3.4.1 LDR伪指令
  • 3.4.2 ADR伪指令
  • 3.5 ARM汇编程序设计
  • 3.5.1 ARM汇编程序格式
  • 3.5.2 符号与标号
  • 3.5.3 伪操作
  • 3.6 C语言和汇编语言混合编程
  • 3.6.1 ATPCS规则
  • 3.6.2 在C程序中内嵌汇编代码
  • 3.6.3 在汇编程序中调用C程序
  • 3.7 GNU ARM汇编语言
  • 3.7.1 重新认识编译器
  • 3.7.2 GNU ARM编译器的伪操作
  • 3.7.3 GNU ARM汇编语言中的标号
  • 3.7.4 .section伪操作
  • 3.7.5 基本数据格式
  • 3.7.6 数据定义
  • 3.7.7 汇编代码分析实战
  • 第4章 程序的编译、链接、安装和运行
  • 4.1 从源程序到二进制文件
  • 4.2 预处理过程
  • 4.3 程序的编译
  • 4.3.1 从C文件到汇编文件
  • 4.3.2 汇编过程
  • 4.3.3 符号表与重定位表
  • 4.4 链接过程
  • 4.4.1 分段组装
  • 4.4.2 符号决议
  • 4.4.3 重定位
  • 4.5 程序的安装
  • 4.5.1 程序安装的本质
  • 4.5.2 在Linux下制作软件安装包
  • 4.5.3 使用apt-get在线安装软件
  • 4.5.4 在Windows下制作软件安装包
  • 4.6 程序的运行
  • 4.6.1 操作系统环境下的程序运行
  • 4.6.2 裸机环境下的程序运行
  • 4.6.3 程序入口main()函数分析
  • 4.6.4 BSS段的小秘密
  • 4.7 链接静态库
  • 4.8 动态链接
  • 4.8.1 与地址无关的代码
  • 4.8.2 全局偏移表
  • 4.8.3 延迟绑定
  • 4.8.4 共享库
  • 4.9 插件的工作原理
  • 4.10 Linux内核模块运行机制
  • 4.11 Linux内核编译和启动分析
  • 4.12 U-boot重定位分析
  • 4.13 常用的binutils工具集
  • 第5章 内存堆栈管理
  • 5.1 程序运行的“马甲”:进程
  • 5.2 Linux环境下的内存管理
  • 5.3 栈的管理
  • 5.3.1 栈的初始化
  • 5.3.2 函数调用
  • 5.3.3 参数传递
  • 5.3.4 形参与实参
  • 5.3.5 栈与作用域
  • 5.3.6 栈溢出攻击原理
  • 5.4 堆内存管理
  • 5.4.1 裸机环境下的堆内存管理
  • 5.4.2 uC/OS的堆内存管理
  • 5.4.3 Linux堆内存管理
  • 5.4.4 堆内存测试程序
  • 5.4.5 实现自己的堆管理器
  • 5.5 mmap映射区域探秘
  • 5.5.1 将文件映射到内存
  • 5.5.2 mmap映射实现机制分析
  • 5.5.3 把设备映射到内存
  • 5.5.4 多进程共享动态库
  • 5.6 内存泄漏与防范
  • 5.6.1 一个内存泄漏的例子
  • 5.6.2 预防内存泄漏
  • 5.6.3 内存泄漏检测:MTrace
  • 5.6.4 广义上的内存泄漏
  • 5.7 常见的内存错误及检测
  • 5.7.1 总有一个Bug,让你泪流满面
  • 5.7.2 使用core dump调试段错误
  • 5.7.3 什么是内存踩踏
  • 5.7.4 内存踩踏监测:mprotect
  • 5.7.5 内存检测神器:Valgrind
  • 第6章 GNU C编译器扩展语法精讲
  • 6.1 C语言标准和编译器
  • 6.1.1 什么是C语言标准
  • 6.1.2 C语言标准的内容
  • 6.1.3 C语言标准的发展过程
  • 6.1.4 编译器对C语言标准的支持
  • 6.1.5 编译器对C语言标准的扩展
  • 6.2 指定初始化
  • 6.2.1 指定初始化数组元素
  • 6.2.2 指定初始化结构体成员
  • 6.2.3 Linux内核驱动注册
  • 6.2.4 指定初始化的好处
  • 6.3 宏构造“利器”:语句表达式
  • 6.3.1 表达式、语句和代码块
  • 6.3.2 语句表达式
  • 6.3.3 在宏定义中使用语句表达式
  • 6.3.4 内核中的语句表达式
  • 6.4 typeof与container_of宏
  • 6.4.1 typeof关键字
  • 6.4.2 typeof使用示例
  • 6.4.3 Linux内核中的container_of宏
  • 6.4.4 container_of宏实现分析
  • 6.5 零长度数组
  • 6.5.1 什么是零长度数组
  • 6.5.2 零长度数组使用示例
  • 6.5.3 内核中的零长度数组
  • 6.5.4 思考:指针与零长度数组
  • 6.6 属性声明:section
  • 6.6.1 GNU C编译器扩展关键字:__attribute__
  • 6.6.2 属性声明:section
  • 6.6.3 U-boot镜像自复制分析
  • 6.7 属性声明:aligned
  • 6.7.1 地址对齐:aligned
  • 6.7.2 结构体的对齐
  • 6.7.3 思考:编译器一定会按照aligned指定的方式对齐吗
  • 6.7.4 属性声明:packed
  • 6.7.5 内核中的aligned、packed声明
  • 6.8 属性声明:format
  • 6.8.1 变参函数的格式检查
  • 6.8.2 变参函数的设计与实现
  • 6.8.3 实现自己的日志打印函数
  • 6.9 属性声明:weak
  • 6.9.1 强符号和弱符号
  • 6.9.2 函数的强符号与弱符号
  • 6.9.3 弱符号的用途
  • 6.9.4 属性声明:alias
  • 6.10 内联函数
  • 6.10.1 属性声明:noinline
  • 6.10.2 什么是内联函数
  • 6.10.3 内联函数与宏
  • 6.10.4 编译器对内联函数的处理
  • 6.10.5 思考:内联函数为什么定义在头文件中
  • 6.11 内建函数
  • 6.11.1 什么是内建函数
  • 6.11.2 常用的内建函数
  • 6.11.3 C标准库的内建函数
  • 6.11.4 内建函数:__builtin_constant_p(n)
  • 6.11.5 内建函数:__builtin_expect(exp,c)
  • 6.11.6 Linux内核中的likely和unlikely
  • 6.12 可变参数宏
  • 6.12.1 什么是可变参数宏
  • 6.12.2 继续改进我们的宏
  • 6.12.3 可变参数宏的另一种写法
  • 6.12.4 内核中的可变参数宏
  • 第7章 数据存储与指针
  • 7.1 数据类型与存储
  • 7.1.1 大端模式与小端模式
  • 7.1.2 有符号数和无符号数
  • 7.1.3 数据溢出
  • 7.1.4 数据类型转换
  • 7.2 数据对齐
  • 7.2.1 为什么要数据对齐
  • 7.2.2 结构体对齐
  • 7.2.3 联合体对齐
  • 7.3 数据的可移植性
  • 7.4 Linux内核中的size_t类型
  • 7.5 为什么很多人编程时喜欢用typedef
  • 7.5.1 typedef的基本用法
  • 7.5.2 使用typedef的优势
  • 7.5.3 使用typedef需要注意的地方
  • 7.5.4 typedef的作用域
  • 7.5.5 如何避免typedef被大量滥用
  • 7.6 枚举类型
  • 7.6.1 使用枚举的三种方法
  • 7.6.2 枚举的本质
  • 7.6.3 Linux内核中的枚举类型
  • 7.6.4 使用枚举需要注意的地方
  • 7.7 常量和变量
  • 7.7.1 变量的本质
  • 7.7.2 常量存储
  • 7.7.3 常量折叠
  • 7.8 从变量到指针
  • 7.8.1 指针的本质
  • 7.8.2 一些复杂的指针声明
  • 7.8.3 指针类型与运算
  • 7.9 指针与数组的“暧昧”关系
  • 7.9.1 下标运算符[]
  • 7.9.2 数组名的本质
  • 7.9.3 指针数组与数组指针
  • 7.10 指针与结构体
  • 7.11 二级指针
  • 7.11.1 修改指针变量的值
  • 7.11.2 二维指针和指针数组
  • 7.11.3 二级指针和二维数组
  • 7.12 函数指针
  • 7.13 重新认识void
  • 第8章 C语言的面向对象编程思想
  • 8.1 代码复用与分层思想
  • 8.2 面向对象编程基础
  • 8.2.1 什么是OOP
  • 8.2.2 类的封装与实例化
  • 8.2.3 继承与多态
  • 8.2.4 虚函数与纯虚函数
  • 8.3 Linux内核中的OOP思想:封装
  • 8.3.1 类的C语言模拟实现
  • 8.3.2 链表的抽象与封装
  • 8.3.3 设备管理模型
  • 8.3.4 总线设备模型
  • 8.4 Linux内核中的OOP思想:继承
  • 8.4.1 继承与私有指针
  • 8.4.2 继承与抽象类
  • 8.4.3 继承与接口
  • 8.5 Linux内核中的OOP思想:多态
  • 第9章 C语言的模块化编程思想
  • 9.1 模块的编译和链接
  • 9.2 系统模块划分
  • 9.2.1 模块划分方法
  • 9.2.2 面向对象编程的思维陷阱
  • 9.2.3 规划合理的目录结构
  • 9.3 一个模块的封装
  • 9.4 头文件深度剖析
  • 9.4.1 基本概念
  • 9.4.2 隐式声明
  • 9.4.3 变量的声明与定义
  • 9.4.4 如何区分定义和声明
  • 9.4.5 前向引用和前向声明
  • 9.4.6 定义与声明的一致性
  • 9.4.7 头文件路径
  • 9.4.8 Linux内核中的头文件
  • 9.4.9 头文件中的内联函数
  • 9.5 模块设计原则
  • 9.6 被误解的关键字:goto
  • 9.7 模块间通信
  • 9.7.1 全局变量
  • 9.7.2 回调函数
  • 9.7.3 异步通信
  • 9.8 模块设计进阶
  • 9.8.1 跨平台设计
  • 9.8.2 框架
  • 9.9 AIoT时代的模块化编程
  • 第10章 C语言的多任务编程思想和操作系统入门
  • 10.1 多任务的裸机实现
  • 10.1.1 多任务的模拟实现
  • 10.1.2 改变任务的执行频率
  • 10.1.3 改变任务的执行时间
  • 10.2 操作系统基本原理
  • 10.2.1 调度器工作原理
  • 10.2.2 函数栈与进程栈
  • 10.2.3 可重入函数
  • 10.2.4 临界区与临界资源
  • 10.3 中断
  • 10.3.1 中断处理流程
  • 10.3.2 进程栈与中断栈
  • 10.3.3 中断函数的实现
  • 10.4 系统调用
  • 10.4.1 操作系统的API
  • 10.4.2 操作系统的权限管理
  • 10.4.3 CPU的特权模式
  • 10.4.4 Linux系统调用接口
  • 10.5 揭开文件系统的神秘面纱
  • 10.5.1 什么是文件系统
  • 10.5.2 文件系统的挂载
  • 10.5.3 根文件系统
  • 10.6 存储器接口与映射
  • 10.6.1 存储器与接口
  • 10.6.2 存储映射
  • 10.6.3 嵌入式启动方式
  • 10.7 内存与外部设备
  • 10.7.1 内存与外存
  • 10.7.2 外部设备
  • 10.7.3 I/O端口与I/O内存
  • 10.8 寄存器操作
  • 10.8.1 位运算应用
  • 10.8.2 操作寄存器
  • 10.8.3 位域
  • 10.9 内存管理单元MMU
  • 10.9.1 地址转换
  • 10.9.2 权限管理
  • 10.10 进程、线程和协程
  • 10.10.1 进程
  • 10.10.2 线程
  • 10.10.3 线程池
  • 10.10.4 协程
  • 10.10.5 小结
  • 参考文献
展开全部

评分及书评

尚无评分
目前还没人评分
  • 加载中...

出版方

电子工业出版社

电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。