.bss
BSS段(bss segment)通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
.data
数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
.txt
代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新 分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈
栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变 量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以 栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
自定义段
其实根据上面这些东西,你就会发现,其实,他们都是段,我们可以打开一个mcu的map文件,就会发现。
.data 是存在rom的,但是他们运行的时候会被加载到sram之中,会被映射load过去。
.bss 是直接在ram空间的。
txt是写在rom,注意了所有函数都是写在rom的,因为函数是不变的,只是一个输入输出的过程,所以它是不变的。
堆栈这两个,是可以直接手动修改的,看map也知道它们的起始地址和大小
所以,我们可以自己使用section来定义属于自己的段
shell
cli命令行,mcu和linux想要实现cmd的话,都是使用section来开辟属于自己的地址,这个初始化在函数执行之前,开辟一个shell结构体,然后调用入口函数和出口函数,就可以实现链表的插入,这个结构体内部就是,一个string,一个函数指针,一些状态。使用方法,比如usart中断触发的时候,就可以在进行轮询判断,然后执行对应的函数指针。
OS_malloc
有些os是有自己的malloc函数,这不是c库的,其实c库函数就是从那个堆空间选一段空闲连续的空间。所以,我们也可以在sram中选择一个起始地址,选择大小,然后就可以编写一个OS_malloc,指向我说开辟的section地址,这样就可以实现c库的malloc功能。
总结
其实,这些段,就是最基础的编译需求,也是留给我们开发人员很多空闲的部分,搞嵌入式,对于sram和rom是要非常了解的才行。注意了自己开辟的地址,不要冲突了,比如写mcu,自己的代码100kb,然后你用一个section指向一个0x8019000以内的,那就冲突了,程序都会有问题的,还有就是sram的地址也不要冲突了