1765|2

227

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

GD32VF103多任务应用中的栈重用 [复制链接]

 

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

最新回复

有意思,谢谢分享!   详情 回复 发表于 2021-12-20 17:43
点赞 关注
个人签名

欢迎关注“麦克泰技术”

 
 

回复
举报

7608

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

有意思,谢谢分享!

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

227

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
freebsder 发表于 2021-12-20 17:43 有意思,谢谢分享!

不用客气!

个人签名

欢迎关注“麦克泰技术”

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表