查看原文
其他

IAR环境下从CCM RAM执行程序的介绍

茶话MCU 2022-09-10



温馨提示:文中图片可点击放大查看


STM32家族中基于ARMCortex M4内核的STM32F3与STM32F4系列芯片内有一块特殊的SRAM存储区---内核耦合存储器[CCM RAM],为CPU所专享访问。主要是为了实现在最高系统时钟频率下执行代码,避免出现等待状态。因此,与从闪存里执行代码相比,大大节省了关键任务的执行时间。

CCM RAM一般用于实时性高或计算密集型程序,比如:

* 数字电源的控制环(开关电源,照明)

* 3相矢量电机控制

* 实时DSP任务 

当程序代码位于CCM RAM而数据保存在常规SRAM时,M4内核便处于最优的哈佛结构配置,让指令零等待执行从而实现速度最大化。如果中断服务程序位于CCMRAM中,可以确保最短的时延,提高响应速度。

当然,CCM RAM不用来存放执行代码时,也可当做常规SRAM使用,不过它不能被DMA访问。另外,也不推荐在CCM中同时存放指令代码和数据,不然内核访问CCM里的数据和指令时可能会出现冲突,影响CPU的处理性能。【不过对于STM32F4,CCM只能用来存放数据,不能执行指令代码。具体查看比较两个系列的系统框架图】


下面主要介绍基于IAR开发环境如何从CCM RAM执行简单函数或中断服务程序的配置步骤或要点。

一、从CCMRAM 执行简单代码(中断处理程序除外)

简单代码可由一个或者多个非引用自中断处理程序的函数所组成。EWARM 可用于将一个/ 多个函数或整个源文件放入CCM RAM。该操作需要在链接器文件(.icf)中定义一个新区段,用于保存需存入CCMRAM 中的代码。该区段会在启动时复制到CCM RAM。以下是所需步骤:

1. 设定起始地址和结束地址,定义CCM RAM 地址区。

2. 通知链接器在启动时将.ccmram区段从闪存复制到CCM。

3. 提示链接器,代码段.ccmram应置入CCM RAM区域。

关于上述操作的配置,请参考下图1。

                  图1:EWARM 连接器更新配置

1.1 从CCM RAM 执行源文件

从CCM RAM执行源文件意味着该文件所声明的全部函数均从该内存区域中执行。如需放置与执行来自CCM RAM的源文件,使用EWARM文件选项窗口进行如下操作:

1. 在链接文件中添加如图1所示的 .ccmram 区段。

2. 右键点击项目窗口中的文件名。

3. 在出现的菜单上选择选项。

4. 勾选窗口中的覆盖继承设定

5. 选择输出选项,在代码段名称输入链接器文件中设定的区段名(本例为“.ccmram”)。

                   图2 EWARM文件的放置

1.2 从CCM RAM 执行一个或多个函数

从CCM RAM 执行函数的步骤如下:

1. 在链接器文件中添加如上所述的.ccmram 区段。

2. 使用关键字pragma location,指定需从CCM RAM执行的函数。参见下图3操作

                   图3: EWARM 函数的放置

注: 为从CCM RAM执行多个函数,应在各个函数声明上方设置pragma location关键字。

二、从CCM RAM 执行中断处理程序

向量表以名为__vector_table 的数组来实现,且在启动代码中被引用。EWARM链接器保护从启动代码中引用的区段,以免受到“复制初始化”指令的影响。因此,不应使用__vector_table符号通过“ 复制初始化” 指令来复制中断处理程序区段。为此,应制作第二个向量表,并将其放入CCM RAM。从CCM RAM 执行中断处理程序的步骤如下:

1. 更新链接器文件(.icf)。

2. 更新启动文件。

3. 将中断处理程序放入CCM RAM。

4. 将向量表重新映射至CCM RAM。


2.1 更新链接器文件(.icf)

链接器文件更新步骤:

1. 定义第二个向量表所在的地址:0x1000 0000。

2. 指定起始地址和结束地址,定义CCM RAM 内存地址区。

3. 向链接器指明,在启动时将名为.ccmram 的区段和第二个向量表区段

“.intvec_CCMRAM” 从闪存复制到CCM RAM。

4. 向链接器指明,第二个向量表应放在intvec_CCMRAM 区段内。

5. 指明.ccmram代码段将放在CCM RAM 中。

         图4:适用于中断处理程序的EWARM 链接器更新

2.2 更新启动文件

启动文件修改步骤:

1. 制作第二个将保存在CCM RAM中的向量表。删除原始向量“__vector_table” 中除sfe(CSTACK)和Reset_Handler 之外的所有条目。

2. 添加将放入CCMRAM 中的第二个向量表。表中应包含所有条目,比如命名它为

“__vector_table_CCMRAM”。该向量表必须放在链接器文件所定义的intvec_CCMRAM区段中。

       图5. 适用于中断处理程序的EWARM启动文件更新


2.3 将中断处理程序放入CCM RAM

参照上面1.2 章节所述把需执行的中断处理函数或参照上面1.1 章节中所述将整个stm32f_it.c 文件放入CCM RAM区。


2.4 将向量表重新映射至CCM RAM

在SystemInit 函数中,按以下方式修改VTOR 寄存器,将向量表重新映射至CCM RAM:

SCB->VTOR = 0x10000000 | VECT_TAB_OFFSET;

 

2.5 从CCM RAM 执行库(.a)

EWARM允许从CCM RAM 执行库或库模块。使用库模块名称按照如下3步进行操作。

2.5.1. 通过指定起始地址和结束地址,定义对应于CCM RAM 的内存地址区。

             图6. CCM RAM 区域定义

2.5.2. 更新链接器,在启动时利用“initialize bycopy” 将库或库模块复制至CCM RAM。

                 图7. EWARM 区段初始化

2.5.3. 向链接器指明,库应放入CCM RAM。 

                图8. EWARM 库的放置

下面例子显示了如何将arm_abs_f32.o(iar_cortexM4l_math.a库中的一个模块)放入CCM RAM的配置。

              图 9. EWARM 库模块运行于CCM的配置


小结:上面主要介绍了基于IAR编译器条件下,如何将代码放入指定存储区CCM的配置和使用方法。其实,STM32F4/STM32F7等高端系列的RAM存储区有了更多的划分,如何合理使用和利用各存储区有时也会需要做相关的配置,我们从上面的介绍可以得到启发并加以灵活运用。


另外,ST官方有个应用笔记AN4296针对上面内容就不同编译环境做了全面的介绍,有兴趣的可去www.st.com/stm32搜索下载之,或点击左下方“阅读原文”去中文网www.stmcu.com.cn下载

=============================

往期话题链接:

1、ST已发布基于PC端的MCU选型工具

2、STM32 CAN过滤器的几个术语

3、MDK环境下从CCM RAM执行程序的介绍

4、MCU功能严重异常的几个常见原因

5、关于USB DFU IAP例程移植的两个话题

5、

扫描或长按二维码可关注公众号


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存