AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
--------------------------------------------------
In a source file, the AREA directive marks the start of a section. This directive names the section and sets its attributes. The attributes are placed after the name, separated by commas.---------------------------------------------------
这儿Stack_Mem STACK 地址会相同
栈空间的起始地址,虽然每次编译时,不一样,但是,一旦编译之后就应该确定。
1、上述map文件中,RAM地址 0x2000 be28 应该是栈的起始地址;
2、栈空间是 16384 字节;
3、栈是向地址生长,那么栈的结束地址应该是 0x2000 7E28;
问题:在栈空间:0x2000 7E28 -- 0x2000 be28 这两者的RAM空间中,怎么会有
4、全局变量在编译后,就已经确实,在RAM空间的全局区。
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
--------------------------------------------------
In a source file, the AREA directive marks the start of a section. This directive names the section and sets its attributes. The attributes are placed after the name, separated by commas.---------------------------------------------------
这儿Stack_Mem STACK 地址会相同
LWIP的内存,在内部做了内存池和内存堆两种内存的分配方式,在opt.h中有一个宏定义,如果MEM_LIBC_MALLOC定义为0和1,有不同的分配方式。
一、MEM_LIBC_MALLOC == 0
这种情况LWIP的内存池和内存堆都是在STM32的RAM空间的全局区,取的一块内存,LWIP协议栈给出了特殊的处理,以便接收和发送数据
二、MEM_LIBC_MALLOC == 1
这种情况下
1、LWIP的内存池是在STM32的全局区
2、LWIP的内存堆是在STM32的堆中
0x2000ba28
只是长得像而已
请问一下,栈指针的地址,堆指针的在RAM中的具体位置,编译过后,应该是确定的吧?
那么在内存地址 0x2000 0000--0x2001 FFFF中的哪个地址?
不是太懂
我的理解:
>write_data_buf 0x2000ba28
这是全局变量write_data_buf的指针位置,大小为1024字节
>STACK 0x2000be28
这是栈指针的位置,大小为16384字节
STACK是段地址吧(其实这个section里只有栈...)
定义1个section,叫STACK.
里面有一个数组(一块ram),叫Stack_Mem[SIZE].
栈的设置要代码实现.
map文件并不知道它是栈(STACK只是名字而已,跟代码对应)
告诉你的是 startup_stm32f2xx.o( startup_stm32f2xx.s)
实现了一个段(section) 名字叫 STACK ,地址 0x2000be28 ,大小16384
这个section当然是[0x2000be28 ,0x2000be28 + 16384]
谢谢你的耐心解释,现在彻底弄懂了,因为我用了LWIP的内存分配机制,所有STM32的堆被隐藏了,重新用C标准库,就能看到堆和栈的地址了
能否解释下“LWIP的内存分配机制”?
我是进来学习的
这个还真没用过