0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于ARM MDK集成开发环境从事STM32开发过程中的两个小提醒

茶话MCU 来源:ST MCU 信息交流 2019-12-06 15:20 次阅读

‍一、片内RAM用完了?

曾有两个不同的STM32用户反馈了相似的问题,他们在对STM32F7Cube库里的工程例程进行编译时,发现了一个令人很不解的事。编译的结果提示芯片内的RAM几乎都耗光了。但以他们对工程基本功能的了解,按理说不应该那样,想知道是怎么回事。

具体情况是这样的:他们先在STM32CubeF7的固件库里打开了一个有关lwip应用的工程示例。比如下面目录处的一个工程,使用ARM MDK进行编译。

STM32Cube_FW_F7_V1.15.0ProjectsSTM32746G-DiscoveryApplicationsLwIPLwIP_HTTP_Server_Netconn_RTOSMDK-ARM。

结果发现编译结果提示片内RAM的空间已经基本用完了。但感觉应该用不了那么多RAM内存。客户还想添加自己的其它用户程序,还需使用RAM呢。

打开相应软件工程,使用ARM MDK进行编译,发现编译结果跟客户反馈的一致。

从编译结果来看,感觉RAM真的被用去了320多K,那RAM用到哪里去了呢?打开对应的MAP文件进一步查看,可得到如下数据。

先看看芯片内部RAM情况。目前使用的芯片是STM32F746NG,查看其数据手册可知其内部系统RAM容量为320KB【1KB=1024B】,分别由如下三块RAM区域组成,各区域容量及地址范围如下:

结合编译结果和上面数据信息来看,貌似RAM真的用完了。既然这样,只好硬着头皮继续查看MAP文件的其它细节,‍看看RAM到底消耗在哪些地方去了。后来发现在某个地址段有个巨大的PAD补丁填充区。

即从0x2000fd08到0x2004bfff这段区域,共246,520Bytes【即上图‍黄色区域所指】。

一般来讲,代码编译后产生的PAD补丁块往往是因为地址对齐方面的原因导致的一些不便使用的零散内存碎片,正常来讲,‍这些补丁块不会大面积的集中在一起。

比如使用下面结构体变量的时候会插入padding.

但这里提示的补丁块也太大了,高达200多KB而且是连续空间!感觉是哪里误会了。从分析来看,初步判断这个PAD区间应该还是可以被用户使用的。于是尝试在现有代码里随意增加一块16KB的RAM有效使用量,编译一切正常,编译后显示的内存用量结果跟之前几乎一模一样,依然显示RAM用完了。

但通过查看MAP文件,可以发现上面提到的那个大补丁块空间也随之减小了16KB。显然,RAM并非真正用完了,只是编译器把它当作类似对齐原因导致的补丁块了。现在问题是,怎么会被编译器误判成这么大的一个补丁块呢?

进一步查看MAP和部分代码源文件,我们可以发现有一块RAM区域,即芯片内的SRAM2区域被用户使用attribute关键字自行做了内存使用分配了,即这块内存空间不是交给编译器安排的。【下图中绿色方框内的内存分配】

结合上面的分析,那个巨大的pad区域正是经编译器分配使用到的RAM空间的‍末尾地址开始‍到SRAM2起始地址【0X2004C000】之前的那段空间。

这里让人想到一个地方,那就是MDK IDE选项配置中Target配置的这个地方:

这里片内RAM配置是这样的,意味着从0x20000000到0x2004ffff的全部RAM空间交由编译器分配管理。

而在实际应用代码中,编译器从0x20000000开始分配内存,而SRAM2区域则由用户自行安排使用的。这样的话,经编译器所分配所用到的RAM内存末尾到0x2004BFFF这段未用区域被视为了pad区域。看来只是误会一场。

那如何消除这个误会呢?我们可以将上面的内存配置项稍微修改下,让SRAM2区域不再让编译器分配管理,这样就避免了编译器分配的内存末尾到SRAM2区域起始地址的这段空间被视为补丁区。像下面一样修改:

这样修改后再做编译,结果如下,不再给人RAM都用光的感觉了,只用到70多KB的片内RAM。

‍‍二、Flash编程算法用不了?

用人使用STM32F7开发产品,发现编译时找不到合适的Flash算法文件,或者MDK自带的现有FLM文件用不了。具体情况是这样的:

有人使用STM32F750V8开发产品,编译完毕后欲进行下载调试,结果没法完成程序下载,提示FLASH下载错误。

检查了各个配置后,怀疑FLASH算法文件是否有问题。

打开MDK选项配置里flash_download的编程配置页面,那里已经添加了相关FLASH编程算法文件。

不过,如果使用STM32芯片做过开发的人可能比较容易发现有个地方有点刺眼,就是起始地址那个地方。用过STM32F0/F1/F4等系列的人可能比较容易发现,那个FLASH起始地址一般是在0x8000000这个地方,这里却是0x00200000。我们再看看MDK选项配置有关内存分配的那个地方,如下图所示:

这里的片内FLASH默认起始地址却是0x8000000。显然这里跟FLASH编程算法文件的起始地址定义不一致,初步判断应该是这个地方导致的问题。

到此,我们有必要看看STM32F7的相关技术手册了关于内部FLASH地址分配的内容。下图是STM32F750片内主从外设及总线的框架图,对于片内FLASH,CPU可以有两条总线通路访问它,一条是通过AXIM接口,经过AXI-AHB桥以64位总线访问,另一条是通过ITCM接口,经过片内ART加速器后访问它。【如下图所示】

我们通过进一步查看手册,可以得知CPU访问该FLASH区域时因使用不同总线接口而安排了不同的地址访问区域。

从上面表格可以清楚地看到,CPU从不同接口访问FLASH时其对应地址是不一样的。通过AXIM接口访问内部flash的起始地址为0x08000000,通过ITCM接口访问内部flash的起始地址是0x00200000.

结合到上面案例,MDK选项配置中Target页面的片内FLASH地址安排与Flash算法定义的地址不一致导致程序下载失败。那么,我们可以将二者的地址及大小调整得一致,具体根据实际开发需求来调整,即根据你希望CPU通过哪个接口来访问FLASH来做相应调整。

1、如果希望走ITCM接口来访问,我们就将Target页面的FLASH存储起始地址与FLASH算法文件定义的起始地址都设置为0x00200000,如下图所示:

2、如果希望走AXIM接口来访问,我们就将FLASH算法文件定义的起始地址与Target页面定义得一致,这里就是0x08000000.

基于MDK提供的FLASH算法文件我们可以直接修改其起始地址及大小。

比如,如果刚加载进来的算法文件是基于ITCM接口的地址定义,如下图所示。

我们可以直接基于上面算法文件参数进行起始地址修改,即修改椭圆里的起始地址数据,修改完毕后点击下方的OK按钮即可。操作如下图所示:

【注:我所用ARM MDK版本为5.28。】

基于修改后的配置,再进行编译后即可进行下载调试。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1353

    浏览量

    114411
  • STM32
    +关注

    关注

    2264

    文章

    10852

    浏览量

    354098
  • keil
    +关注

    关注

    68

    文章

    1209

    浏览量

    166529

