rt thread 移植 堆栈 设置

在移植 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的存在意义只是为了编译通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值