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

Memory 将闪存中的内存块定义为IAR中的变量,memory,stm32,iar,Memory,Stm32,Iar,我正在使用IAR7.80开发STM32 mC。 我需要将闪存中的特定内存块表示为不同大小的变量。 例如,从位置0x0800B00开始,我有以下数据: 4个字节是浮点,一个大小为4的字符数组,然后是4个字节是uint32\t。 目前,我指定每个变量的具体位置,以便在上面的示例中编写: _Pragma("location=0x0800B000") const float first_var = 5.0; _Pragma("location=0x0800B004") const char[4]

我正在使用IAR7.80开发STM32 mC。 我需要将闪存中的特定内存块表示为不同大小的变量。 例如,从位置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应用程序中获取内存块并解析它,因此,我需要每个变量精确地占用它的大小,而不是更多

解决这个问题最方便的方法是使用一个结构,其中包含多个单独的字段,每个字段对应一个变量,而不是一组单独的变量。使用此解决方案,您只需指定一次位置,就可以保证字段按您想要的顺序放置,并且,如果使用打包结构,您可以混合不同大小的字段,并且仍然可以确保它们之间没有填充。您为此付出的唯一代价是将变量访问转换为结构访问所需的前缀。

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

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

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


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

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

#pragma默认值_变量_属性

您也可以对您的功能执行相同的操作:

#pragma default_function_属性