原文标题:基于KEIL MDK环境调试STM32的两个误会

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    自己做的TAS5825板子软件开发过程中怎么接到PPC3上去调试呢?

    我们打算做一TAS5825的板子,PPC3软件已经申请下来了,有问题是我们自己做的TAS5825板子软件开发过程中怎么接到PPC3上去调试呢?
    发表于 10-15 08:15

    电容充放电过程中电压的变化规律

    电容充放电过程中电压的变化规律是一非常重要的电子学课题,涉及到电容器的基本工作原理和特性。在这篇文章,我们将详细探讨电容充放电过程中电压的变化规律,包括电容的基本特性、充电
    的头像 发表于 07-11 09:43 3574次阅读

    鸿蒙OS开发:典型页面场景【一次开发,多端部署】(资源使用)

    在页面开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置,这些资源的值可能不同。
    的头像 发表于 05-28 09:44 878次阅读
    鸿蒙OS<b class='flag-5'>开发</b>:典型页面场景【一次<b class='flag-5'>开发</b>,多端部署】(资源使用)

    鸿蒙OS开发:【一次开发,多端部署】应用(资源使用)

    在页面开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置,这些资源的值可能不同。
    的头像 发表于 05-21 15:43 920次阅读
    鸿蒙OS<b class='flag-5'>开发</b>:【一次<b class='flag-5'>开发</b>,多端部署】应用(资源使用)

    STM32单片机有哪几种常见的开发环境

    STM32单片机是一款广泛应用于嵌入式系统开发的单片机,针对其开发,有以下几种常见的方式:STM32单片机有哪几种常见的开发
    的头像 发表于 05-18 08:04 2734次阅读
    <b class='flag-5'>STM32</b>单片机有哪几种常见的<b class='flag-5'>开发</b><b class='flag-5'>环境</b>?

    芯海通用 MCU应用笔记 :在 IAR 及 MDK 开发环境下使用 printf 函数重定向移植差异指南

    最新发布的集成开发环境 IAR Embedded Workbench for Arm 9.32 版本已全面支持芯海科技 32 位 MCU 芯片,其 IAR Systems 为芯海科技
    发表于 05-16 11:56

    FPGA开发过程中配置全局时钟需要注意哪些问题

    在FPGA开发过程中,配置全局时钟是一至关重要的步骤,它直接影响到整个系统的时序和性能。以下是配置全局时钟时需要注意的一些关键问题: 时钟抖动和延迟 :全局时钟资源的设计目标是实现最低的时钟抖动
    发表于 04-28 09:43

    如何在Keil MDK-ARM环境开发STM32L011K4T6?

    在Keil MDK-ARM环境开发STM32L011K4T6
    发表于 04-22 06:49

    STM32几种流行的开发环境对比

    流行的开发环境优缺点~一、KeilKeil是一款老牌集成开发环境(IDE),而且是一款通用的IDE,兼容市面上大部分单片机。官网地址:htt
    的头像 发表于 04-21 08:10 2331次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>中</b>几种流行的<b class='flag-5'>开发</b><b class='flag-5'>环境</b>对比

    请问STM32CubeIDE能否生成MDK代码?

    虽然我知道CubeIDE是集成开发环境,代码生成、编辑、编译下载调试都OK,但是想问一下,能否像STM32CubeMX那样,生成代码的时候可以额外选择
    发表于 03-13 08:02

    在BF707开发过程中向Flash烧写一段代码,然后断电进行加载,发现并未加载成功如何解决?

    在BF707开发过程中向Flash烧写过一段代码,然后断电进行加载,发现并未加载成功,当进行如下操作却失败】 1.利用CCES仿真器,在debug情况下对JTAG进行Test结果为OK的,但当
    发表于 01-12 06:03

    ASIC芯片开发过程

    电子发烧友网站提供《ASIC芯片开发过程.ppt》资料免费下载
    发表于 12-25 10:04 1次下载

    stm32定时器能同时控制两个灯以不同频率闪烁吗?

    STM32的定时器功能强大,**STM32的定时器可以同时控制两个灯以不同频率闪烁** 。
    的头像 发表于 12-13 10:43 1824次阅读

    STM32H5开发(5)----串口打印配置

    在使用STM32CUBEIDE开发STM32H5项目时,串口打印被证明是一项极其有益的调试工具,能够在开发过程中实时输出信息和调试数据,起到了至关重要的作用。通过充分利用串口打印功能,
    的头像 发表于 12-01 15:04 887次阅读
    <b class='flag-5'>STM32</b>H5<b class='flag-5'>开发</b>(5)----串口打印配置

    为什么开发过程中有些不带光耦隔离的继电器需要引脚开漏输出控制?

    为什么开发过程中有些不带光耦隔离的继电器需要引脚开漏输出控制
    发表于 11-03 06:41