如何解决#pragma stm32 IAR 不适用于所有变量
编辑 01/02/2021:由于还没有回复,我添加了一些一般性问题的介绍:
- 为什么在使用#pragma 时变量没有存储在flash 中,而在代码中没有使用该变量,以及如何防止它?
- 我是否必须告诉 IDE(以及链接器)不要使用我想用于变量的闪存(使用 #pragma),否则链接器会知道它而不使用它?
- #pragma 和 config__attribute_((section("... ?
编辑结束..
我正在使用 IAR 8.40.2 在 STM32F030K6T6 上开展现有项目,添加一些新功能,例如存储在闪存中的新变量,以便在断电时保存它们。一些数据已经使用以下代码存储在闪存中:
在 .icf 文件中:
define region DATA_region = mem:[from 0x08007C00 size 0x400 ];
place in DATA_region { readonly section "MYDATA" };
在声明变量部分代码文件中:
#pragma location = "MYDATA"
const STRUCT_NAME FlashParams_config = DEFAULT_FLASH_VALUES;
volatile STRUCT_NAME FlashParams;
在一个函数的代码文件中:
FlashParams = FlashParams_config;
当我检查故意生成的 .hex 附加文件时,我可以在正确的地址看到其中的数据值,但是,当我添加要存储在新的特定闪存地址(如下)的新数据时数据未保存在 flash 中,也未显示在 .hex 文件中:
在 .icf 文件中:
define region DATA_region = mem:[from 0x08007C00 size 0x400 ];
define region new_DATA_region = mem:[from 0x08007800 size 0x400 ];
place in DATA_region { readonly section "MYDATA" };
place in new_DATA_region { readonly section "MYNEWDATA" };
在声明变量部分代码文件中:
#pragma location = "MYNEWDATA"
const uint16_t NewData = 0xABCD ;
#pragma location = "MYDATA"
const STRUCT_NAME FlashParams_config = DEFAULT_FLASH_VALUES;
volatile STRUCT_NAME FlashParams;
volatile uint16_t operand ;
在一个函数的代码文件中:
FlashParams = FlashParams_config ;
operand = NewData ;
这是我的问题:
-
我以与保存的第一个数据相同的方式将其添加到每个文件中,但它不起作用,除非我将地址直接放在#pragma location = 0x08007800 中。为什么?
-
是否强制要求 IAR 的链接器停止将代码放置在闪存地址 0x800 77FF(项目 -> 选项 -> 链接器 -> 配置 -> 编辑 -> 内存区域 -> end = 0x80077FF)以让它释放了我的数据所需的空间,以便在之后立即存储,或者链接器会自动预订该地址,这要归功于 #pragma 之后声明的数据?
-
如果我不使用要存储的数据(例如,如果我不写
FlashParams = FlashParams_config;
),则数据不会存储在我的 .hex 文件中。这是正常的吗?我猜链接器不会保留未使用的数据,即使我“强制”将它们存储在特定的闪存位置 -
写作有什么区别
这个:
*#pragma location = 0x080078000* *const STRUCT_NAME FlashParams_config = DEFAULT_FLASH_VALUES;*
和
volatile *STRUCT_NAME FlashParams_config__attribute__((section(".specific_name_location"))) = DEFAULT_FLASH_VALUES*
*specific_name_location*
值在哪里初始化?我无法在我工作的项目库中找到它的价值。
- 在 IAR pragma 技术说明 27498 (placing a group of functions or variables in a specific section) 中,写到可以用一行命令保存多个数据:#pragma default_variable_attributes = @ "MY_DATA" 而不是写#pragma location="MY_DATA" 在要存储的每个数据之前。 default_variable_attributes 是什么意思?代码中可以这样写吗?
提前谢谢你 =) =)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。