您好,
我正在使用S32K358和S32 Design Studio (S32DS)作为集成开发环境。我想为某些变量保留特定的内存区域,并确保这些分配在版本期间不受编译器或链接器的影响,尤其是在项目稍后引入新变量或数组时。
我需要为自己的变量专门分配一部分内存。这些变量应放置在固定的内存位置,并且在将来的软件版本或更新期间不得被编译器/链接器移动或覆盖。
我想在闪存或数据闪存中为持久数据存储预留区域。例如
应用程序有效标志
引导程序有效标志
包含配置或运行状态数据的数组或结构
这些变量应存储在固定的内存地址上,不受固件重新编程或段落重新定位的影响,其功能与 EEPROM 类似。
如何在S32DS 中配置项目设置,为变量(RAM、闪存或数据闪存)保留和分配特定的内存地址?
如何在代码中声明变量,以便将它们放入这些自定义内存区域?
如果 S32DS 或编译器没有为此提供直接设置,我如何手动修改链接器脚本以定义和保留这些特定内存区域?
感谢并致意
卡尔梅根 C
嗨,@karmegancjk、
1.
是的,如果您将变量/常量放在章节中,它就会保留在章节中。
2.
我想只有在写入访问时才会这样。
3.
如前所述,使用热电阻 FEE 驱动程序。
在驱动程序的安装目录中,您可以找到《FEE 用户手册》--其中特别提到了在引导加载程序和应用程序中使用 FEE 驱动程序时的用例。
此致,
丹尼尔
嗨,丹尼尔
上述 "内存强制 "方法假定了未来应用程序代码大小的增加。编译器或代码能否访问我的自定义内存区域?
当我尝试直接访问 My_array[] 时,遇到了硬故障。
解释一下我的情况:我在 MCU 上运行了引导加载程序和应用程序代码。当从应用程序代码过渡到引导加载程序(或反之)时,我使用了诸如 application_valid_flag 和 boot_valid_flag 这样的标志。我想在自定义内存区域中声明这些标志,以确保它们不受内存地址增量或编译器优化的影响。此外,我还需要 16KB 闪存,我想把它当作 EEPROM 使用。重要的是,这 16KB 部分应保持不变。我该如何处理这种情况?
感谢并致意
卡尔梅根 C
嗨,@karmegancjk、
1.
my_array 数据不能被覆盖。
您需要先擦除 0x00A00000 的整个扇区(0x00A00000 - 0x00A02000)。
改用 RTD FEE 驱动程序。
2.
当然,这是非易失性闪存。
此致,
丹尼尔
嗨,丹尼尔
1.我检查了变量名及其内存位置,它们都列在 .map 中。锉刀
uint32_t my_array[10]__attribute__(( section(".my_section")));
记忆命令:
内存
{
int_pflash : ORIGIN = 0x00400000, LENGTH = 0x00600000 /* 6144KB */
int_pflash0 : ORIGIN = 0x00A00000, LENGTH = 0x001D4000 /* 1872KB - 176KB (sBAF + HSE)*/
}
科室指挥:
我的问题是
如何使用数组 my_array[](读写操作)?
上电复位后,阵列 my_array [] 能否保留来自 0x00a00000 地址的数据?
MCU - S32K358
SW - RTD 4.0.0
ide - s32ds 3.5.13IDE
嗨,卡尔梅根 C、
1.
在那里无法写作。
需要先擦除闪存扇区(0x2000 大小)。
您可以使用 DFlash 上的 FEE 驱动程序来处理闪存中的非易失变量。
2.
检查 .map文件。
您应该能够找到数据名称及其位置。
此致,
丹尼尔
嗨,丹尼尔
如果在 int_pflash0 自定义闪存部分或 int_dflash0 自定义数据闪存部分放置一个变量,如何访问该变量?由于写入闪存需要高压操作,是否可以直接写入闪存或 DFlash 存储器区域中的变量?
如何验证我创建的闪存或 DFlash 内存区域是否正确?
感谢和问候,
Karmegan C
嗨,@karmegancjk、
这取决于编译器。例如,GCC 不支持将变量直接放在特定地址上。相反,GCC 要求您将变量放在命名的部分中,然后使用链接器脚本将这些部分分配到特定的内存地址。
请参阅任何 RTD 示例,链接文件已经定义了多个内存部分。您可以通过参考这些现有章节并根据需要对其进行扩展来创建新章节。
例如,在int_sram_no_cacheable中放置变量:
#pragma GCC section bss ".mcal_bss_no_cacheable"
uint8_t variable;
#pragma GCC section bss
下面是一个使用 ITCM 和 DTCM 的示例,链接器文件因此被修改。
此致,
丹尼尔