【发布时间】:2019-03-06 15:10:05
【问题描述】:
我正在尝试让 ARMCC 链接器将变量放入未初始化的 RAM 区域(因为我需要它们在重置后仍然存在),但失败了。我在分散链接文件中创建的区域指定了UNINIT,并且在我的__attribute__ 调用中,我指定这是zero_init RAM(否则我知道ARM 链接器认为它是Data无论你说什么,RAM 和零初始化它)。对于.map 文件下方的我的测试代码,显示链接器正在将我的测试变量放入正确的区域:
Execution Region RW_IRAM1 (Base: 0x200032ac, Size: 0x00000004, Max: 0x00000400, ABSOLUTE, UNINIT)
Base Addr Size Type Attr Idx E Section Name Object
0x200032ac 0x00000004 Zero RW 8 .bss.noinit main.o
还有这个测试代码:
#include "mbed.h"
// An unsigned int in an uninitialised RAM area
__attribute__ ((section(".bss.noinit"), zero_init))
unsigned int gRetained;
// Entry point
int main()
{
printf("Retained RAM variable is %d.\n", gRetained);
gRetained++;
printf("Retained RAM variable incremented to %d.\n", gRetained);
printf("Resetting...\n");
wait_ms(1000);
NVIC_SystemReset();
}
...我得到的输出是:
Retained RAM variable is 0.
Retained RAM variable incremented to 1.
Resetting...
Retained RAM variable is 0.
Retained RAM variable incremented to 1.
Resetting...
Retained RAM variable is 0.
...
谁能发现我做错了什么?
这是我的完整分散链接文件,其中RW_IRAM1 是我正在谈论的区域:
#! armcc -E
/* Default to no softdevice */
#if !defined(MBED_APP_START)
#define MBED_APP_START 0x0
#endif
#if !defined(MBED_APP_SIZE)
#define MBED_APP_SIZE 0x80000
#endif
/* Physical RAM */
#define MBED_RAM_PHYSICAL_START 0x20000000
#define MBED_RAM_PHYSICAL_SIZE 0x10000
/* Reserved areas */
#define MBED_RAM_SOFT_DEVICE_SIZE 0x31d0
#define MBED_RAM_UNINIT_AREA_SIZE 1024
/* If app_start is 0, do not set aside space for the softdevice */
#if MBED_APP_START == 0
#define MBED_RAM_START MBED_RAM_PHYSICAL_START
#define MBED_RAM_SIZE MBED_RAM_PHYSICAL_SIZE
#else
#define MBED_RAM_START (MBED_RAM_PHYSICAL_START + MBED_RAM_SOFT_DEVICE_SIZE)
#define MBED_RAM_SIZE (MBED_RAM_PHYSICAL_SIZE - MBED_RAM_SOFT_DEVICE_SIZE)
#endif
#define MBED_RAM0_START MBED_RAM_START
#define MBED_RAM0_SIZE 0xDC
#define MBED_RAM1_START (MBED_RAM0_START + MBED_RAM0_SIZE)
#define MBED_RAM1_SIZE MBED_RAM_UNINIT_AREA_SIZE
#define MBED_RAM2_START (MBED_RAM1_START + MBED_RAM1_SIZE)
#define MBED_RAM2_SIZE (MBED_RAM_SIZE - MBED_RAM0_SIZE - MBED_RAM1_SIZE)
LR_IROM1 MBED_APP_START MBED_APP_SIZE {
ER_IROM1 MBED_APP_START MBED_APP_SIZE {
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM0 MBED_RAM0_START UNINIT MBED_RAM0_SIZE { ;no init section
*(*nvictable)
}
RW_IRAM1 MBED_RAM1_START UNINIT MBED_RAM1_SIZE { ;no init section
*(*noinit)
}
RW_IRAM2 MBED_RAM2_START MBED_RAM2_SIZE {
.ANY (+RW +ZI)
}
}
仅供参考,这是在具有 64 KB RAM 的 Nordic NRF52832 芯片上,我碰巧正在使用 mbed-os 构建,但我不认为这应该与问题有关。 ARMCC 版本是 5.06 update 6 (build 750)。
【问题讨论】:
标签: linker-scripts armcc