让Keil代码在内嵌SRAM中执行

概要:

代码执行于SRAM通常可以提升代码执行的速度以及连贯性,因为SRAM内嵌于处理器核心附近,具有更低的访问延迟和更高的带宽,处理器可以更快的从SRAM中获取指令并执行。

第一步

为了方便下载程序到Flash或SRAM的切换,可以新建一个工程目标,命名为SRAM,然后在工程目标下修改配置以达成将代码下载到嵌入式SRAM

第二步

点击魔术棒打开设置,在Target中重新划分存储区域,左侧为ROM,右侧为RAM,ROM一般存储程序代码和固定数据,右侧则存储程序运行时的变量和数据,代码需要掉电不丢失,而临时变量则需需要访问比较快速,Flash作为非易失性存储器且容量大价格便宜适合存储代码和固定数据,而SRAM访问迅速但掉电丢失,且相同大小比Flash贵。

现在我们为了让代码在SRAM中执行,我们将代码的存储地址从Flash改为SRAM的起始地址:0x20000000,并且给他一个大小0x10000(64kb),然后ROM区域自然要向右移动到0x20010000,然后分配一个较小的空闲0x1000.这里只是举个例子,具体的大小取决于代码编译后在Build Output窗口或者.map文件中,我下载的程序两部分分别占用8.2kb和1.95kb。分配完成后,Keil就知道将代码和数据分类存储到对应的地址当中。(分配空间时请务必查询芯片的SRAM大小,两者分配空间总和不要超过这个大小,也要确认代码的大小,不要超过空间分配的最大值)

第三步

同样在设置中打开Linker,我们可以选择勾选use Memory Layout From Target Dialog之后然Keil根据我们在Target中修改的地址分配方式自动生成sct文件,我们可以打开object文件查看,sct文件的内存分配是否正确,我们也可以消勾选use Memory Layout From Target Dialog然后选择我们自己修改的sct文件,sct文件是真正确认地址分配的链接脚本文件

第四步

我们来到Debug然后设置仿真器的Flash Download,里面有我们选择的.FLM格式的下载算法文件,我们需要按照我们在Target里的分配改变RAM和算法的Start和Size,擦除方式我们最好选择不擦除,因为SRAM我们也擦不了,然后点击Rebullid进行全编译,这样我们所有的配置都生效了。注意:如果我们切换回Flash下载,也要再次点击全编译,否则仅切换工程目标配置不会立即生效

第五步

软件的设置已经完成,我们需要跳Boot到SRAM启动,然后电机程序的下载即可,为了验证我们的正确性,我们可以进入Keil的调试界面,通过Disassembly或者Register也好验证地址是否在SARAM。

第六步

即是程序下载到了SRAM,并不能确保程序能在复合后正确执行,因为当从SRAM启动后,PC指针指向的位置必须在Reset_Handler,通过调试我们按下复位并通过Register查询PC指向的地址,STM32F103ZET6指向的地址为0x200001E0,我们可以查看MAP文件中Reset_Handler的地址,与0x200001E0进行比较,若偏小则在中断向量表末尾添加SPCAE  SIZE,使得Reset_Handler地址为0x200001E0,这样就可以实现程序复位后执行

关于代码执行效率的讨论:

在SRAM中获取代码和数据肯定是比SRAM快的,但执行代码的效率则不一定,由于Flash有预取的存在,可以让内核一次性拿到当前以及后续的代码和数据,这样在这样一个预取周期内,只需要执行代码即可,而SRAM需要一边取一边执行,当Flash执行完后,又要进行预取,预取的配置如何和电压和主频不匹配则可能取空,这将会导致一段时间的不会进行代码执行.

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值