Skip to content

M487: Crash report test failed in IAR #9069

@ccli8

Description

@ccli8

Description

Target:
NUMAKER_PFM_M487

Toolchain:
IAR

mbed-os:
0a832dd (HEAD -> master, origin/master, origin/HEAD) Merge pull request #9051 from michalpasztamobica/esp8266_busy_signal

The test item mbed-os-tests-mbed_platform-crash_reporting / mbed-os-tests-mbed_platform-crash_reporting is passed in ARM/ARMC6/GCC_ARM, but failed in IAR. Per my checking, the crash data ram base/limit __CRASH_DATA_RAM_START__/__CRASH_DATA_RAM_END__ calculated in M487.icf are incorrect because IAR linker doesn't arrange memory as simply expected.

In mbed-os/targets/TARGET_NUVOTON/TARGET_M480/device/TOOLCHAIN_IAR\M487.icf:

/* Define Crash Data Symbols */
define exported symbol __CRASH_DATA_RAM_START__ = __ICFEDIT_region_IRAM_start__ + __ICFEDIT_size_cstack__ + __ICFEDIT_size_intvec__;
define exported symbol __CRASH_DATA_RAM_END__ = __ICFEDIT_region_IRAM_start__ + __ICFEDIT_size_cstack__ + __ICFEDIT_size_intvec__ + __ICFEDIT_size_crash_data__;

In mbed-os/platform/mbed_crash_data_offsets.h:

#if MBED_CONF_PLATFORM_CRASH_CAPTURE_ENABLED
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
extern uint32_t Image$$RW_m_crash_data$$ZI$$Base[];
extern uint32_t Image$$RW_m_crash_data$$ZI$$Size;
#define __CRASH_DATA_RAM_START__    Image$$RW_m_crash_data$$ZI$$Base
#define __CRASH_DATA_RAM_SIZE__     Image$$RW_m_crash_data$$ZI$$Size
#elif defined(__ICCARM__)
extern uint32_t __CRASH_DATA_RAM_START__[];
extern uint32_t __CRASH_DATA_RAM_END__[];
#define __CRASH_DATA_RAM_SIZE__     (__CRASH_DATA_RAM_END__ - __CRASH_DATA_RAM_START__)
#elif defined(__GNUC__)
extern uint32_t __CRASH_DATA_RAM_START__[];
extern uint32_t __CRASH_DATA_RAM_END__[];
#define __CRASH_DATA_RAM_SIZE__     (__CRASH_DATA_RAM_END__ - __CRASH_DATA_RAM_START__)
#endif /* defined(__CC_ARM) */

If I change __CRASH_DATA_RAM_START__/__CRASH_DATA_RAM_END__ as below, the test is passed. But this change cannot apply to all targets because CRASH_DATA_RAM is defined only in NUMAKER_PFM_M487 target or some.

#elif defined(__ICCARM__)
extern uint32_t CRASH_DATA_RAM$$Base[];
extern uint32_t CRASH_DATA_RAM$$Limit[];
#define __CRASH_DATA_RAM_START__    CRASH_DATA_RAM$$Base
#define __CRASH_DATA_RAM_END__      CRASH_DATA_RAM$$Limit
#define __CRASH_DATA_RAM_SIZE__     (__CRASH_DATA_RAM_END__ - __CRASH_DATA_RAM_START__)

Besides, checking mbed-os/platform/mbed_crash_data_offsets.h, the unit of CRASH_DATA_RAM_SIZE doesn't match across all toolchains. In ARM/ARMC6, it is byte, but in IAR/GCC_ARM, it is word.

Issue request type

[ ] Question
[ ] Enhancement
[x] Bug

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions