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空间浪费。