历史上的今天
返回首页

历史上的今天

今天是:2024年11月02日(星期六)

2021年11月02日 | stm32专题三十七:自动分配变量到指定 SRAM 空间

2021-11-02 来源:eefocus

当有多个内存块时,MDK 优先使用空间更大的内存。


使用 sct 文件来进行内存管理:

编程要点:


1 取消勾选Use Memory Layout from Target Dialog,然后直接点击 edit 来编辑工程的 sct 文件:


sct 文件的默认配置如下所示:

看一下此时的 map 文件。可以看到,HEAP 和 STACK 都位于IRAM1 区域。

接下来,我们将64 KB的内存空间分成两块,如下所示(直接复制,然后修改):

我们将 64 KB 的内部SRAM,人为的分成了 20 + 28 KB,按照 MDK 优先使用大容量的空间进行存储,我们预计结果会是保存在ERAM1中,map文件证实了这一结果:

通常,我们会将栈区 STACK 分配到内部 SRAM,用来保存某些程序所用到的局部变量,因此,对sct文件进行修改如下:

通过上述修改,将栈区的内容保存在 IRAM1 中,而其他数据分配不变, map文件如下所示:

有了内存分配,接下来直接使用代码来分析,全局变量、全局数组、局部变量、动态内存 在内存中的地址:


#include "stm32f10x.h"

#include "./usart/bsp_usart.h"

#include "./led/bsp_led.h"  

#include "./sram/sram.h"

#include

 

void Delay(__IO u32 nCount); 

 

//定义变量到“指定的存储空间”

uint32_t testValue  =7 ;

//定义变量到“指定的存储空间”

uint32_t testValue2  =0;


//定义数组到“指定的存储空间”

uint8_t testGrup[100]  ={0};

//定义数组到“指定的存储空间”

uint8_t testGrup2[100] ={1,2,3};

 

/*本实验中的sct配置,若使用外部存储器时,堆区工作可能不正常,

  使用malloc无法得到正常的地址,不推荐在实际工程应用*/

/*另一种我们推荐的配置请参考教程中的说明*/

 

/**

  * @brief  主函数

  * @param  无

  * @retval 无

  */

int main(void)

{

uint32_t inerTestValue =10;

/* LED 端口初始化 */

LED_GPIO_Config();  

    

  /* 初始化串口 */

  USART_Config();

  

  printf("rnSCT文件应用——自动分配变量到“指定的存储空间”实验rn");

  

printf("rn使用“ uint32_t inerTestValue =10; ”语句定义的局部变量:rn");

printf("结果:它的地址为:0x%x,变量值为:%drn",(uint32_t)&inerTestValue,inerTestValue);

  printf("rn使用“uint32_t testValue  =7 ;”语句定义的全局变量:rn");

printf("结果:它的地址为:0x%x,变量值为:%drn",(uint32_t)&testValue,testValue);

  printf("rn使用“uint32_t testValue2  =0 ; ”语句定义的全局变量:rn");

printf("结果:它的地址为:0x%x,变量值为:%drn",(uint32_t)&testValue2,testValue2);

printf("rn使用“uint8_t testGrup[100]  ={0};”语句定义的全局数组:rn");

printf("结果:它的地址为:0x%x,变量值为:%d,%d,%drn",(uint32_t)&testGrup,testGrup[0],testGrup[1],testGrup[2]);

  printf("rn使用“uint8_t testGrup2[100] ={1,2,3};”语句定义的全局数组:rn");

printf("结果:它的地址为:0x%x,变量值为:%d,%d,%drn",(uint32_t)&testGrup2,testGrup2[0],testGrup2[1],testGrup2[2]);

/*本实验中的sct配置,若使用外部存储器时,堆区工作可能不正常,

  使用malloc无法得到正常的地址,不推荐在实际工程应用*/

  /*另一种我们推荐的配置请参考教程中的说明*/

uint32_t * pointer = (uint32_t*)malloc(sizeof(uint32_t)*3); 

if(pointer != NULL)

{

*(pointer)=1;

*(++pointer)=2;

*(++pointer)=3;

printf("rn使用“ uint32_t *pointer = (uint32_t*)malloc(sizeof(uint32_t)*3); ”动态分配的变量rn");

printf("rn定义后的操作为:rn*(pointer++)=1;rn*(pointer++)=2;rn*pointer=3;rnrn");

printf("结果:操作后它的地址为:0x%x,查看变量值操作:rn",(uint32_t)pointer); 

printf("*(pointer--)=%d, rn",*(pointer--));

printf("*(pointer--)=%d, rn",*(pointer--));

printf("*(pointer)=%d, rn",*(pointer));

free(pointer);

}

else

{

printf("rn使用malloc动态分配变量出错!!!rn");

}

  

  LED_BLUE; 

 

  while(1); 

 

 

}


void Delay(__IO uint32_t nCount) //简单的延时函数

{

for(; nCount != 0; nCount--);

}

 

实际串口打印结果如下:


可以看到,全局变量位于 ERAM1,局部变量位于栈区 IRAM1,动态内存位于堆区 ERAM1。

再设想一下,如果ERAM1真的是一个外部扩展的SRAM,那么毫无疑问的,肯定在速度上不如内部SRAM。所以,我们希望优先将变量保存到内部SRAM,而HEAP和其他的才保存在外部的SRAM。但由于 MDK 的链接器特性,都优先使用大容量作为存储空间,那么该怎么办?


其实很简单,只需要在 ERAM1 中注释掉就行;

map 文件结果如下所示:

关于 __attribute__ 关键字的说明


在程序中,当需要指定某个变量的内存地址时, MDK 提供了一个关键字__attribute__,来实现绝对地址定位的功能,这种用法通常是为了把变量指定到外部扩展的存储器。


__attribute__ 的用法如下所示:

指定变量分配到节区:

可以看到,我们将变量定义到名为 EXRAM 的节区中,而在 sct 文件中,我们还可以指定 EXRAM 的执行域:

分配变量到外部SRAM


编程要点:


修改启动文件,在__main执行之前初始化“指定的存储空间”的硬件;

在 sct文件中增加“指定的存储空间”对应的执行域;

使用节区选择语句选择要分配到“指定的存储空间”的内容;

测试;

为什么要修改启动文件?

试想一下,如果我们在程序中,将大量的 RW-data 定义到外部SRAM,那么在分散加载代码的过程中,系统会将原本保存在FLASH中的RW-data复制到SRAM中,这就要求我们必须先完成对外部SRAM的初始化,不然外部SRAM都起不来,还怎么保存数据呢?


修改启动文件如下所示:

在原来的启动文件中可以增加上述加粗表示的代码,增加的代码中使用到汇编语法 IMPORT,引入用户在其它C语言文件中定义的名为 FSMC_SRAM_Init 的函数(函数名要根据具体的程序来改),接着使用 LDR 指令加载函数的代码地址到寄存器 R0,最后使用BLX R0 指令跳转到 FSMC_SRAM_Init 的代码地址执行。


加入的代码实现了 Reset_handler 在执行__main 函数前先调用了我们自定义的FSMC_SRAM_Init函数,从而为分散加载代码准备好正常的硬件工作环境。


在 sct 文件中增加执行域:

关于为什么要定义 STACK 和 stm32f10x_rcc.o的描述:

优先使用内部SRAM作为数据存储器的原因:

推荐阅读

史海拾趣

EZchip Technologies Ltd公司的发展小趣事

随着技术的不断成熟和市场的认可,EZchip开始寻求更广阔的市场空间。公司通过与全球知名通信设备制造商建立合作关系,将其产品应用于各类网络设备和解决方案中。同时,EZchip还积极参与国际标准制定和行业交流活动,不断提升品牌影响力。通过市场拓展和合作,EZchip的产品逐渐覆盖了全球多个国家和地区,成为了网络通信行业的重要参与者。

EFINIX公司的发展小趣事

EFINIX公司继续深化其在FPGA领域的技术创新,成功推出了Trion FPGA产品系列。该产品具有低功耗、精细封装面积和强大的性能特点,深受市场欢迎。在Trion FPGA产品销售的头三个月里,EFINIX公司获得了多项设计认可和客户订单,并有很多客户已经开始使用Trion FPGA进行产品设计。

Compact公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场洗牌。面对这些挑战,Compact公司积极调整战略,加大研发投入,以适应市场变化。同时,公司还通过优化生产流程、降低成本等方式提高竞争力。在行业变革中,Compact公司不仅成功应对了挑战,还抓住了机遇,实现了跨越式发展。

CHIMEI(奇美)公司的发展小趣事

奇美公司自成立以来,始终坚持品质至上的原则。公司注重产品质量和性能的提升,通过引进先进的生产设备和工艺技术,不断提升产品的品质和竞争力。同时,奇美还建立了完善的质量管理体系,从原材料采购到产品出厂,每一个环节都严格把控,确保产品的品质达到客户的要求。这种对品质的执着追求,使得奇美的产品在市场上赢得了良好的口碑。

长工微电子公司的发展小趣事

长工微电子成立于2016年5月,创立之初,公司就明确了以技术创新为核心的发展战略。公司迅速组建了一支由高级工程师、博士、硕士等组成的数十人专业开发运营团队。这支团队秉承着“创新、踏实、学习”的理念,致力于电源集成芯片市场,不断推出创新产品。通过每年推出5-10款核心芯片的速度,长工微电子迅速占领了中高端市场,逐渐在行业中崭露头角。

ACCUTEK公司的发展小趣事

ACCUTEK公司成立于XXXX年,起初只是电子行业中的一家小型初创企业。创始人凭借对电子技术的深入理解和市场趋势的敏锐洞察,决定专注于高精度数控设备的研发和生产。公司初期面临着资金短缺、技术瓶颈和市场认可度低等挑战,但凭借团队的坚持和不懈努力,逐渐在市场中站稳脚跟,赢得了初步的客户信任。

问答坊 | AI 解惑

基于最新款飞思卡尔片子(MC9S08AC32)的实际应用代码

如题所说. 对于想使用这款飞思卡尔芯片,MC9S08AC32,FLASH有32K的同志位来说,我认为这个片子做得不错了,你们可以试着尝试一下,飞思卡尔是俺使用过的代码中,我觉得相对来说,抗干扰性较强的一款片子. 这里有一些代码,可以帮你迅速入门,迅速走入开发.…

查看全部问答>

id卡读卡器ps2口怎么读不出卡号啊??也是和键盘输入一样的读卡器

id卡读卡器ps2口怎么读不出卡号啊??也是和键盘输入一样的读卡器…

查看全部问答>

8255求救 引脚电平变化无法读取

8255引脚电平变化无法读取 #define PA8255 (*((unsigned char xdata *)0x1fff))//总线地址 #define PB8255 (*((unsigned char xdata *)0x3fff))//总线地址用16位表示 p0是低八位 p2是高八位    #define PC8255 (*((unsigned char xdat ...…

查看全部问答>

PNG图片旋转任意角度

WinCE5.0下有什么好的方法实现啊?…

查看全部问答>

导出的SDK要安装在VS2005的哪个目录下????

如题。   我自己定制了一个PB,编译好了后,把SDK导出了,但是这个SDK是要安装在VS2005的安装目录下吗??(我用的开发 工具是VS2005,但是是第一次使用)安装完了SDK,在启动VS2005,新建工程时,需要对它进行选择吗????…

查看全部问答>

c语言程序问题

#include<reg52.h>#define uchar unsigned char#define uint unsigned int sbit lcden=P2^7;sbit lcdrs=P2^6;sbit lcdrw=P3^6;uchar count,shi,fen ,miao;uchar code table[]=\"   2009-5-16\";uchar code table1[]=\"   0 ...…

查看全部问答>

[交换]我有MSP430 Value Line LaunchPad +Capacitive Touch BoosterPack

我有MSP430 Value Line LaunchPad +Capacitive Touch BoosterPack全新套件想交换个JLINK仿真器,有意者站内联系。 MSP430 LaunchPad+Capacitive Touch BoosterPack 超值系列开发套件 详细见TI官网: http://e2e.ti.com/group/msp430launchpad/b/ ...…

查看全部问答>

坛子里有使用ZUKEN CR5000的软件的么?

如题,欢迎使用的公司和个人跟贴,这款软件好像满偏门的,是么?…

查看全部问答>

Getting Started with the MSP430 LaunchPad_Student Guide and Lab Manual

内容和大课堂的内容差不多,只不过是英文的。 大家看看!…

查看全部问答>

AD器件大全

本帖最后由 paulhyde 于 2014-9-15 03:16 编辑 AD芯片大全,及其基本性能指标。供大家比赛参考!!    …

查看全部问答>