主题中讨论的其他器件:ARM-CGT
工具/软件:
使用 ARM-CGT v20.2.7LTS
我在闪存中有一个定义的区域、我想放置一些数据。 我有一个结构在头文件中定义,然后在.cpp 中实例化,包装在 set_data_section() 中
appBlk.cpp:
pragma SET_DATA_SECTION(“.appblk")“)
#pragma RETAIN
const AppBlk ApplicationBlock{NEO_magic_number、
(uint32_t)&_APP_START、
(uint32_t)&_APP_END、
(uint32_t)&_c_int00、
(uint32_t)&_appblk_CRC、
(uint32_t)&_APP_CRC};
#pragma SET_DATA_SECTION ()
在链接器命令文件中、有一个存储器区域和部分:
移动数据
{
。 。 。
APPBLK (R):origin=APP_BLK_LOC length=APP_BLK_SIZE vfill = 0xffffffff
FLASH0 (RX):origin=APP_LOC length=(FLASH0_SIZE - APP_LOC) vfill = 0xffffff
FLASH1 (RX):origin=FLASH1_LOC length=FLASH1_SIZE vfill = 0xffffff
。 。 。
.appblk palign (8)、fill = 0xffffffff:{}load = APPBLK、load_start (_appblk_start)、load_end (_appblk_end)、crc_table (_appblk_crc、算法=TMS570_CRC64_iso)
。 。 。
使用优化级别 4 进行编译时、这种方法非常有效
.map:
存储器配置
使用的名称原点长度未使用的 attr 填充
---------------------------- ----- ----- ----- ----- ---------------
矢量 00000000 00000040 00000000 00000040 X (ffffffff)
引导 00000040 0001ffc0 00000000 0001ffc0 R (ffffff)
APPBLK 00020000 00000100 00000080 00000080 R (ffffff)
FLASH0 00020100 001dff00 00025788 001ba778 R X (ffffff)
FLASH1 00200000 00200000 00000000 00200000 R X (ffffff)
。 。 。
段分配映射
运行源服务器加载源服务器长度初始化长度吸引成员
----- ----- ----- ----- ----- -----
00020000 00020000 00000080 00000080 r--
00020000 00020000 00000080 00000080 r-- .appblk
00020120 00020120 00025768 00025768 r-x
00020120 00020120 00000030 00000030 r-x .intvecs
00020150 00020150 00022df0 00022df0 r-x .text
。 。 。
段分配映射
输出属性/
段页原点长度输入段
----- ------------------------ ----- ------------------------
.appblk 0 00020000 00000080
00020000 00000080 AppBlk.obj (.appblk)
在优化关闭或最多为 3 的情况下进行编译以进行调试时、会出现以下错误:
警告#99922: app.out:访问“.appblk"段“段的原始数据(根据其段属性未初始化);对原始数据的更改可能会丢失
.map:
存储器配置
使用的名称原点长度未使用的 attr 填充
---------------------------- ----- ----- ----- ----- ---------------
矢量 00000000 00000040 00000000 00000040 X (ffffffff)
引导 00000040 0001ffc0 00000000 0001ffc0 R (ffffff)
APPBLK 00020000 00000100 00000080 00000080 R (ffffff)
FLASH0 00020100 001dff00 0002ea24 001b14dc R X (ffffff)
FLASH1 00200000 00200000 00000000 00200000 R X (ffffff)
。 。 。
段分配映射
运行源服务器加载源服务器长度初始化长度吸引成员
----- ----- ----- ----- ----- -----
00020000 00020000 00000080 00000000 RW-
00020000 00020000 00000080 00000000 rw- .appblk
00020120 00020120 0002ea04 0002ea04 r-x
00020120 00020120 00000030 00000030 r-x .intvecs
00020150 00020150 0002a208 0002a208 r-x .text
。 。 。
段分配映射
输出属性/
段页原点长度输入段
----- ------------------------ ----- ------------------------
.appblk 0 00020000 00000080 未初始化
00020000 00000080 AppBlk.obj (.appblk)
由于某种原因、存储器区域从只读切换到读写、并且该段为空。 我想应该在启动时填充一个副本。
如何强制该段为只读段、以便链接器将数据放置在那里? 我只是不明白!