热搜关键词: 信号与系统无刷电机ADSTCP/IP

pdf

嵌入式C语言自我修养 从芯片、编译器到操作系统 王利涛 著

  • 1星
  • 日期: 2022-01-10
  • 大小: 66.65MB
  • 所需积分:0分
  • 下载次数:4
  • favicon收藏
  • rep举报
  • free评论
标签: 嵌入式

嵌入式

系統程式

嵌入式

第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  小结

推荐帖子 最新更新时间:2022-01-14 19:42

做单片机外围电路设计,常见的问题
一、单片机上拉电阻的选择    大家可以看到复位电路中电阻R1=10k时RST是高电平 ,而当R1=50时RST为低电平,很明显R1=10k时是错误的,单片机一直处在复位状态时根本无法工作。出现这样的原因是由于RST引脚内含三极管,即便在截止状态时也会有少量截止电流,当R取的非常大时,微弱的截止电流通过就产生了高电平。 二、LED串联电阻的计算问题 通常红色贴片LED:电
灞波儿奔 微控制器 MCU
IAR for msp430运行 (*menupoint[userchoose].subs)(); 程序就跑飞了?
truct menultem { unsigned char mencount; unsigned char *displaystring; void (*subs)(); struct menultem *childrenmenus; struct menultem *parentmenus; };    //结构体定义 struct menultem (*menupoint)=
liuqiang 微控制器 MCU
入围名单揭晓:ST传感器驱动移植大赛+骨传感器评测活动
18名网友开发套件已派发,>>点此可查看自己的快递单号(登陆论坛账号状态下)   ————————————————————————————————   活动详情:点此查看   首先感谢网友对本次活动的大力支持,也期待入围网友的后续精彩的表现。 也期待我们有从驱动移植遇见,却不止步于此,期待与你们的在本次活动中的交流。现在我们先说明一下驱动代码提交约定:
nmg MEMS传感器
捉虫行动二:争做EE下载中心黑猫警长!(已颁奖)
>>【颁奖】捉虫行动二:争做EE下载中心黑猫警长 颁奖啦! -------------------------------------------------------------------------------------------------------------------------------- 为了让更多的朋友通过我们的辛苦付出,享受到下载中心的便捷、准确、严谨。所以
soso 下载中心专版
2019 TI 工业应用研讨会火爆来袭,宁波专场等你报名!
2019,开工大吉!2019 TI 宁波工业应用研讨会帮您蓄满能量。我们诚邀多位 TI 专家坐阵,为您提供工业相关诸多应用及尖端产品。内容涵盖电机驱动,工业电源,工业照明、新能源等多个议题,精彩内容配上专家演讲,全面地设计方案及开发技术助你一臂之力! 宁波场名额有限,速速点击报名按钮,提前报名者将有机会在现场获得礼上礼! >>>立即报名 日期:2019 年 3 月 5 日 时间:12:30
eric_wang TI技术论坛
于DSP无线抄表系统设计
      传统的手工抄表费时、费力,准确性和及时性得不到可靠的保障,这导致了相关营销和企业管理类软件不能获得足够详细和准确的原始数据。一般手工抄表都按月抄表,对于用户计量来说是可行的,但对于相关供应部门进行更深层次的分析和管理决策却不够。随着大规模集成电路和通信技术的发展,在电能计量领域,数字电表以其自身的优势,逐渐取代了传统的机械式电度表。高精度的电能计量芯片是数字电表的核心部分,CS5460
fish001 DSP 与 ARM 处理器

评论

登录/注册

意见反馈

求资源

回顶部

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
×