回答

收藏

GD32VF103多任务应用中的栈重用

其他 其他 3457 人阅读 | 0 人回复 | 2021-12-17

使用FreeRTOS开发应用时,多任务调度器启动后,由于每个任务都有独立的堆栈空间,C启动堆栈不再使用,使嵌入式应用中可用的RAM量减少。

如何重用这段RAM空间?

栈空间的重用需要利用处理器及IDE的特性。

GD32VF103是一款基于Bumblebee RISC-V内核的通用型MCU。RISC-V内核提供了一个暂存寄存器mscratch,机器模式下运行的程序可以使用该寄存器临时保存数据。mscratch寄存器提供了一种保存和恢复机制,例如,在进入中断处理后,将用户堆栈指针SP的值临时存入寄存器 mscratch中;在退出异常处理程序之前,将mscratch寄存器中的值恢复至用户堆栈指针寄存器。

RISC-V内核还提供了mscratchcswl 寄存器,用于在多个中断等级间切换时,交换目的寄存器与 mscratch的值来加速中断处理,将中断处理程序与应用程序任务的堆栈空间分离。

对于SEGGER的Embedded Studio for RISC-V工具链(SES),初始堆栈的存储空间为stack。stack的大小可以通过工程的options配置,如下所示:

默认stack为1KB,对于典型启动代码来说是足够的。如果启动代码需要更多(或更少)的堆栈空间,可以简单地更改其值以满足应用需要。

FreeRTOS中没有提供独立的ISR堆栈。我们可以利用GD32的硬件特性,将stack作为独立的中断栈,隔离任务堆栈和中断堆栈,减少每个任务堆栈空间配置,避免RAM资源浪费。

具体实现过程如下:

在FreeRTOS移植文件portasm.S中,启动系统第一个任务时,将stack的地址写入mscratch寄存器,用作中断堆栈。

在进入中断处理程序后,在中断程序入口添加一条 mscratchcswl 可以实现将堆栈从任务栈切换到独立的中断栈空间。

csrrw sp, CSR_MSCRATCHCSWL, sp  

在中断程序出口添加一条mscratchcswl指令,将堆栈切换到任务栈空间。

csrrw sp, CSR_MSCRATCHCSWL, sp     

通过RISC-V特殊的CSR寄存器,我们可以实现中断处理程序和应用程序的栈空间分离,提高代码的健壮性,避免了RAM空间浪费。


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条