在闪存中将内存块定义为IAR中的变量

时间:2017-04-13 09:41:12

标签: memory stm32 iar

我正在使用IAR 7.80开发STM32 mC。 我需要在flash中表示一个特定的内存块作为不同大小的变量。 例如从位置0x0800B00开始我有以下数据: 4个字节是一个浮点数,一个大小为4的字符数组,然后是4个字节,它们是一个uint32_t。 目前我指定了每个变量的具体位置,因此对于上面的例子,我写道:

_Pragma("location=0x0800B000") const float    first_var = 5.0;
_Pragma("location=0x0800B004") const char[4]  second_var = {1,2,3,4};
_Pragma("location=0x0800B008") const uint32_t third_var = 1000;

实际上我有超过100个这样的变量,并且在这个开发阶段中添加/删除变量很常见,因此,每次我删除变量时,我需要重新排列所有变量的位置! 有没有更好的方法来表示这些变量? 注意:我需要能够获取内存块并在PC应用程序中解析它,因此,我需要每个变量完全占用它的大小而不是更多!

3 个答案:

答案 0 :(得分:1)

解决此问题最方便的方法是使用一个具有多个单独字段的结构,每个字段对应一个变量,而不是一组单独的变量。使用此解决方案,您只需指定一次位置,即可保证字段按所需顺序放置,如果使用压缩结构,则可以混合使用不同大小的字段,并确保两者之间没有填充他们。您为此付出的唯一代价是将变量访问转换为struct访问所需的前缀。

答案 1 :(得分:0)

备用方法是以易于解析的文件格式指定变量。例如,您可以使用CSV,并在不同的列中定义类型,名称和默认值。

然后使用脚本langugage读取CSV,并生成C源文件并自动计算偏移量。这很容易用Python之类的东西,它在标准库中有CSV文件例程。

作为额外的奖励,您还可以生成新的CSV文件,其中包含PC软件可以使用的计算偏移量。 PC应用程序将更容易解析,如果必须更改使用不同编译指示语法的嵌入式编译器,则不必修改为解析器。

您可以使用其他文件格式或脚本语言,但基本想法保持不变。您获得了新的工具要求,但获得了很大的灵活性。

答案 2 :(得分:0)

最近的支持是使用以下pragma指令在闪存区域的内存区域中设置变量:

#pragma default_variable_attributes

你也可以为你的功能做同样的事情:

#pragma default_function_attributes

"how to do placement of a group of functions and variables"