编译过程
.c和.s文件通过armcc编译器转为.o
其中的code、RO、RW、ZI-data
程序运行时rom中的rw-data复制到SRAM中,SRAM中一般存储可读写的变量,所以ZI-data和RW-data的数据存储在这
经典问题
C语言的全局变量存放在哪里?
C语言的全局变量存放在静态数据区或全局数据区。这个区域在程序启动时就会被分配,并在程序结束时释放。全局变量的作用域是整个程序,可以被程序中的所有函数访问。在不同的编译器和操作系统中,静态数据区或全局数据区的位置可能不同。
是栈吗?
全局变量不存放在栈中。栈是一种内存分配方式,用于存储函数的局部变量和函数调用的参数、返回值等。全局变量存储在静态数据区或全局数据区中,而不是栈中。栈的大小是动态分配的,而静态数据区或全局数据区的大小是在程序编译时确定的。
静态数据区是什么?
静态数据区是程序中用于存储静态变量、全局变量和常量的一块固定大小的内存区域。在程序运行时,静态数据区会被分配一次,直到程序结束才会被释放。
静态数据区的大小在程序编译时就已经确定,因此它的大小是固定的,不会像栈一样动态地增长或缩小。静态数据区中的变量在程序运行期间都可以被访问,因此具有全局作用域。
静态数据区通常被划分为两个部分,即BSS段和数据段。BSS段用于存储未初始化的全局变量和静态变量,而数据段用于存储已初始化的全局变量和静态变量,以及常量。在程序加载时,未初始化的变量会被自动初始化为0或者NULL。
需要注意的是,静态数据区与堆、栈是不同的内存区域,它们的分配和释放方式也不同,并且静态数据区的生命周期与程序的生命周期相同,而堆和栈的生命周期则与函数的调用关系相关。
函数存放在哪?
函数存放在代码区,也称为文本区或者只读数据区。代码区是程序中用于存储可执行代码的一块内存区域,它通常是只读的,不能被修改。在程序编译时,所有的函数代码都会被编译成机器码,并被存储在代码区中。当程序运行时,代码区中的指令会被 CPU 依次执行,这样程序才能正常运行。
代码区的大小取决于程序的代码大小,因此它的大小是固定的。代码区通常被划分为只读代码段和可执行代码段,只读代码段用于存储只读数据,如字符串常量等,可执行代码段用于存储可执行代码,如函数、指令等。需要注意的是,代码区与堆、栈、静态数据区是不同的内存区域,它们的分配和释放方式也不同,并且代码区的生命周期与程序的生命周期相同。
堆跟栈的意义?
堆和栈是两种不同的内存分配方式,它们分别具有不同的意义和用途。堆是一种动态内存分配方式,它的大小可以在程序运行时动态地增长或缩小。堆的分配和释放是由程序员手动控制的,通常使用malloc()、calloc()、realloc() 等函数来分配内存,并使用free()函数来释放内存。堆的主要作用是为程序提供灵活的内存分配方式,可以实现动态数据结构,如链表、树等。
栈是一种静态内存分配方式,它的大小是在程序编译时就已经确定的,通常在程序运行时不能改变。栈的分配和释放是由编译器自动控制的,通常用于存储函数的局部变量和函数调用的参数返回值等。栈的主要作用是为程序提供快速的内存分配方式,由于栈的大小是固定的,因此可以在编译期间将栈的大小分配好,不需要在程序运行时动态分配内存,从而提高程序的执行效率。总的来说,堆和栈具有不同的意义和用途,程序员可以根据需要选择适合的内存分配方式,以实现程序的功能和性能要求。
烧录出来固件太大?flash 装不下咋整
试试编译器优化
等级0换成3后 .hex文件从46k变为38k
若工程较大,语法不规范可能会造成问题
想同时生成.hex 和 .bin文件怎么办?
在build生成.axf 文件后
运用fromelf命令行生成.bin 文件
下图是fromelf生成各种类型文件的命令
勾选run,是在生成.axf文件后执行的命令 填入fromelf生成命令,就可以同时生成bin文件啦、】
编译中所有生成文件的类型
uvprojx 文件就是我们平时双击打开的工程文件,它记录了整个工程的结构,如芯片类型、工程包
含了哪些源文件等内容,见图工程包含的文件 _ 芯片类型等内容。
uvoptx 文件记录了工程的配置选项,如下载器的类型、变量跟踪配置、断点位置以及当前已打开
的文件等等,见图代码编辑器中已打开的文件。
uvguix 文件记录了 MDK 软件的 GUI 布局,如代码编辑区窗口的大小、编译输出提示窗口的位置等等。
生成可执行文件
.o和.axf怎么查看和debug
正常打开.o和axf文件都是乱码无法查看的
此时要通过fromelf编译器反汇编,如果fromelf命令不存在,就是要去添加一下系统的环境变量,把编译器的目录添加进去path,shift加右键在文件夹打开终端,以下是例子
反汇编生成的txt文件
elf文件生成
生成elf文件勾选上后,文件空间变小了,是非常有好处的。ROdata和RWdata空间都变小了