在移植 rt thread nano版本(标准版应该也适用)过程中,对于堆栈设置有以下发现,分享下。基于的是rt thread nano 4.x版本,移植对象是一款cortex M0 mcu。
一般在system_xxxx.s文件中,有如下的代码,一个是栈空间,一个堆空间。效果和C代码中定义两个数组类似。
Stack_Size EQU 0x0000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
Heap_Size EQU 0x0000400
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
堆(heap)
这里的__heap_base,__heap_limit等是给armcc自带的C库中的内存管理使用的,但是既然我们移植rt thread,那自然使用rthread的内存管理模块。因此这个heap实际并没有被使用,但却占用了内存空间。所以Heap_Size 可以设置为0。这样对于小内存的mcu可以最大化利用内存。
至于如何在rtthread如何设置动态内存的起始地址,以最大化利用内存,可以搜索下相关文章
栈(stack)
在上电还未运行第一条代码前,mcu的sp寄存器加载的是__initial_sp这个地址,即静态内存Stack_Mem的结束地址。之后从起始代码,到rtthread系统启动结束(在创建main和idle线程后),都在这个栈上运行。系统启动结束后,这个栈内存也没有用了。我们可以把mcu启动的栈地址设置为内存最高地址,把Stack_Size设置为0,以最大化利用内存。也可以删除这段代码。如下:
Stack_Size EQU 0x0
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
Heap_Size EQU 0x0
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD 0x20200000 ; 内存空间的最大地址
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
BX LR ;直接返回,这个函数什么也不做
ALIGN
ENDIF
END
__user_initial_stackheap的存在意义只是为了编译通过。

2358

被折叠的 条评论
为什么被折叠?



