Hello
I'm having problems placing a variable in a named section with scatter-loading. I'm following Placing functions and data at specific addresses and I can actually see the new section in the map file but then the code is not working:
I have created a section called "CAL" to place some variables. This is my scatter file with the new section in RED;
#! armcc -E --cpu Cortex-M4#define FLASHX_SECT_SIZE 0x800#define USERFLASH_BASE_ADDR 0x00080000#define INTFLASH_BASE_ADDR 0x00000000#define INTFLASH_SIZE (USERFLASH_BASE_ADDR - INTFLASH_BASE_ADDR)#define MY_ALIGN(address, alignment) ((address + (alignment-1)) AND ~(alignment-1))LOAD_REGION_INTFLASH INTFLASH_BASE_ADDR INTFLASH_SIZE{ VECTORS INTFLASH_BASE_ADDR { vectors.o (.vectors_rom,+FIRST) vectors.o (.cfmconfig) }CODE +0 { * (InRoot$$Sections) ; All library sections for example, __main.o, ; __scatter*.o, __dc*.o, and * Region$$Table * (KERNEL) * (TEXT) * (+RO) } ; make sure this alignment matches the alignment in kernel_data.s in the bsp FLASHX_START MY_ALIGN(ImageLimit(CODE), FLASHX_SECT_SIZE) { * (FLASHX) } CALIBRATIONS 0x0007FC00 0x400 { calibrations.o *(CAL) }DATA 0x1FFF0000 {* (+RW) * (+ZI) }USB_BDT MY_ALIGN(ImageLimit(DATA), 512) { * (.usb_bdt) }KERNEL_DATA_START MY_ALIGN(ImageLimit(USB_BDT), 0x10) { * (KERNEL_DATA_START) ; start of kernel data } // KERNEL_DATA_END 0x20007FF0 ; RAM_END KERNEL_DATA_END 0x2000FFF0 ; RAM_END { * (KERNEL_DATA_END) ; end of kernel data }; mem_init writes a storeblock_struct at the end of kernel data, ; max size 32 bytes, so use 0x100 offset// BOOT_STACK_ADDR 0x20007EF0 BOOT_STACK_ADDR 0x2000FEF0 { * (BOOT_STACK) }ARM_LIB_STACKHEAP 0x2000FEE0 EMPTY 0x04 { }}
And I create then a file called "calibrations.c" with a variable declared like this:
const uint64_t device_id __attribute__((section("CAL"))) = 0xA0CDE48B14284E80;
And I can see that section properly being added to the map file:
Execution Region CALIBRATIONS (Exec base: 0x0007fc00, Load base: 0x0004fd70, Size: 0x00000008, Max: 0x00000400, ABSOLUTE)Exec Addr Load Addr Size Type Attr Idx E Section Name Object0x0007fc00 0x0004fd70 0x00000008 Data RO 3818 CAL calibrations.o
And the variable is placed on the correct address:
wbid_mac_address 0x0007fc00 Data 8 calibrations.o(CAL)
But the code is getting stuck in this part:
What else should I do?
Hello, I don't think scatterloading is your issue, as described above it appears to be working correctly.I think you need to add an ISB barrier instruction after enabling interrupts (the CPSIE instruction), as per:infocenter.arm.com/.../index.jsp