对于为何将特定的变量、数组(例如数据表或函数)分配到确定的内存地址,存在多种原因。
校验和可能必须出现在特定的地址,或者需要将函数定位到特别划定的内存区块中。此外,取决于你所使用的编译器,你可能会有机会自定义分配特殊的内存区域。
该问题源于我之前分享的文章《STM32开发辅助工具:STM Studio的调试与诊断指南》。有读者在文章发布后提出了以下问题:
如何在我希望的特定内存地址中定位到一个变量,而这一操作又该如何通过C语言代码实现?
一、再次探索STM Studio
在之前发布的STM Studio的介绍文章后,许多读者表现出了浓厚的兴趣,并迅速下载安装了这一工具进行尝试。
在这里,我将简要回顾一下STM Studio相关的核心概念:变量。
STM Studio支持四种类型的变量管理:
•由独立物理地址确定的相对变量。
•统计变量,能够派生出绝对变量的极值、均值、标准差等统计指标。
•表达式变量,它们是通过数学表达式计算得到的,表达式中可能包含绝对变量或统计变量再结合数学运算符(如+、-、*、/等),举例来说:(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进行查看指定地址变量了:
好了,先写到这里,希望对大家有帮助。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !