STM32编译的数据到底存在哪里static,extern,另外还有从C到二进制的理解

常量存在flash当中,也就是const修饰的,只要是用了这个修饰词,就存在flash,代码运行时也不会拷贝到RAM中
因为就CPU读取这方面来说,读取RAM的速度和读取Flash的速度都是一样的(好像是基本一样,AI说的)

变量一定会在RAM中开辟空间,有初始值的变量还会在Flash中占用空间
指针也是变量,容易搞错
image

另外什么是代码?
image
代码到cpu执行经历了什么?
代码经过编译器编译生成了汇编文件(C->汇编),再生成目标文件(我理解中是不完整的二进制文件,这里面包括了汇编写的启动文件编译的.o类型和你写的.c之类的程序编译成的.o)(AI告诉我这些算是半成品,因为没有填写地址,所以不算完整的机器码),再由链接器根据链接脚本合并所有的目标文件分配地址,生成最终的机器码(启动文件虽然和其他的.o文件平级,但是它是被放到Flash开头的),然后烧录进Flash。上电后,CPU从Flash第一个地址读取指令,然后就执行了启动文件那部分汇编,分配RAM空间之类的,最终进入“C”的世界,好像又回来了!

也就是说,假设有一个全局变量A,当程序编译并且与链接脚本结合之后,程序中所有用到A的地方都被替换成了A的地址,比如说A的地址是0x00008200;那么程序中的A=2,只是汇编语言将2这个值给到A的地址
下面是有关C语言中if之类的语句怎么转化成汇编,再被汇编翻译成机器码的。
image

下面是while
image

那么变量是直接被变成二进制了,汇编中的MOV CMP R1之类的呢?
image

也变成了二进制的数据,这个时候CPU就登场了,CPU由三部分组成,ALU(逻辑处理单元)+CU(控制单元)+寄存器组。CPU会解析这一串代码的二进制数据,然后通过硬件电路进行相应的操作。

image

image

image

image

image

静态变量或者加上extern的全局变量或者普通全局变量,只是为了方便开发者编写,实际上编译的时候,这几种都会被一样
地对待,统统分配一样的RAM空间,有初始值就.data,没有就.bss,但是有初始值的还会再flash的.data中占用空间,相当于
既占用了RAM,又占用了Flash。
image

posted @ 2026-04-03 14:12  青春猪头青年  阅读(15)  评论(0)    收藏  举报