
将变量、数组(例如表或函数)存储到特定地址的原因有很多。
校验和可能需要位于某个地址,可能需要将函数放在特定的内存位置,根据使用的编译器,可以选择设置特定的内存区域。
这个问题是在前面分享文章《STM32开发工具之STM Studio调试和诊断工具讲解》之后,有读者提出来的问题。
我需要在固定的内存地址找到一个变量,如何使用C源代码执行此操作?
一、回顾STMStudio
前不久分享STMStudio文章之后,很多朋友对这个工具比较感兴趣,也第一时间下来安装使用了该工具。
这里简单说一下STMStudio与本文相关的内容:变量。
STMStudio可管理四种变量:
•由物理存储地址标识的绝对变量。
•能够计算绝对变量的最小值、最大值、平均值和标准差等值的统计变量。
•表达式变量是数学表达式计算的结果。表达式是绝对变量或统计变量与数学运算符(+,-,*,/…)的组合,例如:(Variable1+Variable2)*Variable3。注意,表达式变量是在统计变量之后求值的,因此不可能计算表达式的统计值。
•包含用户可配置信息的插件变量。
(为了节约时间,使用有道翻译的句子,大家请结合原文理解)

可以看得出来,局部变量是不支持的。
J-Scope
这个STMStudio工具和J-Scope有类似之处,也能查看变量、波形:


J-Scope也是一个不错的工具,大家可以下载安装试试:
https://www.segger.com/products/debug-probes/j-link/tools/j-scope
二、回归主题
如何将变量存储在指定内存地址?
不同的编译器,会有不同的方法,这里主要结合MDK说下基于AC5和AC6编译,简述其中的方法。
结合STM32F103ZE,有64K(0x10000)内存。
1.针对AC5(ARMCC Compiler version 5.x)
定义一个变量cnt到指定内存地址:0x20008000
uint8_t cnt __attribute__((at(0x20008000)));
2.针对AC6(ARM Compiler 6 (又名ARMCLANG))
定义一个变量cnt到指定内存地址:0x20008000
uint8_t cnt __attribute__((section(".ARM.__at_0x20008000")));
这个地方进行分段:

这样指定内存地址,即可使用STMStudio进行查看指定地址变量了:

好了,先写到这里,希望对大家有帮助。
-
ARM
+关注
关注
135文章
9588浏览量
393679 -
keil
+关注
关注
69文章
1232浏览量
173174 -
MDK
+关注
关注
4文章
211浏览量
33730
发布评论请先 登录
如何为 S32DS 中的特定变量(RAM、闪存、数据闪存)强制使用特定内存区域?
使用 Keil Studio for Visual Studio Code开发 STM32 设备
【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配
有新版keil MDK-ARM V5 注册机安装包不,孩子下载keil卡在许可码过期了,救救孩子吧
LAT1185+一个地址未对齐引起的 HardFault 异常应用笔记
聊聊MCU下载算法在Keil MDK里的那些事儿
不同位数的CPU的变量所占的内存
在Keil5中查看栈大小
CW32 MCU用什么IDE开发?
如何将某个函数或变量放在固定的地址 ?
请问Modus Toolbox下针对CYW20719B2编程,能否指定全局变量地址?
从Keil MDK到IAR EWARM:通过工程迁移实现项目资产的更好管理
如何将变量存储在指定内存地址 (基于Keil MDK-ARM)
评论