This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

issue using at with KEIL update

After updating KEIL from 4.23 to 4.71a I am no longer able to write to a specific address. Lines such as these:

static const int8u s_software_version_rev_string[VERSION_NUMBER_LENGTH]  __attribute__((section(".ARM.__AT_0x00031024") ) ) = "XXXXXXXXX";
static const int8u s_software_version_date_string[16] __attribute__( (at(APPLICATION_TOKEN_ADDR+0x30) ) ) =__DATE__;

Give these errors:
..\bin\IAPP.axf: Error: L6985E: Unable to automatically place AT section version.o(.ARM.__AT_0x00031024) with required base address 0x00031024. Please manually place in the scatter file using the --no_autoat option.

..\bin\IAPP.axf: Error: L6985E: Unable to automatically place AT section version.o(.ARM.__AT_0x00031034) with required base address 0x00031034. Please manually place in the scatter file using the --no_autoat option.

IROM1 is specified from 0x0 to 0x80000 and IRAM1 is specified starting from 0x40000000.

Notes: Placing manually in scatter file gives overlapping errors, if I place the sections in IRAM sections it will work, but I need to place in IROM @ specific addresses. Only thing changed was version of KEIL.

Anyone have any ideas? Am I missing something? Thanks for the help!

  • What does your example look like when it's been preprocessed only? What is the value of VERSION_NUMBER_LENGTH? Perhaps the two variables overlap. Or maybe they overlap something else?

    On the first definition, are you really using ".ARM.__AT_0x..."? The documented way is ".ARM.__at_0x..."

  • What do you mean by preprocessed only example?

    The values don't overlap because even if I just place 1 variable into memory it gives the same error, and before I updated KEIL it worked fine. As for the case-sensitivity of the AT, both ways gives the same result I do not believe it is case sensitive.

    It has something to do with the scatter file I think. Right now for IROM I have 2 ER's within an LR that looks like this:

    LR_IROM1 0x10000 0x6DFFFF  {    ; load region size_region
      ER_IROM1 +0 0x1000  {  ; load address = execution address
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
      }
       ER_IROM2 +0 0x55EA8{
       .ANY (+RO)
       }
    
    
    
    This DOES WORK in KEIL 4.23, but not in 4.71a. Was there a major change in scatter-loading or specific memory placement inbetween those versions? Thanks!!!