四川省建设厅官方培训网站,wordpress近期文章怎么显示时间,wordpress百度云链接地址,wordpress 媒体库角色权限STM32内置有Flash和RAM#xff08;而RAM分为SRAM和DRAM#xff0c;STM32内为SRAM#xff09;#xff0c;硬件上他们是不同的设备存储器、属于两个器件#xff0c;但这两个存储器的寄存器输入输出端口被组织在同一个虚拟线性地址空间内。
MDK预处理、编译、汇编、链接后编…STM32内置有Flash和RAM而RAM分为SRAM和DRAMSTM32内为SRAM硬件上他们是不同的设备存储器、属于两个器件但这两个存储器的寄存器输入输出端口被组织在同一个虚拟线性地址空间内。
MDK预处理、编译、汇编、链接后编译窗口会显示如下一段关于程序和数据大小的信息 Code是程序中代码所占字节大小
RO-dataRead Only-Data程序只读的变量也就是带const的和已初始化的字符串等
RW-dataRead Write-Data已初始化的可读写全局/静态变量
ZI-dataZero Initialize-Data未初始化的可读写全局/静态变量
程序占用的Flash存储器的空间大小CodeRO dataRW data 生成的bin文件大小。 程序占用的SRAM存储器的空间大小RW dataZI data。
STM32上电跑程序前会把可以进行修改的变量复制到SRAM上如RW data、ZI data而对于不需要修改的数据如Code、RO-data不用复制到SRAM中未初始化的变量ZI-data不会占用SRAM的空间处理器只会把未初始化的变量需要占用的字节个数存放在SRAM并不会真正为其分配空间。
C语言内存按地址由低到高分为四个区代码区text段、全局\静态区地址从低到高分为文字常量区、已经初始化的数据data段、未进行初始化的数据BSS段、堆Heap、栈Stack
对于栈区由编译器自动释放存放函数的形参、局部变量等。每当一个函数被调用时该函数的返回类型和一些调用的信息被存放到栈中然后这个被调用的函数再为它的变量如局部变量在栈上分配空间每调用一个函数一个新的栈就会被使用。局部变量的生命周期也是有区别的静态局部变量的生命周期是从程序开始到程序结束而非静态局部变量在函数结束后被回收销毁。栈区存放数据是从高地址位向低地址位存放的也就是栈顶地址在栈区里最低存放最新数据栈底地址在栈区里最高存放第一个数据是一块连续的内存区域最大容量是由系统预先定义好的申请的栈空间超过这个界限时会提示溢出用户能从栈中获取的空间较小。 栈采用后进先出LIFO 策略就像一杯倒立的水杯杯底也就是栈底的水是最后倒出的也是最先倒进去的杯顶也就是栈顶的水是最先倒出的也是最后倒进去的。 这里讲到变量的生命周期那就回顾生命周期、作用域的意思。 生命周期指的是程序执行过程中该变量存在的时间长短 作用域指的是变量可以在哪儿用如只能在本函数调用、只能在本文件调用、可以被其他文件调用
对于堆区用于动态内存分配位于BSS段和栈中间的地址区域由程序员手动申请分配malloc和释放free。堆是从低地址位向高地址位增长采用链式存储结构。频繁的使用malloc/free函数可能造成内存空间的不连续产生碎片。当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间因此堆的效率比栈要低的多。