嵌入式C语言自我修养:从芯片、编译器到操作系统
- 作者: 王利涛 编著
- 分类: 未分类
- 个人划线与想法: 131 条
阅读记录
1. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
在裸机环境下一片连续的堆内存空间,经过多次小块内存的申请和释放后,就会造成内存碎片化,在内存中留下越来越多、越来越碎片化的空闲小内存块。此时如果再去申请一片连续的大块内存就会失败。
2. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
● 局部变量的作用域由{}限定。● 可以使用static修饰局部变量来改变它们的存储属性(生命周期),但不能改变其作用域。
3. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
● 全局变量的作用域由文件来限定。● 可使用extern进行扩展,被其他文件引用。● 也可以使用static进行限制,只能在本文件中被引用。
想法 / 批注
全局变量的作用域
4. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
在每一个函数栈帧中,除了要保存局部变量、函数实参、函数调用者的返回地址,有时候编译过程中的一些临时变量也会保存到函数的栈帧中
想法 / 批注
函数栈中存储的数据内容 1.局部变量 2.函数实参 3. 函数调用的返回地址
5. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
为了防止栈溢出,可以参考下面的一些原则。● 尽量不要在函数内使用大数组,如果确实需要大块内存,则可以使用malloc申请动态内存。● 函数的嵌套层数不宜过深。● 递归的层数不宜太深。
6. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
如果设置得过小,则程序超出栈设置的内存空间又容易发生栈溢出(Stack Overflow),产生段错误。
7. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
栈的初始化其实就是栈指针SP的初始化。在系统启动过程中,内存初始化后,将栈指针指向内存中的一段空间,就完成了栈的初始化,栈指针指向的这片内存空间被称为栈空间
8. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
栈有两种基本操作:入栈(push)和出栈(pop)。入栈是把一个栈元素压入栈中,而出栈则是从栈中弹出一个栈元素。入栈和出栈都靠栈指针(Stack Pointer,SP)来维护,SP会随着入栈和出栈在栈顶上下移动
9. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
计算机上运行的程序主要分为两种:操作系统和应用程序
10. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
用户使用malloc申请的内存一般被称为堆内存(heap),函数调用过程中使用的内存一般被称为栈内存(stack)。
11. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
而在程序中使用malloc申请的内存、函数调用过程中的栈在程序运行期间则是不断变化的,这部分内存一般也称为动态内存
12. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
在一个进程的地址空间中,代码段、数据段、BSS段在程序加载运行后,地址就已经固定了,在整个程序运行期间不再发生变化,这部分内存一般也称为静态内存
13. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
一个进程实例不仅包括汇编指令代码、数据,还包括进程上下文环境、CPU寄存器状态、打开的文件描述符、信号、分配的物理内存等相关资源。
14. 第7章 数据存储与指针
记录日期:2024-09-03
划线
一个数据在内存中有2种存储方式:高地址存储高字节数据,低地址存储低字节数据;或者高地址存储低字节数据,而低地址则存储高字节数据。
15. 第7章 数据存储与指针
记录日期:2024-09-03
划线
类型,是一组数值及对该组数值进行各种操作的集合
16. 第7章 数据存储与指针
记录日期:2024-09-03
划线
ANSI C标准为我们提供的32个关键字里
17. 第7章 数据存储与指针
记录日期:2024-09-03
划线
程序是什么?程序=数据结构+算法
18. 第9章 C语言的模块化编程思想
记录日期:2024-09-03
划线
各个模块共享全局变量是各个模块之间进行数据通信最简单直接的方式
想法 / 批注
常用的一种通信方式
19. 第3章 ARM体系结构与汇编语言
记录日期:2024-07-29
划线
当前处理器状态寄存器(Current Processor State Register,CPSR)主要用来表征当前处理器的运行状态
20. 第3章 ARM体系结构与汇编语言
记录日期:2024-07-29
划线
寄存器R15又称为程序计数器(Program Counter,PC),CPU从内存取指令执行,就是默认从PC保存的地址中取的,每取一次指令,PC寄存器的地址值自动增加。CPU一条一条不停地取指令,程序也就源源不断地一直运行下去。在ARM三级流水线中,PC指针的值等于当前正在运行的指令地址+8,后续的32位处理器虽然流水线的级数不断增加,但为了简化编程,PC指针的值继续延续了这种计算方式。
21. 第3章 ARM体系结构与汇编语言
记录日期:2024-07-29
划线
在ARM处理器内部,除了基本的算术运算单元、逻辑运算单元、浮点运算单元和控制单元,还有一系列寄存器,包括各种通用寄存器、状态寄存器、控制寄存器,用来控制处理器的运行,保存程序运行时的各种状态和临时结果,如图3-1所示。
22. 第3章 ARM体系结构与汇编语言
记录日期:2024-07-25
划线
计算机的指令集一般可分为4种:复杂指令集(CISC)、精简指令集(RISC)、显式并行指令集(EPIC)和超长指令字指令集(VLIW)。
23. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
笔者觉得掌握一门汇编语言是很有必要的
24. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
使用授权。
25. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
内核授权。
26. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
指令集/架构授权
27. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
ARM则不同,通过开放ARM指令集授权,其他公司可以基于授权的指令集去设计自己的微架构和SoC芯片,
28. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
指令集架构(Instruction Set Architecture,ISA)是计算机体系架构的一部分
29. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
任何复杂的运算都可以分解为有限个基本指令的组合来完成。
30. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
计算机一般采用两种编址方式:统一编址和独立编址
31. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
总线其实就是各种数字信号的集合,包括地址信号、数据信号、控制信号
32. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
。因为这些信号是由CPU管脚直接发出的,因此也被称为物理地址
33. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
地址的本质其实就是由CPU管脚发出的一组地址控制信号
34. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
假如CS片选线低电平有效,那么当CSA1A0分别为000、001、010、011时,CPU会访问上面一片内存RAM的4字节存储单元;当CSA1A0分别为100、101、110、111时,CPU就会访问下面一片内存RAM的4字节存储单元。
35. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
可通过CPU管脚发出一组信号,经过译码器译码,选中与这个信号对应的存储单元,然后就可以直接读写这块内存了
36. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
内存中包含很多存储单元,为了方便管理,我们需要将这些存储单元进行编号管理,每一个存储单元对应一个编号
37. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
边缘计算指在靠近物或数据源头的一侧,采用网络、计算、存储、应用为一体的开发平台,就近提供最近端服务。其应用程序在边缘侧发起,可以产生更快的网络服务响应,以满足实时、安全与隐私保护方面的业务需求。
38. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
现在我们可以把一些训练工作放到汽车本地进行,这就是边缘计算的概念。
39. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
ANN(Artificial Neural Network,人工神经网络),顾名思义,就是使用计算机程序来模拟大脑的神经网络。ANN的本质是数据结构,对于特定的AI算法、AI模型而言,它的厉害之处在于:它是一个通用的模型,像婴儿的大脑一样,可以学习任何东西,如说话、唱歌、作曲、聊天、下棋、绘画、图形识别
40. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
FPGA(Field Programmable Gate Array,现场可编程门阵列)在专用集成电路(Application Specific Integrated Circuit,ASIC)领域中是以一种半定制电路的形式出现的。
41. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
GPU也是一种SIMD结构,但和CPU不同的是,它没有复杂的控制单元和Cache,却集成了几千个,甚至上万个计算核心。
42. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
而超线程处理器上的两个线程切换只需要一个时钟周期就可以了
43. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
一般处理器上的两个线程上下文切换需要20 000个时钟周期,
44. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
在多核处理器设计中,还有一种技术叫超线程技术(Hyper-Threading,HT),目前主要应用在Intel、AMD的X86多核处理器上。大家买计算机时,经常会看到4核8线程、6核12线程的说明,带有这些字眼的处理器一般都采用了超线程技术。
45. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
大小核设计目前已经成为ARM多核处理器的标配
46. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
操作系统运行时,可以根据CPU的负载情况灵活地在两个Cluster之间来回切换。为
47. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
每个节点包括计算单元、通信单元及其附属电路。计算和通信实现了分离,每一个节点中的处理单元可以是一个Core,也可以是一个小规模的SoC。Core与Core之间的通信基于通信协议进行,数据包在网络中按照设定的路由算法传输,通过网络通信的分布化来避免总线的竞争
48. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
当处理器的Core很多时,我们不再使用总线型连接,而是使用网络节点的方式连接。
49. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
交叉开关像路由器一样有多个端口,多个Core可以通过交叉开关的端口互连,并行通信。相互通信的各对节点都是独立的,互不干扰
50. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
如IBM的Cell处理器。另一个解决方法是使用交叉开关(Crossbar)
51. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
总线型连接也有缺陷,在某一个时刻只允许一对设备进行通信,如图2-45所示,当多个Core同时想占用总线与外部设备通信时,就会产生竞争,进而影响通信效率。
52. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
无论是PC、手机还是服务器,一般都是多个任务同时运行,单核CPU的性能再强劲,其实也是在串行执行这几个任务,多个任务轮流占用CPU运行。
53. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
根据实现方式的不同,多发射处理器又可分为静态发射和动态发射
54. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
每个时钟周期只能从存储器取一条指令,每个时钟周期也只能执行一条指令,这种处理器一般叫作单发射处理器
55. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
一条指令一般由操作码和操作数构成,不同类型的指令,其操作数的数量可能不一样。
56. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
分支预测技术是提高CPU性能的一项关键技术,其本质就是去除指令之间的相关性,让程序更高效运行。
57. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
根据工作方式的不同,分支预测可分为静态预测和动态预测。
58. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
现在的经典CPU流水线一般分为5级:取指、译码、执行、访问内存、写回。
59. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
控制冒险:需根据之前指令的执行结果决定下一步的行为
60. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
数据冒险:当前指令需要前面指令的运算数据才能执行
61. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
结构冒险:所需的硬件正在为前面的指令工作
62. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
一是优化流水线中各级流水线的性能,受限于当前集成电路的设计水平,这一步最难;二是依靠半导体制造工艺,工艺制程越先进,芯片面积就会越小,发热也就越小,就更容易提升主频;三是不断地增加流水线深度,流水线越深,流水线中的各级时间延迟就可以做得越小,就更容易提高主频。
63. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
一条指令的执行一般要经过取指令、翻译指令、执行指令3个基本流程
64. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
工业控制、实时领域、超低功耗的处理器中,大家可以看到很多没有集成Cache的处理器
65. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
CPU和RAM之间传输数据,要经过找地址、取数据、配置、等待、输出数据等多个时钟周期,内存带宽瓶颈会拖慢CPU的工作节奏,进而影响计算机系统的整体运行效率。
66. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
哈弗架构的特点是:指令和数据被分开独立存储,它们分别被存放到程序存储器和数据存储器。
67. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
冯·诺依曼架构和哈弗架构
68. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
为了兼顾存储和效率,计算机系统一般会采用内存+外存的存储结构:程序指令保存在诸如磁盘、NAND Flash、SD卡等外部存储器中,当程序运行时,相应的程序会首先加载到内存,然后CPU从内存一条一条地取指令、翻译指令和运行指令。
69. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
非易失性存储器一般用作计算机的外部存储器,也被称为外存,如磁盘、Flash等。这类存储器支持数据的永久保存,断电后数据也不会消失,但缺点是不支持随机访问,读写速度也不如内存。
70. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
存储器按照存储类型可分为易失性存储器和非易失性存储器。易失性存储器如SRAM、DDR SDRAM等,一般用作计算机的内部存储器,所以又被称为内存。这类存储器支持随机访问,CPU可以随机到它的任意地址去读写数据,访问非常方便,但缺点是断电后数据会立即消失,无法永久保存。
71. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
这种由基本指令组成的不同组合,我们称为程序。
72. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
CPU所支持的加、减、乘、与、或、非、跳转、Load/Store、IN/OUT等基本指令,一般称为指令集
73. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
为了提高性能,防止RAM拖后腿,CPU一般都会在内部配置一些寄存器,用来保存CPU在计算过程中的各种临时结果和状态值。
74. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
CPU内部的数据存储到RAM中,一般要经过多个时钟读写周期才能完成:找地址、取数据、配置、输出数据等
75. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
。通过这种操作,控制单元就可以不停地从内存RAM中取指令、翻译指令、运行指令,程序就可以源源不断地运行下去了。
76. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
CPU内部有个程序计数器(Program Counter,PC),系统上电后默认初始化为0,控制单元会根据这个PC寄存器中的地址到对应的内存RAM中取指令,然后PC寄存器中的地址自动加一
77. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
测试。测试主要包括芯片功能测试、性能测试、可靠性测试等
78. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
我们一般会使用球栅阵列封装(Ball Grid Array Package,BGA)
79. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
DIP(Dual in-line Package),指采用双列直插形式封装集成电路芯
80. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
DIP、QFP、BGA、CSP、MCM
81. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
光刻机主要用来将你设计的电路图映射到晶圆上,通过光照将你设计的电路图形投影到光刻胶上
82. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
自由电子和空穴
83. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-07-25
划线
一个原子由质子、中子和核外电子组成
84. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-06-04
划线
电路一般由大量的三极管、二极管、CMOS管、电阻、电容、电感、导线等组成,我们搞懂了一个CMOS元器件在晶圆上是如何实现的,基本上也就搞懂了整个电路在晶圆硅片上是如何实现的
85. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-06-04
划线
将这些单晶硅棒像切黄瓜一样,切成一片一片的,每一片我们称为晶圆(wafer
86. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-06-04
划线
半导体是介于导体和绝缘体之间的一类物质
87. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-06-04
划线
让大家对半导体工艺、芯片、CPU、指令集、微架构、计算机系统架构、总线与地址等有一个完整的认知框架,为后续的学习打下基础
88. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-06-04
划线
我们编写的C程序,最终都会转换成CPU所支持的二进制指令,而汇编语言又是这些指令集的助记符,通过反汇编代码,我们可以更加深刻地理解编译器的特性和C语言的语法
89. 第2章 计算机体系结构与CPU工作原理
记录日期:2024-06-04
划线
嵌入式开发很大一部分工作跟底层紧密相关
90. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
工作区(Working Directory)、暂存区(Staging Area)和版本库(Repository)。
91. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
Makefile文件名的第一个字母一般要大写,当然使用小写也不会错,因为make在编译程序时会首先到当前目录下查找Makefile文件,找不到时再去找makefile或GNUmakefile文件
92. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
Makefile文件中使用.PHONY声明的目标是一个伪目标,伪目标并不是一个真正的文件名,可以看作一个标签
93. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
make其实也是一个编译工具,只不过它在编译程序时,要依赖一个叫作Makefile的文件:生成一个可执行文件所依赖的所有C源文件都在这个Makefile文件中指定
94. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
gcc并不是真正的C编译器,它是GNU C编译器工具集中的一个二进制工具
95. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
替换模式
96. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
可视化模式
97. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
命令行模式
98. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
插入模式
99. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
普通模式
100. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
Vim是一款纯命令行操作、功能可扩展、高度可定制的文本编辑工具
101. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
,如gedit、Eclipse、VS Code
102. 前言
记录日期:2024-06-02
划线
C语言的面向对象编程思想、模块化编程思想和多任务编程思想,这些底层知识和编程思想构成了嵌入式开发所需要的通用理论基础和核心技能
103. 前言
记录日期:2024-06-02
划线
多任务并发编程思想,CPU和操作系统基础理论
104. 前言
记录日期:2024-06-02
划线
对内存堆栈管理、内存泄漏、栈溢出、段错误的深刻理解
105. 前言
记录日期:2024-06-02
划线
对指针的深刻理解,对复杂指针的声明和灵活应用
106. 前言
记录日期:2024-06-02
划线
C语言的面向对象编程(简称OOP)思想,学会使用OOP思想去分析Linux内核驱动。
107. 前言
记录日期:2024-06-02
划线
C语言的模块化编程思想,学会使用模块化思想去分析复杂的系统
108. 前言
记录日期:2024-06-02
划线
熟悉C语言标准、ARM、GNU编译器的特性和扩展语法
109. 前言
记录日期:2024-06-02
划线
程序的编译、链接、安装、运行和重定位分析
110. 前言
记录日期:2024-06-02
划线
ARM体系结构与汇编指令、汇编程序设计、ARM反汇编分析
111. 前言
记录日期:2024-06-02
划线
半导体基础、CPU工作原理、硬件电路、计算机系统结构
112. 前言
记录日期:2024-06-02
划线
要想从事嵌入式开发工作,尤其是嵌入式Linux内核驱动开发工作,你要精通的不仅仅是C语言,最好还要掌握和C语言相关的一系列基础理论和调试技能
113. 前言
记录日期:2024-06-02
划线
你不仅要掌握C语言的基本语法、项目管理、软件工程,还要对硬件电路、CPU、操作系统、编译原理等底层机制有完整的了解,需要对C语言进行进一步的强化学习和编程训练
114. 前言
记录日期:2024-06-02
划线
通过指针和位运算,我们可以修改内存和寄存器,从而直接控制CPU和硬件电路的运行
115. 前言
记录日期:2024-06-02
划线
网站服务器底层、游戏、各种应用框架
116. 前言
记录日期:2024-06-02
划线
实现其他编程/脚本语言:Lua、Python、Shell
117. 前言
记录日期:2024-06-02
划线
嵌入式、工业控制、物联网、消费电子、科研领域、数值计算
118. 前言
记录日期:2024-06-02
划线
嵌入式开发:各种RTOS、BSP、固件、驱动、API库
119. 前言
记录日期:2024-06-02
划线
系统软件:操作系统、编译器、数据库、图形处理、虚拟机、多媒体库等
120. 前言
记录日期:2024-06-02
划线
应用软件:Linux/UNIX环境下的工具、应用程序
121. 内容简介
记录日期:2024-06-02
划线
本书从底层CPU的制造流程和工作原理开始讲起,到计算机体系结构,C程序的反汇编分析,程序的编译、运行和重定位,程序运行时的堆栈内存动态变化,GNU C编译器的扩展语法,指针的灵活使用,C语言的面向对象编程思想,C语言的模块化编程思想,C语言的多任务编程思想,进程、线程和协程的概念,从底层到上层,从芯片、硬件到软件、框架,几乎涵盖了嵌入式开发的所有知识点
122. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
栈溢出攻击原理
想法 / 批注
模拟栈溢出
123. 第5章 内存堆栈管理
记录日期:2026-09-05
划线
[插图]
想法 / 批注
可执行文件加载到内存中运行
- 内核空间 2.用户栈
124. 第5章 内存堆栈管理
记录日期:2026-08-23
划线
C语言函数中的局部变量、传递的实参、返回的结果、编译器生成的临时变量都是保存在栈中的,离开了栈,C语言就无法运行。在很多嵌入式系统的启动代码中,你会看到:系统一上电开始运行的都是汇编代码,在跳到第一个C语言函数运行之前,都要先初始化栈空间。
想法 / 批注
栈的主要作用是什么?
125. 第5章 内存堆栈管理
记录日期:2026-08-23
划线
我们这一节先从栈讲起。首先栈是一种数据结构,它的特点是先进后出(First Input Last Output,FILO)。
想法 / 批注
类似于装入子弹,先进后出 STACK
126. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
Vim常见的工作模式
想法 / 批注
普通模式 插入模式 命令行模式 可视化模式 替换模式
127. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
Vim常见的工作模式
想法 / 批注
使用 apt-get install vim
128. 第1章 工欲善其事,必先利其器
记录日期:2024-06-04
划线
Shell命令行下敲击下面的命令即可完成安装
想法 / 批注
使用 apt-get install vim
129. 前言
记录日期:2024-06-02
划线
什么是左值、右值、对象、副作用、未定义行为?
想法 / 批注
- 左值(Lvalue)和右值(Rvalue) 左值:指向内存位置的表达式,可以出现在赋值运算符的左侧,也可以在右侧使用。通常是具有存储位置的变量或对象。 右值:指向数值的表达式,只能出现在赋值运算符的右侧,表示数据的值,通常是字面量、常量或表达式的计算结果。
- 对象(Object) 在编程中,对象通常指的是内存中存储的数据实体,可以是基本类型(如整数、浮点数)或复合类型(如数组、结构体、类实例)。 对象具有存储位置和内容,可以通过引用或指针来访问。
- 副作用(Side Effect) 指的是表达式的执行会导致除了返回一个值之外的其他影响,比如修改了对象的状态、改变了环境等。 常见的副作用包括修改变量的值、打印输出、读写文件等。
- 未定义行为(Undefined Behavior) 指的是在程序中出现了编译器没有定义行为的情况,可能导致程序产生不确定的结果,甚至导致崩溃或安全漏洞。 未定义行为通常是由于编程错误、语言规范未明确定义的行为或编译器实现的不一致性引起的。 在编程中理解和遵守这些概念可以帮助编写更安全、可靠和高效的代码。
130. 前言
记录日期:2024-06-02
划线
在C程序编译过程中,什么是语法检查、语义检查?两者有何区别?
想法 / 批注
在C程序编译过程中,语法检查(Syntax Checking)和语义检查(Semantic Checking)是两个重要的阶段,用于确保程序的正确性和合理性。它们的主要区别在于检查的内容和层次。
- 语法检查(Syntax Checking) 定义:语法检查是编译器对源代码进行的第一个基本检查步骤,目的是检查代码是否符合语言的语法规则。 内容:语法检查主要检查代码中是否存在拼写错误、缺少分号、括号不匹配等语法错误。 特点:语法检查只涉及源代码的表面结构,不关心代码的含义或语义逻辑。 示例:在C语言中,语法检查会确保if语句有对应的括号、函数定义使用了正确的语法等。
- 语义检查(Semantic Checking) 定义:语义检查是编译器对源代码进行的高级检查步骤,目的是检查代码的含义和语义逻辑是否合理。 内容:语义检查主要检查代码中是否存在类型不匹配、未声明的变量或函数、数组越界访问等语义错误。 特点:语义检查涉及代码的含义和逻辑结构,需要理解代码的语义信息进行检查。 示例:在C语言中,语义检查会确保函数调用的参数类型与函数声明匹配、数组访问不越界等。 区别 检查内容:语法检查主要检查代码的表面结构和语法规则是否符合,而语义检查则涉及到代码的含义和逻辑结构。 检查层次:语法检查是编译过程的最初阶段,是基本的语法合法性检查;而语义检查是在语法检查之后进行的高级检查,涉及到更深层次的语义信息。 检查目的:语法检查主要是为了保证代码的语法正确性,避免基本的语法错误;而语义检查更注重代码的合理性和逻辑正确性,避免更深层次的语义错误。 总之,语法检查和语义检查是编译过程中两个不同的阶段,用于不同层次的代码检查。语法检查主要检查代码的表面结构和语法规则,而语义检查则涉及代码的含义和逻辑结构,更注重代码的合理性和逻辑正确性。
131. 前言
记录日期:2024-06-02
划线
什么是标识符、关键字和预定义标识符?三者有何区别?
想法 / 批注
在编程中,标识符(Identifier)、关键字(Keyword)和预定义标识符(Predefined Identifier)是三个重要的概念,它们在语言中具有不同的作用和含义。
- 标识符(Identifier) 定义:标识符是用来标识变量、函数、类或其他用户自定义项的名称。 特点:标识符可以由字母、数字和下划线组成,但必须以字母或下划线开头。标识符通常区分大小写。 示例:在 C++ 中,myVariable、myFunction、MyClass 等都是合法的标识符。
- 关键字(Keyword) 定义:关键字是编程语言中预定义的具有特殊含义的单词,通常用于控制程序的结构、流程和功能。 特点:关键字在语言中有特殊用途,不能用作标识符。每种编程语言都有一组特定的关键字。 示例:在 Python 中,if、else、while、for 等都是关键字。
- 预定义标识符(Predefined Identifier) 定义:预定义标识符是由编程语言或其相关库预先定义的特殊标识符,用于表示常见的数据类型、函数或常量等。 特点:预定义标识符通常是系统级别的,可以直接在程序中使用,无需额外定义或声明。 示例:在 C 语言中,NULL、printf、int 等都是预定义标识符。 区别 用途:标识符用于命名自定义的变量、函数等;关键字用于表示语言的结构和功能;预定义标识符表示系统或语言中预先定义的常见标识符。 可用性:标识符和预定义标识符可以在程序中使用和定义;而关键字具有特殊含义,不能用作标识符。 来源:标识符由程序员定义;关键字和预定义标识符由编程语言或其相关库预先定义。 总之,标识符是用来标识自定义项的名称,关键字是具有特殊含义的预定义单词,而预定义标识符是系统或语言中预先定义的常见标识符。它们在编程中有不同的作用和使用方式。
来源:微信读书