Problem writing/reading shared ocram RT1170 EVKB

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Problem writing/reading shared ocram RT1170 EVKB

632 Views
cyberhelmer
Contributor II

I'm having troubles setting up shared ocram between M7 and M4 core on the RT1170 using the RT1170 EVKB and was hoping someone can help me. Been pulling my hair out for two days!

I do get it to somewhat work but it is very inconsistent. I'm trying to write data to a shared buffer from M7, signal M4 using MCMGR and then read the data from ocram. 

I have a section specifically for this buffer in both linkers and no other data is placed here and I think I have set the MPU_Config correctly to make all of ocram non-cacheable. 

I do get MCMGR to trigger the M4 event handler reliably, but it doesn't consistently read the latest data written by M7. When messing around trying different stuff I sometimes get it to read the data, but then reading old data on the next MCMGR interrupt. When printing from the M7 I can clearly see the correct data is being written into the shared adresses. 
 
When printing the memory addresses from each core they are the same for each field in this struct and it does sometimes read correct data so I'm pretty confident we are actually operating on the same memory. 

For testing enter a forever loop in M7 boot_task that increments counters and writes the data to the buffer every 2 seconds and trigger the M4 to read. The purpose is to have a ring buffer the m7 writes to but I got corrupted data so I scaled back to a simpler test which revealed something is off. 

M7 print:
Buffer: 20270000, Magic: 20270000, Seq: 20270004, Len: 20270008, Data: 20270010
M4 print:
Buffer: 20270000, Magic: 20270000, Seq: 20270004, Len: 20270008, Data: 20270010

 
typedef struct __attribute__((aligned(32)))
{
    uint32_t magic;
    volatile uint32_t seq; /* increments each write from M7 */
    uint32_t len;
    uint32_t _pad0; /* padding */
    uint8_t data[IPC_TESTBUF_BYTES];
} ipc_testbuf_t;

 

// M4 boot_task.c
extern "C" void boot_task(void *param)
{
    (void)param;
    PRINTF("\nM4 boot_task started");
    PRINTF("\n[M4] build time: %s, git %s\r\n", M4_BUILD_TIME, M4_GIT_SHA);

    /* Register IPC wake event handler ONCE */
    (void)MCMGR_RegisterEvent(ipc_message,
                             M4_ipc_event_handler,
                             (void*)0);
    PRINTF("\nRegistrer mcmgr event handler");

    /* 7) Signal M7 we are ready (boot complete) */
    {
        uint32_t startupData;
        mcmgr_status_t status;
        do { status = MCMGR_GetStartupData(&startupData); }
        while (status != kStatus_MCMGR_Success);

        (void)MCMGR_TriggerEvent(kMCMGR_RemoteApplicationEvent, 1U);
    }

    for (;;)
        vTaskDelay(pdMS_TO_TICKS(1000));
}

// M7 boot_task.c
void boot_task(void *param)
{
    (void)param;

    (void)MCMGR_Init();

    (void)MCMGR_RegisterEvent(kMCMGR_RemoteApplicationEvent,
                             RemoteAppReadyEventHandler,
                             (void *)&s_m4ReadyEventData);

    ipc_print_buffer_init_primary();

    PRINTF("\nStarting M4 core");
    (void)MCMGR_StartCore(kMCMGR_Core1,
                         (void *)(char *)CORE1_BOOT_ADDRESS,
                         0,
                         kMCMGR_Start_Synchronous);

    while (APP_READY_EVENT_DATA != s_m4ReadyEventData)
    {
    }
    PRINTF("\nM4 running");

    for (;;)
    {
        vTaskDelay(pdMS_TO_TICKS(2000));

        ipc_increment_seq_and_kick_m4();
    }

    vTaskDelete(NULL);
}


code/boards/rt1170/rt1170_shared/ipc_core.h
#pragma once

#include <stdint.h>
#include <stddef.h>

#include "mcmgr.h"
#include "FreeRTOS.h"
#include "task.h"

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ipc_message
#define ipc_message kMCMGR_FreeRtosMessageBuffersEvent
#endif

typedef enum
{
    IPC_PRINT_BUF        = 3,
} ipc_event_t;

/* --------------------------------------------------------------------------
 * Linker symbols (BOTH images) - for debug/sanity only
 * -------------------------------------------------------------------------- */
extern uint8_t __SHARED_PRINTF_START[]; /* ORIGIN(m_shared_printf) */
extern uint8_t __SHARED_PRINTF_SIZE[];  /* LENGTH(m_shared_printf)  */

/* section-content boundaries (debug only) */
extern uint8_t __SHARED_PRINTF_START__[];
extern uint8_t __SHARED_PRINTF_END__[];

/* --------------------------------------------------------------------------
 * Shared test buffer (M7 writes, M4 reads)
 * Lives in m_shared_printf (2 KB) via section ".shared_printf"
 * -------------------------------------------------------------------------- */
#ifndef IPC_TESTBUF_BYTES
#define IPC_TESTBUF_BYTES 128u
#endif

#define IPC_TESTBUF_MAGIC (0x54455354u) /* 'TEST' */

typedef struct __attribute__((aligned(32)))
{
    uint32_t magic;          
    volatile uint32_t seq;    /* increments each write from M7 */
    uint32_t len;             
    uint32_t _pad0;           /* padding */

    uint8_t data[IPC_TESTBUF_BYTES];
} ipc_testbuf_t;

/* Shared object placed in ".shared_printf" */
extern volatile ipc_testbuf_t g_ipc_testbuf;

/* CM7 ONLY: clear shared printf object once at boot, set initial values*/
void ipc_print_buffer_init_primary(void);

/* Accessor */
volatile ipc_testbuf_t *ipc_testbuf(void);

/* Test function */
void ipc_increment_seq_and_kick_m4();

void M4_ipc_event_handler(uint16_t eventData, void *context);

#ifdef __cplusplus
}
#endif


}

// code/boards/rt1170/rt1170_shared/ipc_core.c 
 // code/boards/rt1170/rt1170_shared/ipc_core.c
#include "ipc_core.h"

#include <string.h>
#include "fsl_debug_console.h"

#if defined(CPU_MIMXRT1176DVMAA_cm7)
#include "core_cm7.h"   /* SCB_CleanDCache_by_Addr */
#endif

/* --------------------------------------------------------------------------
 * Shared object allocated in linker-reserved shared OCRAM
 * MUST live in ".shared_printf" (m_shared_printf, 2KB)
 * -------------------------------------------------------------------------- */
__attribute__((section(".shared_printf"), aligned(32)))
volatile ipc_testbuf_t g_ipc_testbuf;

static inline void dmb(void)
{
#if defined(__ARMCC_VERSION) || defined(__GNUC__) || defined(__ICCARM__)
    __asm volatile ("dmb" ::: "memory");
#endif
}


volatile ipc_testbuf_t *ipc_testbuf(void)
{
    return &g_ipc_testbuf;
}

/* --------------------------------------------------------------------------
 * CM7 ONLY: clear the shared printf object once.
 * -------------------------------------------------------------------------- */
void ipc_clear_print_buffer(void)
{
    memset((void *)&g_ipc_testbuf, 0, sizeof(g_ipc_testbuf));
}

/* --------------------------------------------------------------------------
 * CM7: init + write + kick
 * -------------------------------------------------------------------------- */
void ipc_print_buffer_init_primary(void)
{
    ipc_clear_print_buffer();

    volatile ipc_testbuf_t *buffer = &g_ipc_testbuf;

    buffer->magic = IPC_TESTBUF_MAGIC;
    buffer->seq   = 0u;
    buffer->len   = 0u;
    memset((void*)buffer->data, 0, IPC_TESTBUF_BYTES);

    PRINTF("\nMagic: %u, Seq: %u, Len: %u",
                   buffer->magic,
                   buffer->seq,
                   buffer->len);
}

void ipc_increment_seq_and_kick_m4()
{
    volatile ipc_testbuf_t *buffer = &g_ipc_testbuf;

    static int testCounter = 0;

    buffer->magic = IPC_TESTBUF_MAGIC;
    buffer->seq = testCounter;
    buffer->len = testCounter;

    testCounter++;

    PRINTF("\nMagic: %u, Seq: %u, Len: %u",
                   buffer->magic,
                   buffer->seq,
                   buffer->len);

    /* Tried cleaning cache but makes no difference, ocram should already be configured non cacheable */
    // __DMB();
    // SCB_CleanDCache_by_Addr((uint32_t*)buffer, sizeof(*buffer)); 
    // __DMB();

    /* Doorbell */
    (void)MCMGR_TriggerEventForce(ipc_message, (uint16_t)IPC_PRINT_BUF);
}

/* --------------------------------------------------------------------------
 * M4: event handler
 * -------------------------------------------------------------------------- */
#if defined(CPU_MIMXRT1176DVMAA_cm4)
void M4_ipc_event_handler(uint16_t eventData, void *context)
{
    (void)context;
    BaseType_t hpw = pdFALSE;
    static int eventsHandled = 0;

    switch ((ipc_event_t)eventData)
    {
        case IPC_PRINT_BUF:
        {
            // PRINTF here just for testing, printing from task makes no difference
            eventsHandled++;
            __DMB();
            volatile const ipc_testbuf_t *buffer = ipc_testbuf();

            uint32_t magic = buffer->magic;
            uint32_t seq   = buffer->seq;
            uint32_t len   = buffer->len;

            PRINTF("\nEventsHandled: %d, Magic: %lu, Seq: %lu, Len: %lu",
                eventsHandled,
                (unsigned long)magic,
                (unsigned long)seq,
                (unsigned long)len);
            break;
        }
        default:
            break;
    }
    portYIELD_FROM_ISR(hpw);
}
#endif

Linkers:
// M7/armgcc/MIMXRT1176xxxxx_cm7_flexspi_nor.ld 
 /* M7/armgcc/MIMXRT1176xxxxx_cm7_flexspi_nor.ld
** M7 XIP-from-FlexSPI with OCRAM partition + M4 core1 image
*/

ENTRY(Reset_Handler)

HEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
RPMSG_SHMEM_SIZE = DEFINED(__use_shmem__) ? 0x2000 : 0;
VECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x00000400 : 0;

/* --- Reserve last 10 MB of 64 MB flash for M4 --- */
CORE1IMAGE_START = DEFINED(__use_flash64MB__) ? 0x33600000 : 0x30FC0000;

/* m_text starts at 0x30002400 */
TEXT_SIZE = CORE1IMAGE_START - 0x30002400;

/* --------------------------------------------------------------------------
 * Shared OCRAM regions (ONLY TWO):
 *  - m_shared_params  : 64 KB  (DSP parameter structs etc)
 *  - m_shared_printf  : 2 KB   (M7->M4 printf buffer)
 * -------------------------------------------------------------------------- */
SHARED_PARAMS_SIZE = 0x00010000; /* 64 KB */
SHARED_PRINTF_SIZE = 0x00000800; /* 2 KB  */

MEMORY
{
  m_flash_config   (RX) : ORIGIN = 0x30000400, LENGTH = 0x00000C00
  m_ivt            (RX) : ORIGIN = 0x30001000, LENGTH = 0x00001000
  m_interrupts     (RX) : ORIGIN = 0x30002000, LENGTH = 0x00000400
  m_text           (RX) : ORIGIN = 0x30002400, LENGTH = TEXT_SIZE

  /* Renamed for clarity */
  m_itcm           (RX) : ORIGIN = 0x00000000, LENGTH = 0x00040000
  m_dtcm           (RW) : ORIGIN = 0x20000000, LENGTH = 0x00040000

  /* OCRAM 1MB: 0x20240000..0x2033FFFF (partitioned) */
  m_ncache_local   (RW) : ORIGIN = 0x20240000, LENGTH = 0x00020000  /* 128KB */

  /* Two explicit shared regions */
  m_shared_params  (RW) : ORIGIN = 0x20260000, LENGTH = SHARED_PARAMS_SIZE /* 64KB */
  m_shared_printf  (RW) : ORIGIN = 0x20270000, LENGTH = SHARED_PRINTF_SIZE /* 2KB  */

  m_ncache_audio1  (RW) : ORIGIN = 0x20280000, LENGTH = 0x00040000  /* 256KB */
  m_ncache_audio2  (RW) : ORIGIN = 0x202C0000, LENGTH = 0x00040000  /* 256KB */
  m_ncache_audio3  (RW) : ORIGIN = 0x20300000, LENGTH = 0x00040000  /* 256KB */

  m_core1_image    (RX) : ORIGIN = CORE1IMAGE_START, LENGTH = 0x00A00000
}

SECTIONS
{
  /* For existing SDK MPU hook on CM7: cover 0x20240000..0x2027FFFF */
  __NCACHE_REGION_START = ORIGIN(m_ncache_local);
  __NCACHE_REGION_SIZE  = 0x00040000; /* 256KB */

  /* Shared region base/size symbols */
  __SHARED_PARAMS_START = ORIGIN(m_shared_params);
  __SHARED_PARAMS_SIZE  = LENGTH(m_shared_params);

  __SHARED_PRINTF_START = ORIGIN(m_shared_printf);
  __SHARED_PRINTF_SIZE  = LENGTH(m_shared_printf);

  .flash_config :
  {
    . = ALIGN(4);
    __FLASH_BASE = .;
    KEEP(* (.boot_hdr.conf))
    . = ALIGN(4);
  } > m_flash_config

  ivt_begin = ORIGIN(m_flash_config) + LENGTH(m_flash_config);

  .ivt : AT(ivt_begin)
  {
    . = ALIGN(4);
    KEEP(* (.boot_hdr.ivt))
    KEEP(* (.boot_hdr.boot_data))
    KEEP(* (.boot_hdr.dcd_data))
    . = ALIGN(4);
  } > m_ivt

  .core1_code :
  {
     . = ALIGN(4);
     KEEP (*(.core1_code))
     *(.core1_code*)
     . = ALIGN(4);
  } > m_core1_image

  /* --------------------------------------------------------------------
   * Shared DSP params region (NOLOAD)
   * Place double-buffered param structs here later.
   * -------------------------------------------------------------------- */
  .shared_params (NOLOAD) :
  {
    . = ALIGN(32);
    __SHARED_PARAMS_START__ = .;

    *(.shared_params*)
    *(SharedParams*)

    . = ALIGN(32);
    __SHARED_PARAMS_END__ = .;

    ASSERT((__SHARED_PARAMS_END__ - __SHARED_PARAMS_START__) <= LENGTH(m_shared_params),
           "shared_params section too large");
  } > m_shared_params

  /* --------------------------------------------------------------------
   * Shared printf region (NOLOAD) - exclusive for M7->M4 print buffer
   * -------------------------------------------------------------------- */
  .shared_printf (NOLOAD) :
  {
    . = ALIGN(32);
    __SHARED_PRINTF_START__ = .;

    *(.shared_printf*)
    *(SharedPrintf*)

    . = ALIGN(32);
    __SHARED_PRINTF_END__ = .;

    ASSERT((__SHARED_PRINTF_END__ - __SHARED_PRINTF_START__) <= LENGTH(m_shared_printf),
           "shared_printf section too large");
  } > m_shared_printf

  .interrupts :
  {
    __VECTOR_TABLE = .;
    __Vectors = .;
    . = ALIGN(4);
    KEEP(*(.isr_vector))
    . = ALIGN(4);
  } > m_interrupts

  .text :
  {
    . = ALIGN(4);
    *(.text)
    *(.text*)
    *(.rodata)
    *(.rodata*)
    *(.glue_7)
    *(.glue_7t)
    *(.eh_frame)
    KEEP (*(.init))
    KEEP (*(.fini))
    . = ALIGN(4);
  } > m_text

  .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > m_text

  .ARM :
  {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
  } > m_text

  .ctors :
  {
    __CTOR_LIST__ = .;
    KEEP (*crtbegin.o(.ctors))
    KEEP (*crtbegin?.o(.ctors))
    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))
    KEEP (*(SORT(.ctors.*)))
    KEEP (*(.ctors))
    __CTOR_END__ = .;
  } > m_text

  .dtors :
  {
    __DTOR_LIST__ = .;
    KEEP (*crtbegin.o(.dtors))
    KEEP (*crtbegin?.o(.dtors))
    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))
    KEEP (*(SORT(.dtors.*)))
    KEEP (*(.dtors))
    __DTOR_END__ = .;
  } > m_text

  .preinit_array :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } > m_text

  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } > m_text

  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } > m_text

  __etext = .;
  __DATA_ROM = .;

  .interrupts_ram :
  {
    . = ALIGN(4);
    __VECTOR_RAM__ = .;
    __interrupts_ram_start__ = .;
    *(.m_interrupts_ram)
    . += VECTOR_RAM_SIZE;
    . = ALIGN(4);
    __interrupts_ram_end__ = .;
  } > m_dtcm

  __VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts);

  .data : AT(__DATA_ROM)
  {
    . = ALIGN(4);
    __DATA_RAM = .;
    __data_start__ = .;
    *(.data)
    *(.data*)
    *(DataQuickAccess)
    KEEP(*(.jcr*))
    . = ALIGN(4);
    __data_end__ = .;
  } > m_dtcm

  __ram_function_flash_start = __DATA_ROM + (__data_end__ - __data_start__);

  .ram_function : AT(__ram_function_flash_start)
  {
    . = ALIGN(32);
    __ram_function_start__ = .;
    *(CodeQuickAccess)
    . = ALIGN(128);
    __ram_function_end__ = .;
  } > m_itcm

  __NDATA_ROM = __ram_function_flash_start + (__ram_function_end__ - __ram_function_start__);

  /* M7 local NonCacheable sections stay in dtcm (your current script behavior) */
  .ncache.init : AT(__NDATA_ROM)
  {
    __noncachedata_start__ = .;
    *(NonCacheable.init)
    . = ALIGN(4);
    __noncachedata_init_end__ = .;
  } > m_dtcm

  . = __noncachedata_init_end__;
  .ncache :
  {
    *(NonCacheable)
    . = ALIGN(4);
    __noncachedata_end__ = .;
  } > m_dtcm

  __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);
  text_end = ORIGIN(m_text) + LENGTH(m_text);
  ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")

  .bss :
  {
    . = ALIGN(4);
    __bss_start__ = .;
    *(.bss)
    *(.bss*)
    *(COMMON)
    . = ALIGN(4);
    __bss_end__ = .;
  } > m_dtcm

  .heap :
  {
    . = ALIGN(8);
    __end__ = .;
    PROVIDE(end = .);
    __HeapBase = .;
    . += HEAP_SIZE;
    __HeapLimit = .;
    __heap_limit = .;
  } > m_dtcm

  .stack :
  {
    . = ALIGN(8);
    . += STACK_SIZE;
  } > m_dtcm

  __StackTop   = ORIGIN(m_dtcm) + LENGTH(m_dtcm);
  __StackLimit = __StackTop - STACK_SIZE;
  PROVIDE(__stack = __StackTop);

  .ARM.attributes 0 : { *(.ARM.attributes) }
}

ASSERT(__StackLimit >= __HeapLimit, "region m_dtcm overflowed with stack and heap");


}

// M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld 
 /* M4/armgcc/MIMXRT1176xxxxx_cm4_flexspi_nor.ld
 * M4 XIP-from-FlexSPI with ITCM/DTCM hot sections + SDRAM
 * OCRAM split into: 128KB local ncache + shared params + shared printf + audio banks.
 */

ENTRY(Reset_Handler)

HEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;

/* --------------------------------------------------------------------------
 * Shared OCRAM regions (ONLY TWO):
 *  - m_shared_params  : 64 KB  (DSP parameter structs etc)
 *  - m_shared_printf  : 2 KB   (M7->M4 printf buffer)
 * -------------------------------------------------------------------------- */
SHARED_PARAMS_SIZE = 0x00010000; /* 64 KB */
SHARED_PRINTF_SIZE = 0x00000800; /* 2 KB  */

SDRAM_BASE        = 0x80000000;
SDRAM_SIZE        = 0x04000000; /* 64 MB */
SDRAM_C_SIZE      = 0x00800000; /* 8 MB cacheable */
SDRAM_NC_BASE     = SDRAM_BASE + SDRAM_C_SIZE; /* 0x80800000 */
SDRAM_NC_SIZE     = SDRAM_SIZE - SDRAM_C_SIZE; /* 56 MB */

M4_FLASH_BASE = 0x33600000;
M4_FLASH_SIZE = 0x00A00000;

MEMORY
{
  m_interrupts (RX) : ORIGIN = M4_FLASH_BASE,           LENGTH = 0x00000400
  m_text       (RX) : ORIGIN = M4_FLASH_BASE + 0x400,   LENGTH = M4_FLASH_SIZE - 0x00000400

  m_itcm       (RX) : ORIGIN = 0x1FFE0000, LENGTH = 0x00020000
  m_dtcm       (RW) : ORIGIN = 0x20000000, LENGTH = 0x00020000

  /* OCRAM 1MB partition */
  m_ncache_local   (RW) : ORIGIN = 0x20240000, LENGTH = 0x00020000  /* 128KB */

  /* Two explicit shared regions */
  m_shared_params  (RW) : ORIGIN = 0x20260000, LENGTH = SHARED_PARAMS_SIZE /* 64KB */
  m_shared_printf  (RW) : ORIGIN = 0x20270000, LENGTH = SHARED_PRINTF_SIZE /* 2KB  */

  m_ncache_audio1  (RW) : ORIGIN = 0x20280000, LENGTH = 0x00040000  /* 256KB */
  m_ncache_audio2  (RW) : ORIGIN = 0x202C0000, LENGTH = 0x00040000  /* 256KB */
  m_ncache_audio3  (RW) : ORIGIN = 0x20300000, LENGTH = 0x00040000  /* 256KB */

  m_sdram_c    (RW) : ORIGIN = SDRAM_BASE,    LENGTH = SDRAM_C_SIZE
  m_sdram_nc   (RW) : ORIGIN = SDRAM_NC_BASE, LENGTH = SDRAM_NC_SIZE
}

SECTIONS
{
  /* Shared region base/size symbols */
  __SHARED_PARAMS_START = ORIGIN(m_shared_params);
  __SHARED_PARAMS_SIZE  = LENGTH(m_shared_params);

  __SHARED_PRINTF_START = ORIGIN(m_shared_printf);
  __SHARED_PRINTF_SIZE  = LENGTH(m_shared_printf);

  /* M4 local non-cache region (used by your M4 MPU code path) */
  __NCACHE_REGION_START = ORIGIN(m_ncache_local);
  __NCACHE_REGION_SIZE  = LENGTH(m_ncache_local);

  /* --------------------------------------------------------------------
   * Shared DSP params region (NOLOAD)
   * -------------------------------------------------------------------- */
  .shared_params (NOLOAD) :
  {
    . = ALIGN(32);
    __SHARED_PARAMS_START__ = .;

    *(.shared_params*)
    *(SharedParams*)

    . = ALIGN(32);
    __SHARED_PARAMS_END__ = .;

    ASSERT((__SHARED_PARAMS_END__ - __SHARED_PARAMS_START__) <= LENGTH(m_shared_params),
           "shared_params section too large");
  } > m_shared_params

  /* --------------------------------------------------------------------
   * Shared printf region (NOLOAD) - exclusive for M7->M4 print buffer
   * -------------------------------------------------------------------- */
  .shared_printf (NOLOAD) :
  {
    . = ALIGN(32);
    __SHARED_PRINTF_START__ = .;

    *(.shared_printf*)
    *(SharedPrintf*)

    . = ALIGN(32);
    __SHARED_PRINTF_END__ = .;

    ASSERT((__SHARED_PRINTF_END__ - __SHARED_PRINTF_START__) <= LENGTH(m_shared_printf),
           "shared_printf section too large");
  } > m_shared_printf

  .interrupts :
  {
    __VECTOR_TABLE = .;
    __Vectors = .;
    . = ALIGN(4);
    KEEP(*(.isr_vector))
    . = ALIGN(4);
  } > m_interrupts

  .text :
  {
    . = ALIGN(4);
    *(.text)
    *(.text*)
    *(.rodata)
    *(.rodata*)
    *(.glue_7)
    *(.glue_7t)
    *(.eh_frame)
    KEEP(*(.init))
    KEEP(*(.fini))
    . = ALIGN(4);
  } > m_text

  .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > m_text

  .ARM :
  {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
  } > m_text

  .ctors :
  {
    __CTOR_LIST__ = .;
    KEEP (*crtbegin.o(.ctors))
    KEEP (*crtbegin?.o(.ctors))
    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))
    KEEP (*(SORT(.ctors.*)))
    KEEP (*(.ctors))
    __CTOR_END__ = .;
  } > m_text

  .dtors :
  {
    __DTOR_LIST__ = .;
    KEEP (*crtbegin.o(.dtors))
    KEEP (*crtbegin?.o(.dtors))
    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))
    KEEP (*(SORT(.dtors.*)))
    KEEP (*(.dtors))
    __DTOR_END__ = .;
  } > m_text

  .preinit_array :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } > m_text

  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } > m_text

  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } > m_text

  __etext = .;
  __DATA_ROM = .;

  __itcm_text_load__ = __DATA_ROM;
  .itcm_text : AT(__itcm_text_load__)
  {
    . = ALIGN(32);
    __itcm_text_start__ = .;
    *(.itcm_text*)
    *(ITCM_TEXT*)
    . = ALIGN(32);
    __itcm_text_end__ = .;
  } > m_itcm

  __DATA_ROM_AFTER_ITCM = __itcm_text_load__ + (__itcm_text_end__ - __itcm_text_start__);

  __dtcm_data_load__ = __DATA_ROM_AFTER_ITCM;
  .dtcm_data : AT(__dtcm_data_load__)
  {
    . = ALIGN(32);
    __dtcm_data_start__ = .;
    *(.dtcm_data*)
    *(DTCM_DATA*)
    . = ALIGN(32);
    __dtcm_data_end__ = .;
  } > m_dtcm

  __DATA_ROM_AFTER_DTCM = __dtcm_data_load__ + (__dtcm_data_end__ - __dtcm_data_start__);
  __DATA_ROM = __DATA_ROM_AFTER_DTCM;

  .data : AT(__DATA_ROM)
  {
    . = ALIGN(4);
    __DATA_RAM = .;
    __data_start__ = .;
    *(.data)
    *(.data*)
    *(DataQuickAccess)
    KEEP(*(.jcr*))
    . = ALIGN(4);
    __data_end__ = .;
  } > m_dtcm

  __NDATA_ROM = __DATA_ROM + (__data_end__ - __data_start__);

  /* M4-local NonCacheable sections -> local 128KB */
  .ncache.init : AT(__NDATA_ROM)
  {
    __noncachedata_start__ = .;
    *(NonCacheable.init)
    . = ALIGN(4);
    __noncachedata_init_end__ = .;
  } > m_ncache_local

  .ncache (NOLOAD) :
  {
    *(NonCacheable)
    . = ALIGN(4);
    __noncachedata_end__ = .;
  } > m_ncache_local

  .bss (NOLOAD) :
  {
    . = ALIGN(4);
    __bss_start__ = .;
    *(.bss)
    *(.bss*)
    *(COMMON)
    . = ALIGN(4);
    __bss_end__ = .;
  } > m_dtcm

  .dtcm_bss (NOLOAD) :
  {
    . = ALIGN(32);
    __dtcm_bss_start__ = .;
    *(.dtcm_bss*)
    *(DTCM_BSS*)
    . = ALIGN(32);
    __dtcm_bss_end__ = .;
  } > m_dtcm

  /* ---------- Audio OCRAM banks (non-cacheable, NOLOAD) ---------- */
  .audio1_bss (NOLOAD) :
  {
    . = ALIGN(32);
    __audio1_bss_start__ = .;
    *(.audio1_bss*)
    . = ALIGN(32);
    __audio1_bss_end__ = .;
  } > m_ncache_audio1

  .audio2_bss (NOLOAD) :
  {
    . = ALIGN(32);
    __audio2_bss_start__ = .;
    *(.audio2_bss*)
    . = ALIGN(32);
    __audio2_bss_end__ = .;
  } > m_ncache_audio2

  .audio3_bss (NOLOAD) :
  {
    . = ALIGN(32);
    __audio3_bss_start__ = .;
    *(.audio3_bss*)
    . = ALIGN(32);
    __audio3_bss_end__ = .;
  } > m_ncache_audio3

  /* ---------- Cacheable SDRAM (8MB) ---------- */
  __SDRAM_C_DATA_ROM = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);

  .sdram_c_data : AT(__SDRAM_C_DATA_ROM)
  {
    . = ALIGN(32);
    __sdram_c_data_start__ = .;
    *(.sdram_c_data*)
    *(SDRAM_C_DATA*)
    . = ALIGN(32);
    __sdram_c_data_end__ = .;
  } > m_sdram_c

  __sdram_c_data_load__ = __SDRAM_C_DATA_ROM;

  .sdram_c_bss (NOLOAD) :
  {
    . = ALIGN(32);
    __sdram_c_bss_start__ = .;
    *(.sdram_c_bss*)
    *(SDRAM_C_BSS*)
    . = ALIGN(32);
    __sdram_c_bss_end__ = .;
  } > m_sdram_c

  .sdram_nc_bss (NOLOAD) :
  {
    . = ALIGN(32);
    __sdram_nc_bss_start__ = .;
    *(.sdram_nc_bss*)
    *(SDRAM_NC_BSS*)
    . = ALIGN(32);
    __sdram_nc_bss_end__ = .;
  } > m_sdram_nc

  .heap :
  {
    . = ALIGN(8);
    __end__ = .;
    PROVIDE(end = .);
    __HeapBase = .;
    . += HEAP_SIZE;
    __HeapLimit = .;
    __heap_limit = .;
  } > m_dtcm

  .stack :
  {
    . = ALIGN(8);
    . += STACK_SIZE;
    __StackEnd = .;
  } > m_dtcm

  __StackTop   = ORIGIN(m_dtcm) + LENGTH(m_dtcm);
  __StackLimit = __StackTop - STACK_SIZE;
  PROVIDE(__stack = __StackTop);

  .ARM.attributes 0 : { *(.ARM.attributes) }

  __SDRAM_BASE      = SDRAM_BASE;
  __SDRAM_SIZE      = SDRAM_SIZE;
  __SDRAM_C_BASE    = SDRAM_BASE;
  __SDRAM_C_SIZE    = SDRAM_C_SIZE;
  __SDRAM_NC_BASE   = SDRAM_NC_BASE;
  __SDRAM_NC_SIZE   = SDRAM_NC_SIZE;
}
}

/* MPU configuration. */
#if __CORTEX_M == 7

void BOARD_ConfigMPU(void)
{
#if defined(__CC_ARM) || defined(__ARMCC_VERSION)
    extern uint32_t Image$$RW_m_ncache$$Base[];
    extern uint32_t Image$$RW_m_ncache_unused$$Base[];
    extern uint32_t Image$$RW_m_ncache_unused$$ZI$$Limit[];
    uint32_t nonCacheStart = (uint32_t)Image$$RW_m_ncache$$Base;
    uint32_t size          = ((uint32_t)Image$$RW_m_ncache_unused$$Base == nonCacheStart) ?
                                 0U :
                                 ((uint32_t)Image$$RW_m_ncache_unused$$ZI$$Limit - nonCacheStart);
#elif defined(__MCUXPRESSO)
#if defined(__USE_SHMEM)
    extern uint32_t __base_rpmsg_sh_mem;
    extern uint32_t __top_rpmsg_sh_mem;
    uint32_t nonCacheStart = (uint32_t)(&__base_rpmsg_sh_mem);
    uint32_t size          = (uint32_t)(&__top_rpmsg_sh_mem) - nonCacheStart;
#else
    extern uint32_t __base_NCACHE_REGION;
    extern uint32_t __top_NCACHE_REGION;
    uint32_t nonCacheStart = (uint32_t)(&__base_NCACHE_REGION);
    uint32_t size          = (uint32_t)(&__top_NCACHE_REGION) - nonCacheStart;
#endif
#elif defined(__ICCARM__) || defined(__GNUC__)
    extern uint32_t __NCACHE_REGION_START[];
    extern uint32_t __NCACHE_REGION_SIZE[];
    uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START;
    uint32_t size          = (uint32_t)__NCACHE_REGION_SIZE;
#endif
    (void)nonCacheStart;
    (void)size;

#if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT
    if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR))
    {
        SCB_DisableICache();
    }
#endif
#if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT
    if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR))
    {
        SCB_DisableDCache();
    }
#endif

    ARM_MPU_Disable();

    /* Region 0: deny all (speculative prefetch workaround) */
    MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U);
    MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB);

    /* Region 1: Device, not shareable, non-cacheable */
    MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);

    /* Region 2: Device, not shareable, non-cacheable */
    MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);

    /* Region 3: Device, not shareable, non-cacheable */
    MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);

    /* Region 4: Normal, WB */
    MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);

    /* Region 5: Normal, WB */
    MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);

    /* --------------------------------------------------------------------
     * OCRAM (0x2024_0000..0x2033_FFFF, 1MB) must be NORMAL + NON-CACHEABLE + SHAREABLE.
     * Use 3 aligned regions:
     *   - 0x2024_0000 size 256KB
     *   - 0x2028_0000 size 512KB
     *   - 0x2030_0000 size 256KB
     *
     * Attributes: Normal, SHAREABLE, non-cacheable (TypeExt=1, S=1, C=0, B=0)
     * -------------------------------------------------------------------- */

    /* Region 6: OCRAM 256KB (SHAREABLE, non-cacheable) */
    MPU->RBAR = ARM_MPU_RBAR(6, 0x20240000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB);

    /* Region 7: OCRAM 512KB (SHAREABLE, non-cacheable) */
    MPU->RBAR = ARM_MPU_RBAR(7, 0x20280000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_512KB);

    /* Region 10: OCRAM 256KB (SHAREABLE, non-cacheable) */
    MPU->RBAR = ARM_MPU_RBAR(10, 0x20300000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB);

#if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH
    /* --- SDRAM: default NON-cacheable 64MB --- */
    MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB);

    /* --- SDRAM: overlay first 8MB as cacheable (WT) --- */
    MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_8MB);
#else
    /* --- SDRAM: default NON-cacheable 64MB --- */
    MPU->RBAR = ARM_MPU_RBAR(11, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_64MB);

    /* --- SDRAM: overlay first 8MB as cacheable (WB) --- */
    MPU->RBAR = ARM_MPU_RBAR(12, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_8MB);
#endif

#if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)
    /* Region 8: XIP external flash, RO, WB */
    MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_16MB);
#endif

#ifdef USE_SDRAM
#if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH
    /* Region 9: SDRAM overall WT */
    MPU->RBAR = ARM_MPU_RBAR(9, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_64MB);
#else
    /* Region 9: SDRAM overall WB */
    MPU->RBAR = ARM_MPU_RBAR(9, 0x80000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB);
#endif
#endif

    /* Region 13..15: Device peripheral windows */
    MPU->RBAR = ARM_MPU_RBAR(13, 0x40000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_16MB);

    MPU->RBAR = ARM_MPU_RBAR(14, 0x41000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);

    MPU->RBAR = ARM_MPU_RBAR(15, 0x41400000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB);

    ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);

#if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT
    SCB_EnableDCache();
#endif
#if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT
    SCB_EnableICache();
#endif
}

#elif __CORTEX_M == 4

void BOARD_ConfigMPU(void)
{
    /* We still read these linker symbols for sanity/compatibility,
       but OCRAM MPU policy is configured explicitly below. */
#if defined(__CC_ARM) || defined(__ARMCC_VERSION)
    extern uint32_t Image$$RW_m_ncache$$Base[];
    extern uint32_t Image$$RW_m_ncache_unused$$Base[];
    extern uint32_t Image$$RW_m_ncache_unused$$ZI$$Limit[];
    uint32_t nonCacheStart = (uint32_t)Image$$RW_m_ncache$$Base;
    uint32_t nonCacheSize  = ((uint32_t)Image$$RW_m_ncache_unused$$Base == nonCacheStart) ?
                                 0U :
                                 ((uint32_t)Image$$RW_m_ncache_unused$$ZI$$Limit - nonCacheStart);
#elif defined(__MCUXPRESSO)
    extern uint32_t __base_NCACHE_REGION;
    extern uint32_t __top_NCACHE_REGION;
    uint32_t nonCacheStart = (uint32_t)(&__base_NCACHE_REGION);
    uint32_t nonCacheSize  = (uint32_t)(&__top_NCACHE_REGION) - nonCacheStart;
#elif defined(__ICCARM__) || defined(__GNUC__)
    extern uint32_t __NCACHE_REGION_START[];
    extern uint32_t __NCACHE_REGION_SIZE[];
    uint32_t nonCacheStart = (uint32_t)__NCACHE_REGION_START;
    uint32_t nonCacheSize  = (uint32_t)__NCACHE_REGION_SIZE;
#endif

    /* Only config non-cacheable region on system bus */
    assert(nonCacheStart >= 0x20000000U);

    /* ---- Disable code bus cache (LMEM) ---- */
    if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM->PCCCR))
    {
        LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK;
        while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {}
        LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK);
        LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK;
    }

    /* ---- Disable system bus cache (LMEM) ---- */
    if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM->PSCCR))
    {
        LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK;
        while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {}
        LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK);
        LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK;
    }

    ARM_MPU_Disable();

    /* --------------------------------------------------------------------
     * OCRAM (0x2024_0000..0x2033_FFFF, 1MB) must be NORMAL + NON-CACHEABLE + SHAREABLE.
     * Use 3 aligned regions:
     *   - 0x2024_0000 size 256KB
     *   - 0x2028_0000 size 512KB
     *   - 0x2030_0000 size 256KB
     *
     * Attributes: Normal, SHAREABLE, non-cacheable (TypeExt=1, S=1, C=0, B=0)
     * -------------------------------------------------------------------- */

    /* Region 0: OCRAM 256KB (SHAREABLE, non-cacheable) */
    MPU->RBAR = ARM_MPU_RBAR(0, 0x20240000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL,
                             1, /* TypeExtField=1 => Normal non-cacheable */
                             1, /* Shareable = 1 */
                             0, /* Cacheable */
                             0, /* Bufferable */
                             0,
                             ARM_MPU_REGION_SIZE_256KB);

    /* Region 1: OCRAM 512KB (SHAREABLE, non-cacheable) */
    MPU->RBAR = ARM_MPU_RBAR(1, 0x20280000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_512KB);

    /* Region 2: OCRAM 256KB (SHAREABLE, non-cacheable) */
    MPU->RBAR = ARM_MPU_RBAR(2, 0x20300000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 1, 0, 0, 0, ARM_MPU_REGION_SIZE_256KB);

    /* Optional sanity check: local ncache region should live inside OCRAM. */
    (void)nonCacheSize;
    assert((nonCacheStart >= 0x20240000U) && (nonCacheStart < 0x20340000U));

    ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);

    /* Invalidate and enable system bus cache */
    LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK;
    while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {}
    LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK);
    LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK;

    /* Invalidate and enable code bus cache */
    LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK;
    while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {}
    LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK);
    LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK;
}

#endif /* __CORTEX_M == 4 */


Print log: 

EventsHandled: 1, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 2, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 3, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 4, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 5, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 6, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 7, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 8, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 9, Magic: 1413829460, Seq: 0, Len: 0
EventsHandled: 10, Magic: 1413829460, Seq: 0, Len: 0



Tags (1)
0 Kudos
Reply
2 Replies

535 Views
EdwinHz
NXP TechSupport
NXP TechSupport

Hi @cyberhelmer,

I do see your setup to make OCRAM non-cacheable on BOARD_ConfigMPU(), but at the very end of this routine, you have the following:

    /* Invalidate and enable system bus cache */
    LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK;
    while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {}
    LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK);
    LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK;

    /* Invalidate and enable code bus cache */
    LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK;
    while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {}
    LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK);
    LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK;

By the end of BOARD_ConfigMPU(), which is basically the start of your application, you re-enable system and code bus cache, which might be causing a mismatch between what the M7 is writing vs what the M4 is reading.

Try commenting out these lines as a quick test to see if this changes anything between the reading/writing of the shared memory address.

BR,
Edwin.

0 Kudos
Reply

513 Views
cyberhelmer
Contributor II

Thanks, but I think the problem was with the linker and the memory I was testing was actually not ending up at the correct region which the mpu config had set to non cacheable! 

So I think it's solved, need to do some more test to me 100% sure. 

0 Kudos
Reply
%3CLINGO-SUB%20id%3D%22lingo-sub-2298599%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EProblem%20writing%2Freading%20shared%20ocram%20RT1170%20EVKB%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2298599%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EI'm%20having%20troubles%20setting%20up%20shared%20ocram%20between%20M7%20and%20M4%20core%20on%20the%20RT1170%20using%20the%20RT1170%20EVKB%20and%20was%20hoping%20someone%20can%20help%20me.%20Been%20pulling%20my%20hair%20out%20for%20two%20days!%3CBR%20%2F%3E%3CBR%20%2F%3EI%20do%20get%20it%20to%20somewhat%20work%20but%20it%20is%20very%20inconsistent.%20I'm%20trying%20to%20write%20data%20to%20a%20shared%20buffer%20from%20M7%2C%20signal%20M4%20using%20MCMGR%20and%20then%20read%20the%20data%20from%20ocram.%26nbsp%3B%3CBR%20%2F%3E%3CBR%20%2F%3EI%20have%20a%20section%20specifically%20for%20this%20buffer%20in%20both%20linkers%20and%20no%20other%20data%20is%20placed%20here%20and%20I%20think%20I%20have%20set%20the%20MPU_Config%20correctly%20to%20make%20all%20of%20ocram%20non-cacheable.%26nbsp%3B%3CBR%20%2F%3E%3CBR%20%2F%3EI%20do%20get%20MCMGR%20to%20trigger%20the%20M4%20event%20handler%20reliably%2C%20but%20it%20doesn't%20consistently%20read%20the%20latest%20data%20written%20by%20M7.%20When%20messing%20around%20trying%20different%20stuff%20I%20sometimes%20get%20it%20to%20read%20the%20data%2C%20but%20then%20reading%20old%20data%20on%20the%20next%20MCMGR%20interrupt.%20When%20printing%20from%20the%20M7%20I%20can%20clearly%20see%20the%20correct%20data%20is%20being%20written%20into%20the%20shared%20adresses.%26nbsp%3B%3CBR%20%2F%3E%26nbsp%3B%3CBR%20%2F%3EWhen%20printing%20the%20memory%20addresses%20from%20each%20core%20they%20are%20the%20same%20for%20each%20field%20in%20this%20struct%20and%20it%20does%20sometimes%20read%20correct%20data%20so%20I'm%20pretty%20confident%20we%20are%20actually%20operating%20on%20the%20same%20memory.%26nbsp%3B%3CBR%20%2F%3E%3CBR%20%2F%3EFor%20testing%20enter%20a%20forever%20loop%20in%20M7%20boot_task%20that%20increments%20counters%20and%20writes%20the%20data%20to%20the%20buffer%20every%202%20seconds%20and%20trigger%20the%20M4%20to%20read.%20The%20purpose%20is%20to%20have%20a%20ring%20buffer%20the%20m7%20writes%20to%20but%20I%20got%20corrupted%20data%20so%20I%20scaled%20back%20to%20a%20simpler%20test%20which%20revealed%20something%20is%20off.%26nbsp%3B%3CBR%20%2F%3E%3CBR%20%2F%3EM7%20print%3A%3CBR%20%2F%3EBuffer%3A%2020270000%2C%20Magic%3A%2020270000%2C%20Seq%3A%2020270004%2C%20Len%3A%2020270008%2C%20Data%3A%2020270010%3CBR%20%2F%3EM4%20print%3A%3CBR%20%2F%3EBuffer%3A%2020270000%2C%20Magic%3A%2020270000%2C%20Seq%3A%2020270004%2C%20Len%3A%2020270008%2C%20Data%3A%2020270010%3C%2FP%3E%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3Etypedef%20struct%20__attribute__((aligned(32)))%0A%7B%0A%20%20%20%20uint32_t%20magic%3B%0A%20%20%20%20volatile%20uint32_t%20seq%3B%20%2F*%20increments%20each%20write%20from%20M7%20*%2F%0A%20%20%20%20uint32_t%20len%3B%0A%20%20%20%20uint32_t%20_pad0%3B%20%2F*%20padding%20*%2F%0A%20%20%20%20uint8_t%20data%5BIPC_TESTBUF_BYTES%5D%3B%0A%7D%20ipc_testbuf_t%3B%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3E%2F%2F%20M4%20boot_task.c%0Aextern%20%22C%22%20void%20boot_task(void%20*param)%0A%7B%0A%20%20%20%20(void)param%3B%0A%20%20%20%20PRINTF(%22%5CnM4%20boot_task%20started%22)%3B%0A%20%20%20%20PRINTF(%22%5Cn%5BM4%5D%20build%20time%3A%20%25s%2C%20git%20%25s%5Cr%5Cn%22%2C%20M4_BUILD_TIME%2C%20M4_GIT_SHA)%3B%0A%0A%20%20%20%20%2F*%20Register%20IPC%20wake%20event%20handler%20ONCE%20*%2F%0A%20%20%20%20(void)MCMGR_RegisterEvent(ipc_message%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20M4_ipc_event_handler%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(void*)0)%3B%0A%20%20%20%20PRINTF(%22%5CnRegistrer%20mcmgr%20event%20handler%22)%3B%0A%0A%20%20%20%20%2F*%207)%20Signal%20M7%20we%20are%20ready%20(boot%20complete)%20*%2F%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20uint32_t%20startupData%3B%0A%20%20%20%20%20%20%20%20mcmgr_status_t%20status%3B%0A%20%20%20%20%20%20%20%20do%20%7B%20status%20%3D%20MCMGR_GetStartupData(%26amp%3BstartupData)%3B%20%7D%0A%20%20%20%20%20%20%20%20while%20(status%20!%3D%20kStatus_MCMGR_Success)%3B%0A%0A%20%20%20%20%20%20%20%20(void)MCMGR_TriggerEvent(kMCMGR_RemoteApplicationEvent%2C%201U)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20for%20(%3B%3B)%0A%20%20%20%20%20%20%20%20vTaskDelay(pdMS_TO_TICKS(1000))%3B%0A%7D%0A%0A%2F%2F%20M7%20boot_task.c%0Avoid%20boot_task(void%20*param)%0A%7B%0A%20%20%20%20(void)param%3B%0A%0A%20%20%20%20(void)MCMGR_Init()%3B%0A%0A%20%20%20%20(void)MCMGR_RegisterEvent(kMCMGR_RemoteApplicationEvent%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20RemoteAppReadyEventHandler%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(void%20*)%26amp%3Bs_m4ReadyEventData)%3B%0A%0A%20%20%20%20ipc_print_buffer_init_primary()%3B%0A%0A%20%20%20%20PRINTF(%22%5CnStarting%20M4%20core%22)%3B%0A%20%20%20%20(void)MCMGR_StartCore(kMCMGR_Core1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(void%20*)(char%20*)CORE1_BOOT_ADDRESS%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kMCMGR_Start_Synchronous)%3B%0A%0A%20%20%20%20while%20(APP_READY_EVENT_DATA%20!%3D%20s_m4ReadyEventData)%0A%20%20%20%20%7B%0A%20%20%20%20%7D%0A%20%20%20%20PRINTF(%22%5CnM4%20running%22)%3B%0A%0A%20%20%20%20for%20(%3B%3B)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20vTaskDelay(pdMS_TO_TICKS(2000))%3B%0A%0A%20%20%20%20%20%20%20%20ipc_increment_seq_and_kick_m4()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20vTaskDelete(NULL)%3B%0A%7D%0A%0A%0Acode%2Fboards%2Frt1170%2Frt1170_shared%2Fipc_core.h%0A%23pragma%20once%0A%0A%23include%20%3CSTDINT.H%3E%0A%23include%20%3CSTDDEF.H%3E%0A%0A%23include%20%22mcmgr.h%22%0A%23include%20%22FreeRTOS.h%22%0A%23include%20%22task.h%22%0A%0A%23ifdef%20__cplusplus%0Aextern%20%22C%22%20%7B%0A%23endif%0A%0A%23ifndef%20ipc_message%0A%23define%20ipc_message%20kMCMGR_FreeRtosMessageBuffersEvent%0A%23endif%0A%0Atypedef%20enum%0A%7B%0A%20%20%20%20IPC_PRINT_BUF%20%20%20%20%20%20%20%20%3D%203%2C%0A%7D%20ipc_event_t%3B%0A%0A%2F*%20--------------------------------------------------------------------------%0A%20*%20Linker%20symbols%20(BOTH%20images)%20-%20for%20debug%2Fsanity%20only%0A%20*%20--------------------------------------------------------------------------%20*%2F%0Aextern%20uint8_t%20__SHARED_PRINTF_START%5B%5D%3B%20%2F*%20ORIGIN(m_shared_printf)%20*%2F%0Aextern%20uint8_t%20__SHARED_PRINTF_SIZE%5B%5D%3B%20%20%2F*%20LENGTH(m_shared_printf)%20%20*%2F%0A%0A%2F*%20section-content%20boundaries%20(debug%20only)%20*%2F%0Aextern%20uint8_t%20__SHARED_PRINTF_START__%5B%5D%3B%0Aextern%20uint8_t%20__SHARED_PRINTF_END__%5B%5D%3B%0A%0A%2F*%20--------------------------------------------------------------------------%0A%20*%20Shared%20test%20buffer%20(M7%20writes%2C%20M4%20reads)%0A%20*%20Lives%20in%20m_shared_printf%20(2%20KB)%20via%20section%20%22.shared_printf%22%0A%20*%20--------------------------------------------------------------------------%20*%2F%0A%23ifndef%20IPC_TESTBUF_BYTES%0A%23define%20IPC_TESTBUF_BYTES%20128u%0A%23endif%0A%0A%23define%20IPC_TESTBUF_MAGIC%20(0x54455354u)%20%2F*%20'TEST'%20*%2F%0A%0Atypedef%20struct%20__attribute__((aligned(32)))%0A%7B%0A%20%20%20%20uint32_t%20magic%3B%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20volatile%20uint32_t%20seq%3B%20%20%20%20%2F*%20increments%20each%20write%20from%20M7%20*%2F%0A%20%20%20%20uint32_t%20len%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20uint32_t%20_pad0%3B%20%20%20%20%20%20%20%20%20%20%20%2F*%20padding%20*%2F%0A%0A%20%20%20%20uint8_t%20data%5BIPC_TESTBUF_BYTES%5D%3B%0A%7D%20ipc_testbuf_t%3B%0A%0A%2F*%20Shared%20object%20placed%20in%20%22.shared_printf%22%20*%2F%0Aextern%20volatile%20ipc_testbuf_t%20g_ipc_testbuf%3B%0A%0A%2F*%20CM7%20ONLY%3A%20clear%20shared%20printf%20object%20once%20at%20boot%2C%20set%20initial%20values*%2F%0Avoid%20ipc_print_buffer_init_primary(void)%3B%0A%0A%2F*%20Accessor%20*%2F%0Avolatile%20ipc_testbuf_t%20*ipc_testbuf(void)%3B%0A%0A%2F*%20Test%20function%20*%2F%0Avoid%20ipc_increment_seq_and_kick_m4()%3B%0A%0Avoid%20M4_ipc_event_handler(uint16_t%20eventData%2C%20void%20*context)%3B%0A%0A%23ifdef%20__cplusplus%0A%7D%0A%23endif%0A%0A%0A%7D%0A%0A%2F%2F%20code%2Fboards%2Frt1170%2Frt1170_shared%2Fipc_core.c%20%0A%20%2F%2F%20code%2Fboards%2Frt1170%2Frt1170_shared%2Fipc_core.c%0A%23include%20%22ipc_core.h%22%0A%0A%23include%20%3CSTRING.H%3E%0A%23include%20%22fsl_debug_console.h%22%0A%0A%23if%20defined(CPU_MIMXRT1176DVMAA_cm7)%0A%23include%20%22core_cm7.h%22%20%20%20%2F*%20SCB_CleanDCache_by_Addr%20*%2F%0A%23endif%0A%0A%2F*%20--------------------------------------------------------------------------%0A%20*%20Shared%20object%20allocated%20in%20linker-reserved%20shared%20OCRAM%0A%20*%20MUST%20live%20in%20%22.shared_printf%22%20(m_shared_printf%2C%202KB)%0A%20*%20--------------------------------------------------------------------------%20*%2F%0A__attribute__((section(%22.shared_printf%22)%2C%20aligned(32)))%0Avolatile%20ipc_testbuf_t%20g_ipc_testbuf%3B%0A%0Astatic%20inline%20void%20dmb(void)%0A%7B%0A%23if%20defined(__ARMCC_VERSION)%20%7C%7C%20defined(__GNUC__)%20%7C%7C%20defined(__ICCARM__)%0A%20%20%20%20__asm%20volatile%20(%22dmb%22%20%3A%3A%3A%20%22memory%22)%3B%0A%23endif%0A%7D%0A%0A%0Avolatile%20ipc_testbuf_t%20*ipc_testbuf(void)%0A%7B%0A%20%20%20%20return%20%26amp%3Bg_ipc_testbuf%3B%0A%7D%0A%0A%2F*%20--------------------------------------------------------------------------%0A%20*%20CM7%20ONLY%3A%20clear%20the%20shared%20printf%20object%20once.%0A%20*%20--------------------------------------------------------------------------%20*%2F%0Avoid%20ipc_clear_print_buffer(void)%0A%7B%0A%20%20%20%20memset((void%20*)%26amp%3Bg_ipc_testbuf%2C%200%2C%20sizeof(g_ipc_testbuf))%3B%0A%7D%0A%0A%2F*%20--------------------------------------------------------------------------%0A%20*%20CM7%3A%20init%20%2B%20write%20%2B%20kick%0A%20*%20--------------------------------------------------------------------------%20*%2F%0Avoid%20ipc_print_buffer_init_primary(void)%0A%7B%0A%20%20%20%20ipc_clear_print_buffer()%3B%0A%0A%20%20%20%20volatile%20ipc_testbuf_t%20*buffer%20%3D%20%26amp%3Bg_ipc_testbuf%3B%0A%0A%20%20%20%20buffer-%26gt%3Bmagic%20%3D%20IPC_TESTBUF_MAGIC%3B%0A%20%20%20%20buffer-%26gt%3Bseq%20%20%20%3D%200u%3B%0A%20%20%20%20buffer-%26gt%3Blen%20%20%20%3D%200u%3B%0A%20%20%20%20memset((void*)buffer-%26gt%3Bdata%2C%200%2C%20IPC_TESTBUF_BYTES)%3B%0A%0A%20%20%20%20PRINTF(%22%5CnMagic%3A%20%25u%2C%20Seq%3A%20%25u%2C%20Len%3A%20%25u%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20buffer-%26gt%3Bmagic%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20buffer-%26gt%3Bseq%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20buffer-%26gt%3Blen)%3B%0A%7D%0A%0Avoid%20ipc_increment_seq_and_kick_m4()%0A%7B%0A%20%20%20%20volatile%20ipc_testbuf_t%20*buffer%20%3D%20%26amp%3Bg_ipc_testbuf%3B%0A%0A%20%20%20%20static%20int%20testCounter%20%3D%200%3B%0A%0A%20%20%20%20buffer-%26gt%3Bmagic%20%3D%20IPC_TESTBUF_MAGIC%3B%0A%20%20%20%20buffer-%26gt%3Bseq%20%3D%20testCounter%3B%0A%20%20%20%20buffer-%26gt%3Blen%20%3D%20testCounter%3B%0A%0A%20%20%20%20testCounter%2B%2B%3B%0A%0A%20%20%20%20PRINTF(%22%5CnMagic%3A%20%25u%2C%20Seq%3A%20%25u%2C%20Len%3A%20%25u%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20buffer-%26gt%3Bmagic%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20buffer-%26gt%3Bseq%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20buffer-%26gt%3Blen)%3B%0A%0A%20%20%20%20%2F*%20Tried%20cleaning%20cache%20but%20makes%20no%20difference%2C%20ocram%20should%20already%20be%20configured%20non%20cacheable%20*%2F%0A%20%20%20%20%2F%2F%20__DMB()%3B%0A%20%20%20%20%2F%2F%20SCB_CleanDCache_by_Addr((uint32_t*)buffer%2C%20sizeof(*buffer))%3B%20%0A%20%20%20%20%2F%2F%20__DMB()%3B%0A%0A%20%20%20%20%2F*%20Doorbell%20*%2F%0A%20%20%20%20(void)MCMGR_TriggerEventForce(ipc_message%2C%20(uint16_t)IPC_PRINT_BUF)%3B%0A%7D%0A%0A%2F*%20--------------------------------------------------------------------------%0A%20*%20M4%3A%20event%20handler%0A%20*%20--------------------------------------------------------------------------%20*%2F%0A%23if%20defined(CPU_MIMXRT1176DVMAA_cm4)%0Avoid%20M4_ipc_event_handler(uint16_t%20eventData%2C%20void%20*context)%0A%7B%0A%20%20%20%20(void)context%3B%0A%20%20%20%20BaseType_t%20hpw%20%3D%20pdFALSE%3B%0A%20%20%20%20static%20int%20eventsHandled%20%3D%200%3B%0A%0A%20%20%20%20switch%20((ipc_event_t)eventData)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20case%20IPC_PRINT_BUF%3A%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20PRINTF%20here%20just%20for%20testing%2C%20printing%20from%20task%20makes%20no%20difference%0A%20%20%20%20%20%20%20%20%20%20%20%20eventsHandled%2B%2B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20__DMB()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20volatile%20const%20ipc_testbuf_t%20*buffer%20%3D%20ipc_testbuf()%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20magic%20%3D%20buffer-%26gt%3Bmagic%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20seq%20%20%20%3D%20buffer-%26gt%3Bseq%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20uint32_t%20len%20%20%20%3D%20buffer-%26gt%3Blen%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20PRINTF(%22%5CnEventsHandled%3A%20%25d%2C%20Magic%3A%20%25lu%2C%20Seq%3A%20%25lu%2C%20Len%3A%20%25lu%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20eventsHandled%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(unsigned%20long)magic%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(unsigned%20long)seq%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(unsigned%20long)len)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20default%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%7D%0A%20%20%20%20portYIELD_FROM_ISR(hpw)%3B%0A%7D%0A%23endif%0A%0ALinkers%3A%0A%2F%2F%20M7%2Farmgcc%2FMIMXRT1176xxxxx_cm7_flexspi_nor.ld%20%0A%20%2F*%20M7%2Farmgcc%2FMIMXRT1176xxxxx_cm7_flexspi_nor.ld%0A**%20M7%20XIP-from-FlexSPI%20with%20OCRAM%20partition%20%2B%20M4%20core1%20image%0A*%2F%0A%0AENTRY(Reset_Handler)%0A%0AHEAP_SIZE%20%20%3D%20DEFINED(__heap_size__)%20%20%3F%20__heap_size__%20%20%3A%200x0400%3B%0ASTACK_SIZE%20%3D%20DEFINED(__stack_size__)%20%3F%20__stack_size__%20%3A%200x0400%3B%0ARPMSG_SHMEM_SIZE%20%3D%20DEFINED(__use_shmem__)%20%3F%200x2000%20%3A%200%3B%0AVECTOR_RAM_SIZE%20%3D%20DEFINED(__ram_vector_table__)%20%3F%200x00000400%20%3A%200%3B%0A%0A%2F*%20---%20Reserve%20last%2010%20MB%20of%2064%20MB%20flash%20for%20M4%20---%20*%2F%0ACORE1IMAGE_START%20%3D%20DEFINED(__use_flash64MB__)%20%3F%200x33600000%20%3A%200x30FC0000%3B%0A%0A%2F*%20m_text%20starts%20at%200x30002400%20*%2F%0ATEXT_SIZE%20%3D%20CORE1IMAGE_START%20-%200x30002400%3B%0A%0A%2F*%20--------------------------------------------------------------------------%0A%20*%20Shared%20OCRAM%20regions%20(ONLY%20TWO)%3A%0A%20*%20%20-%20m_shared_params%20%20%3A%2064%20KB%20%20(DSP%20parameter%20structs%20etc)%0A%20*%20%20-%20m_shared_printf%20%20%3A%202%20KB%20%20%20(M7-%26gt%3BM4%20printf%20buffer)%0A%20*%20--------------------------------------------------------------------------%20*%2F%0ASHARED_PARAMS_SIZE%20%3D%200x00010000%3B%20%2F*%2064%20KB%20*%2F%0ASHARED_PRINTF_SIZE%20%3D%200x00000800%3B%20%2F*%202%20KB%20%20*%2F%0A%0AMEMORY%0A%7B%0A%20%20m_flash_config%20%20%20(RX)%20%3A%20ORIGIN%20%3D%200x30000400%2C%20LENGTH%20%3D%200x00000C00%0A%20%20m_ivt%20%20%20%20%20%20%20%20%20%20%20%20(RX)%20%3A%20ORIGIN%20%3D%200x30001000%2C%20LENGTH%20%3D%200x00001000%0A%20%20m_interrupts%20%20%20%20%20(RX)%20%3A%20ORIGIN%20%3D%200x30002000%2C%20LENGTH%20%3D%200x00000400%0A%20%20m_text%20%20%20%20%20%20%20%20%20%20%20(RX)%20%3A%20ORIGIN%20%3D%200x30002400%2C%20LENGTH%20%3D%20TEXT_SIZE%0A%0A%20%20%2F*%20Renamed%20for%20clarity%20*%2F%0A%20%20m_itcm%20%20%20%20%20%20%20%20%20%20%20(RX)%20%3A%20ORIGIN%20%3D%200x00000000%2C%20LENGTH%20%3D%200x00040000%0A%20%20m_dtcm%20%20%20%20%20%20%20%20%20%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20000000%2C%20LENGTH%20%3D%200x00040000%0A%0A%20%20%2F*%20OCRAM%201MB%3A%200x20240000..0x2033FFFF%20(partitioned)%20*%2F%0A%20%20m_ncache_local%20%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20240000%2C%20LENGTH%20%3D%200x00020000%20%20%2F*%20128KB%20*%2F%0A%0A%20%20%2F*%20Two%20explicit%20shared%20regions%20*%2F%0A%20%20m_shared_params%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20260000%2C%20LENGTH%20%3D%20SHARED_PARAMS_SIZE%20%2F*%2064KB%20*%2F%0A%20%20m_shared_printf%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20270000%2C%20LENGTH%20%3D%20SHARED_PRINTF_SIZE%20%2F*%202KB%20%20*%2F%0A%0A%20%20m_ncache_audio1%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20280000%2C%20LENGTH%20%3D%200x00040000%20%20%2F*%20256KB%20*%2F%0A%20%20m_ncache_audio2%20%20(RW)%20%3A%20ORIGIN%20%3D%200x202C0000%2C%20LENGTH%20%3D%200x00040000%20%20%2F*%20256KB%20*%2F%0A%20%20m_ncache_audio3%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20300000%2C%20LENGTH%20%3D%200x00040000%20%20%2F*%20256KB%20*%2F%0A%0A%20%20m_core1_image%20%20%20%20(RX)%20%3A%20ORIGIN%20%3D%20CORE1IMAGE_START%2C%20LENGTH%20%3D%200x00A00000%0A%7D%0A%0ASECTIONS%0A%7B%0A%20%20%2F*%20For%20existing%20SDK%20MPU%20hook%20on%20CM7%3A%20cover%200x20240000..0x2027FFFF%20*%2F%0A%20%20__NCACHE_REGION_START%20%3D%20ORIGIN(m_ncache_local)%3B%0A%20%20__NCACHE_REGION_SIZE%20%20%3D%200x00040000%3B%20%2F*%20256KB%20*%2F%0A%0A%20%20%2F*%20Shared%20region%20base%2Fsize%20symbols%20*%2F%0A%20%20__SHARED_PARAMS_START%20%3D%20ORIGIN(m_shared_params)%3B%0A%20%20__SHARED_PARAMS_SIZE%20%20%3D%20LENGTH(m_shared_params)%3B%0A%0A%20%20__SHARED_PRINTF_START%20%3D%20ORIGIN(m_shared_printf)%3B%0A%20%20__SHARED_PRINTF_SIZE%20%20%3D%20LENGTH(m_shared_printf)%3B%0A%0A%20%20.flash_config%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__FLASH_BASE%20%3D%20.%3B%0A%20%20%20%20KEEP(*%20(.boot_hdr.conf))%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%7D%20%26gt%3B%20m_flash_config%0A%0A%20%20ivt_begin%20%3D%20ORIGIN(m_flash_config)%20%2B%20LENGTH(m_flash_config)%3B%0A%0A%20%20.ivt%20%3A%20AT(ivt_begin)%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20KEEP(*%20(.boot_hdr.ivt))%0A%20%20%20%20KEEP(*%20(.boot_hdr.boot_data))%0A%20%20%20%20KEEP(*%20(.boot_hdr.dcd_data))%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%7D%20%26gt%3B%20m_ivt%0A%0A%20%20.core1_code%20%3A%0A%20%20%7B%0A%20%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20%20KEEP%20(*(.core1_code))%0A%20%20%20%20%20*(.core1_code*)%0A%20%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%7D%20%26gt%3B%20m_core1_image%0A%0A%20%20%2F*%20--------------------------------------------------------------------%0A%20%20%20*%20Shared%20DSP%20params%20region%20(NOLOAD)%0A%20%20%20*%20Place%20double-buffered%20param%20structs%20here%20later.%0A%20%20%20*%20--------------------------------------------------------------------%20*%2F%0A%20%20.shared_params%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__SHARED_PARAMS_START__%20%3D%20.%3B%0A%0A%20%20%20%20*(.shared_params*)%0A%20%20%20%20*(SharedParams*)%0A%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__SHARED_PARAMS_END__%20%3D%20.%3B%0A%0A%20%20%20%20ASSERT((__SHARED_PARAMS_END__%20-%20__SHARED_PARAMS_START__)%20%26lt%3B%3D%20LENGTH(m_shared_params)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%22shared_params%20section%20too%20large%22)%3B%0A%20%20%7D%20%26gt%3B%20m_shared_params%0A%0A%20%20%2F*%20--------------------------------------------------------------------%0A%20%20%20*%20Shared%20printf%20region%20(NOLOAD)%20-%20exclusive%20for%20M7-%26gt%3BM4%20print%20buffer%0A%20%20%20*%20--------------------------------------------------------------------%20*%2F%0A%20%20.shared_printf%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__SHARED_PRINTF_START__%20%3D%20.%3B%0A%0A%20%20%20%20*(.shared_printf*)%0A%20%20%20%20*(SharedPrintf*)%0A%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__SHARED_PRINTF_END__%20%3D%20.%3B%0A%0A%20%20%20%20ASSERT((__SHARED_PRINTF_END__%20-%20__SHARED_PRINTF_START__)%20%26lt%3B%3D%20LENGTH(m_shared_printf)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%22shared_printf%20section%20too%20large%22)%3B%0A%20%20%7D%20%26gt%3B%20m_shared_printf%0A%0A%20%20.interrupts%20%3A%0A%20%20%7B%0A%20%20%20%20__VECTOR_TABLE%20%3D%20.%3B%0A%20%20%20%20__Vectors%20%3D%20.%3B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20KEEP(*(.isr_vector))%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%7D%20%26gt%3B%20m_interrupts%0A%0A%20%20.text%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20*(.text)%0A%20%20%20%20*(.text*)%0A%20%20%20%20*(.rodata)%0A%20%20%20%20*(.rodata*)%0A%20%20%20%20*(.glue_7)%0A%20%20%20%20*(.glue_7t)%0A%20%20%20%20*(.eh_frame)%0A%20%20%20%20KEEP%20(*(.init))%0A%20%20%20%20KEEP%20(*(.fini))%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.ARM.extab%20%3A%20%7B%20*(.ARM.extab*%20.gnu.linkonce.armextab.*)%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.ARM%20%3A%0A%20%20%7B%0A%20%20%20%20__exidx_start%20%3D%20.%3B%0A%20%20%20%20*(.ARM.exidx*)%0A%20%20%20%20__exidx_end%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.ctors%20%3A%0A%20%20%7B%0A%20%20%20%20__CTOR_LIST__%20%3D%20.%3B%0A%20%20%20%20KEEP%20(*crtbegin.o(.ctors))%0A%20%20%20%20KEEP%20(*crtbegin%3F.o(.ctors))%0A%20%20%20%20KEEP%20(*(EXCLUDE_FILE(*crtend%3F.o%20*crtend.o)%20.ctors))%0A%20%20%20%20KEEP%20(*(SORT(.ctors.*)))%0A%20%20%20%20KEEP%20(*(.ctors))%0A%20%20%20%20__CTOR_END__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.dtors%20%3A%0A%20%20%7B%0A%20%20%20%20__DTOR_LIST__%20%3D%20.%3B%0A%20%20%20%20KEEP%20(*crtbegin.o(.dtors))%0A%20%20%20%20KEEP%20(*crtbegin%3F.o(.dtors))%0A%20%20%20%20KEEP%20(*(EXCLUDE_FILE(*crtend%3F.o%20*crtend.o)%20.dtors))%0A%20%20%20%20KEEP%20(*(SORT(.dtors.*)))%0A%20%20%20%20KEEP%20(*(.dtors))%0A%20%20%20%20__DTOR_END__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.preinit_array%20%3A%0A%20%20%7B%0A%20%20%20%20PROVIDE_HIDDEN%20(__preinit_array_start%20%3D%20.)%3B%0A%20%20%20%20KEEP%20(*(.preinit_array*))%0A%20%20%20%20PROVIDE_HIDDEN%20(__preinit_array_end%20%3D%20.)%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.init_array%20%3A%0A%20%20%7B%0A%20%20%20%20PROVIDE_HIDDEN%20(__init_array_start%20%3D%20.)%3B%0A%20%20%20%20KEEP%20(*(SORT(.init_array.*)))%0A%20%20%20%20KEEP%20(*(.init_array*))%0A%20%20%20%20PROVIDE_HIDDEN%20(__init_array_end%20%3D%20.)%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.fini_array%20%3A%0A%20%20%7B%0A%20%20%20%20PROVIDE_HIDDEN%20(__fini_array_start%20%3D%20.)%3B%0A%20%20%20%20KEEP%20(*(SORT(.fini_array.*)))%0A%20%20%20%20KEEP%20(*(.fini_array*))%0A%20%20%20%20PROVIDE_HIDDEN%20(__fini_array_end%20%3D%20.)%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20__etext%20%3D%20.%3B%0A%20%20__DATA_ROM%20%3D%20.%3B%0A%0A%20%20.interrupts_ram%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__VECTOR_RAM__%20%3D%20.%3B%0A%20%20%20%20__interrupts_ram_start__%20%3D%20.%3B%0A%20%20%20%20*(.m_interrupts_ram)%0A%20%20%20%20.%20%2B%3D%20VECTOR_RAM_SIZE%3B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__interrupts_ram_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20__VECTOR_RAM%20%3D%20DEFINED(__ram_vector_table__)%20%3F%20__VECTOR_RAM__%20%3A%20ORIGIN(m_interrupts)%3B%0A%0A%20%20.data%20%3A%20AT(__DATA_ROM)%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__DATA_RAM%20%3D%20.%3B%0A%20%20%20%20__data_start__%20%3D%20.%3B%0A%20%20%20%20*(.data)%0A%20%20%20%20*(.data*)%0A%20%20%20%20*(DataQuickAccess)%0A%20%20%20%20KEEP(*(.jcr*))%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__data_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20__ram_function_flash_start%20%3D%20__DATA_ROM%20%2B%20(__data_end__%20-%20__data_start__)%3B%0A%0A%20%20.ram_function%20%3A%20AT(__ram_function_flash_start)%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__ram_function_start__%20%3D%20.%3B%0A%20%20%20%20*(CodeQuickAccess)%0A%20%20%20%20.%20%3D%20ALIGN(128)%3B%0A%20%20%20%20__ram_function_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_itcm%0A%0A%20%20__NDATA_ROM%20%3D%20__ram_function_flash_start%20%2B%20(__ram_function_end__%20-%20__ram_function_start__)%3B%0A%0A%20%20%2F*%20M7%20local%20NonCacheable%20sections%20stay%20in%20dtcm%20(your%20current%20script%20behavior)%20*%2F%0A%20%20.ncache.init%20%3A%20AT(__NDATA_ROM)%0A%20%20%7B%0A%20%20%20%20__noncachedata_start__%20%3D%20.%3B%0A%20%20%20%20*(NonCacheable.init)%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__noncachedata_init_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20.%20%3D%20__noncachedata_init_end__%3B%0A%20%20.ncache%20%3A%0A%20%20%7B%0A%20%20%20%20*(NonCacheable)%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__noncachedata_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20__DATA_END%20%3D%20__NDATA_ROM%20%2B%20(__noncachedata_init_end__%20-%20__noncachedata_start__)%3B%0A%20%20text_end%20%3D%20ORIGIN(m_text)%20%2B%20LENGTH(m_text)%3B%0A%20%20ASSERT(__DATA_END%20%26lt%3B%3D%20text_end%2C%20%22region%20m_text%20overflowed%20with%20text%20and%20data%22)%0A%0A%20%20.bss%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__bss_start__%20%3D%20.%3B%0A%20%20%20%20*(.bss)%0A%20%20%20%20*(.bss*)%0A%20%20%20%20*(COMMON)%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__bss_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20.heap%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(8)%3B%0A%20%20%20%20__end__%20%3D%20.%3B%0A%20%20%20%20PROVIDE(end%20%3D%20.)%3B%0A%20%20%20%20__HeapBase%20%3D%20.%3B%0A%20%20%20%20.%20%2B%3D%20HEAP_SIZE%3B%0A%20%20%20%20__HeapLimit%20%3D%20.%3B%0A%20%20%20%20__heap_limit%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20.stack%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(8)%3B%0A%20%20%20%20.%20%2B%3D%20STACK_SIZE%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20__StackTop%20%20%20%3D%20ORIGIN(m_dtcm)%20%2B%20LENGTH(m_dtcm)%3B%0A%20%20__StackLimit%20%3D%20__StackTop%20-%20STACK_SIZE%3B%0A%20%20PROVIDE(__stack%20%3D%20__StackTop)%3B%0A%0A%20%20.ARM.attributes%200%20%3A%20%7B%20*(.ARM.attributes)%20%7D%0A%7D%0A%0AASSERT(__StackLimit%20%26gt%3B%3D%20__HeapLimit%2C%20%22region%20m_dtcm%20overflowed%20with%20stack%20and%20heap%22)%3B%0A%0A%0A%7D%0A%0A%2F%2F%20M4%2Farmgcc%2FMIMXRT1176xxxxx_cm4_flexspi_nor.ld%20%0A%20%2F*%20M4%2Farmgcc%2FMIMXRT1176xxxxx_cm4_flexspi_nor.ld%0A%20*%20M4%20XIP-from-FlexSPI%20with%20ITCM%2FDTCM%20hot%20sections%20%2B%20SDRAM%0A%20*%20OCRAM%20split%20into%3A%20128KB%20local%20ncache%20%2B%20shared%20params%20%2B%20shared%20printf%20%2B%20audio%20banks.%0A%20*%2F%0A%0AENTRY(Reset_Handler)%0A%0AHEAP_SIZE%20%20%3D%20DEFINED(__heap_size__)%20%20%3F%20__heap_size__%20%20%3A%200x0400%3B%0ASTACK_SIZE%20%3D%20DEFINED(__stack_size__)%20%3F%20__stack_size__%20%3A%200x0400%3B%0A%0A%2F*%20--------------------------------------------------------------------------%0A%20*%20Shared%20OCRAM%20regions%20(ONLY%20TWO)%3A%0A%20*%20%20-%20m_shared_params%20%20%3A%2064%20KB%20%20(DSP%20parameter%20structs%20etc)%0A%20*%20%20-%20m_shared_printf%20%20%3A%202%20KB%20%20%20(M7-%26gt%3BM4%20printf%20buffer)%0A%20*%20--------------------------------------------------------------------------%20*%2F%0ASHARED_PARAMS_SIZE%20%3D%200x00010000%3B%20%2F*%2064%20KB%20*%2F%0ASHARED_PRINTF_SIZE%20%3D%200x00000800%3B%20%2F*%202%20KB%20%20*%2F%0A%0ASDRAM_BASE%20%20%20%20%20%20%20%20%3D%200x80000000%3B%0ASDRAM_SIZE%20%20%20%20%20%20%20%20%3D%200x04000000%3B%20%2F*%2064%20MB%20*%2F%0ASDRAM_C_SIZE%20%20%20%20%20%20%3D%200x00800000%3B%20%2F*%208%20MB%20cacheable%20*%2F%0ASDRAM_NC_BASE%20%20%20%20%20%3D%20SDRAM_BASE%20%2B%20SDRAM_C_SIZE%3B%20%2F*%200x80800000%20*%2F%0ASDRAM_NC_SIZE%20%20%20%20%20%3D%20SDRAM_SIZE%20-%20SDRAM_C_SIZE%3B%20%2F*%2056%20MB%20*%2F%0A%0AM4_FLASH_BASE%20%3D%200x33600000%3B%0AM4_FLASH_SIZE%20%3D%200x00A00000%3B%0A%0AMEMORY%0A%7B%0A%20%20m_interrupts%20(RX)%20%3A%20ORIGIN%20%3D%20M4_FLASH_BASE%2C%20%20%20%20%20%20%20%20%20%20%20LENGTH%20%3D%200x00000400%0A%20%20m_text%20%20%20%20%20%20%20(RX)%20%3A%20ORIGIN%20%3D%20M4_FLASH_BASE%20%2B%200x400%2C%20%20%20LENGTH%20%3D%20M4_FLASH_SIZE%20-%200x00000400%0A%0A%20%20m_itcm%20%20%20%20%20%20%20(RX)%20%3A%20ORIGIN%20%3D%200x1FFE0000%2C%20LENGTH%20%3D%200x00020000%0A%20%20m_dtcm%20%20%20%20%20%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20000000%2C%20LENGTH%20%3D%200x00020000%0A%0A%20%20%2F*%20OCRAM%201MB%20partition%20*%2F%0A%20%20m_ncache_local%20%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20240000%2C%20LENGTH%20%3D%200x00020000%20%20%2F*%20128KB%20*%2F%0A%0A%20%20%2F*%20Two%20explicit%20shared%20regions%20*%2F%0A%20%20m_shared_params%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20260000%2C%20LENGTH%20%3D%20SHARED_PARAMS_SIZE%20%2F*%2064KB%20*%2F%0A%20%20m_shared_printf%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20270000%2C%20LENGTH%20%3D%20SHARED_PRINTF_SIZE%20%2F*%202KB%20%20*%2F%0A%0A%20%20m_ncache_audio1%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20280000%2C%20LENGTH%20%3D%200x00040000%20%20%2F*%20256KB%20*%2F%0A%20%20m_ncache_audio2%20%20(RW)%20%3A%20ORIGIN%20%3D%200x202C0000%2C%20LENGTH%20%3D%200x00040000%20%20%2F*%20256KB%20*%2F%0A%20%20m_ncache_audio3%20%20(RW)%20%3A%20ORIGIN%20%3D%200x20300000%2C%20LENGTH%20%3D%200x00040000%20%20%2F*%20256KB%20*%2F%0A%0A%20%20m_sdram_c%20%20%20%20(RW)%20%3A%20ORIGIN%20%3D%20SDRAM_BASE%2C%20%20%20%20LENGTH%20%3D%20SDRAM_C_SIZE%0A%20%20m_sdram_nc%20%20%20(RW)%20%3A%20ORIGIN%20%3D%20SDRAM_NC_BASE%2C%20LENGTH%20%3D%20SDRAM_NC_SIZE%0A%7D%0A%0ASECTIONS%0A%7B%0A%20%20%2F*%20Shared%20region%20base%2Fsize%20symbols%20*%2F%0A%20%20__SHARED_PARAMS_START%20%3D%20ORIGIN(m_shared_params)%3B%0A%20%20__SHARED_PARAMS_SIZE%20%20%3D%20LENGTH(m_shared_params)%3B%0A%0A%20%20__SHARED_PRINTF_START%20%3D%20ORIGIN(m_shared_printf)%3B%0A%20%20__SHARED_PRINTF_SIZE%20%20%3D%20LENGTH(m_shared_printf)%3B%0A%0A%20%20%2F*%20M4%20local%20non-cache%20region%20(used%20by%20your%20M4%20MPU%20code%20path)%20*%2F%0A%20%20__NCACHE_REGION_START%20%3D%20ORIGIN(m_ncache_local)%3B%0A%20%20__NCACHE_REGION_SIZE%20%20%3D%20LENGTH(m_ncache_local)%3B%0A%0A%20%20%2F*%20--------------------------------------------------------------------%0A%20%20%20*%20Shared%20DSP%20params%20region%20(NOLOAD)%0A%20%20%20*%20--------------------------------------------------------------------%20*%2F%0A%20%20.shared_params%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__SHARED_PARAMS_START__%20%3D%20.%3B%0A%0A%20%20%20%20*(.shared_params*)%0A%20%20%20%20*(SharedParams*)%0A%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__SHARED_PARAMS_END__%20%3D%20.%3B%0A%0A%20%20%20%20ASSERT((__SHARED_PARAMS_END__%20-%20__SHARED_PARAMS_START__)%20%26lt%3B%3D%20LENGTH(m_shared_params)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%22shared_params%20section%20too%20large%22)%3B%0A%20%20%7D%20%26gt%3B%20m_shared_params%0A%0A%20%20%2F*%20--------------------------------------------------------------------%0A%20%20%20*%20Shared%20printf%20region%20(NOLOAD)%20-%20exclusive%20for%20M7-%26gt%3BM4%20print%20buffer%0A%20%20%20*%20--------------------------------------------------------------------%20*%2F%0A%20%20.shared_printf%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__SHARED_PRINTF_START__%20%3D%20.%3B%0A%0A%20%20%20%20*(.shared_printf*)%0A%20%20%20%20*(SharedPrintf*)%0A%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__SHARED_PRINTF_END__%20%3D%20.%3B%0A%0A%20%20%20%20ASSERT((__SHARED_PRINTF_END__%20-%20__SHARED_PRINTF_START__)%20%26lt%3B%3D%20LENGTH(m_shared_printf)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%22shared_printf%20section%20too%20large%22)%3B%0A%20%20%7D%20%26gt%3B%20m_shared_printf%0A%0A%20%20.interrupts%20%3A%0A%20%20%7B%0A%20%20%20%20__VECTOR_TABLE%20%3D%20.%3B%0A%20%20%20%20__Vectors%20%3D%20.%3B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20KEEP(*(.isr_vector))%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%7D%20%26gt%3B%20m_interrupts%0A%0A%20%20.text%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20*(.text)%0A%20%20%20%20*(.text*)%0A%20%20%20%20*(.rodata)%0A%20%20%20%20*(.rodata*)%0A%20%20%20%20*(.glue_7)%0A%20%20%20%20*(.glue_7t)%0A%20%20%20%20*(.eh_frame)%0A%20%20%20%20KEEP(*(.init))%0A%20%20%20%20KEEP(*(.fini))%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.ARM.extab%20%3A%20%7B%20*(.ARM.extab*%20.gnu.linkonce.armextab.*)%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.ARM%20%3A%0A%20%20%7B%0A%20%20%20%20__exidx_start%20%3D%20.%3B%0A%20%20%20%20*(.ARM.exidx*)%0A%20%20%20%20__exidx_end%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.ctors%20%3A%0A%20%20%7B%0A%20%20%20%20__CTOR_LIST__%20%3D%20.%3B%0A%20%20%20%20KEEP%20(*crtbegin.o(.ctors))%0A%20%20%20%20KEEP%20(*crtbegin%3F.o(.ctors))%0A%20%20%20%20KEEP%20(*(EXCLUDE_FILE(*crtend%3F.o%20*crtend.o)%20.ctors))%0A%20%20%20%20KEEP%20(*(SORT(.ctors.*)))%0A%20%20%20%20KEEP%20(*(.ctors))%0A%20%20%20%20__CTOR_END__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.dtors%20%3A%0A%20%20%7B%0A%20%20%20%20__DTOR_LIST__%20%3D%20.%3B%0A%20%20%20%20KEEP%20(*crtbegin.o(.dtors))%0A%20%20%20%20KEEP%20(*crtbegin%3F.o(.dtors))%0A%20%20%20%20KEEP%20(*(EXCLUDE_FILE(*crtend%3F.o%20*crtend.o)%20.dtors))%0A%20%20%20%20KEEP%20(*(SORT(.dtors.*)))%0A%20%20%20%20KEEP%20(*(.dtors))%0A%20%20%20%20__DTOR_END__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.preinit_array%20%3A%0A%20%20%7B%0A%20%20%20%20PROVIDE_HIDDEN%20(__preinit_array_start%20%3D%20.)%3B%0A%20%20%20%20KEEP%20(*(.preinit_array*))%0A%20%20%20%20PROVIDE_HIDDEN%20(__preinit_array_end%20%3D%20.)%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.init_array%20%3A%0A%20%20%7B%0A%20%20%20%20PROVIDE_HIDDEN%20(__init_array_start%20%3D%20.)%3B%0A%20%20%20%20KEEP%20(*(SORT(.init_array.*)))%0A%20%20%20%20KEEP%20(*(.init_array*))%0A%20%20%20%20PROVIDE_HIDDEN%20(__init_array_end%20%3D%20.)%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20.fini_array%20%3A%0A%20%20%7B%0A%20%20%20%20PROVIDE_HIDDEN%20(__fini_array_start%20%3D%20.)%3B%0A%20%20%20%20KEEP%20(*(SORT(.fini_array.*)))%0A%20%20%20%20KEEP%20(*(.fini_array*))%0A%20%20%20%20PROVIDE_HIDDEN%20(__fini_array_end%20%3D%20.)%3B%0A%20%20%7D%20%26gt%3B%20m_text%0A%0A%20%20__etext%20%3D%20.%3B%0A%20%20__DATA_ROM%20%3D%20.%3B%0A%0A%20%20__itcm_text_load__%20%3D%20__DATA_ROM%3B%0A%20%20.itcm_text%20%3A%20AT(__itcm_text_load__)%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__itcm_text_start__%20%3D%20.%3B%0A%20%20%20%20*(.itcm_text*)%0A%20%20%20%20*(ITCM_TEXT*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__itcm_text_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_itcm%0A%0A%20%20__DATA_ROM_AFTER_ITCM%20%3D%20__itcm_text_load__%20%2B%20(__itcm_text_end__%20-%20__itcm_text_start__)%3B%0A%0A%20%20__dtcm_data_load__%20%3D%20__DATA_ROM_AFTER_ITCM%3B%0A%20%20.dtcm_data%20%3A%20AT(__dtcm_data_load__)%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__dtcm_data_start__%20%3D%20.%3B%0A%20%20%20%20*(.dtcm_data*)%0A%20%20%20%20*(DTCM_DATA*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__dtcm_data_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20__DATA_ROM_AFTER_DTCM%20%3D%20__dtcm_data_load__%20%2B%20(__dtcm_data_end__%20-%20__dtcm_data_start__)%3B%0A%20%20__DATA_ROM%20%3D%20__DATA_ROM_AFTER_DTCM%3B%0A%0A%20%20.data%20%3A%20AT(__DATA_ROM)%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__DATA_RAM%20%3D%20.%3B%0A%20%20%20%20__data_start__%20%3D%20.%3B%0A%20%20%20%20*(.data)%0A%20%20%20%20*(.data*)%0A%20%20%20%20*(DataQuickAccess)%0A%20%20%20%20KEEP(*(.jcr*))%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__data_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20__NDATA_ROM%20%3D%20__DATA_ROM%20%2B%20(__data_end__%20-%20__data_start__)%3B%0A%0A%20%20%2F*%20M4-local%20NonCacheable%20sections%20-%26gt%3B%20local%20128KB%20*%2F%0A%20%20.ncache.init%20%3A%20AT(__NDATA_ROM)%0A%20%20%7B%0A%20%20%20%20__noncachedata_start__%20%3D%20.%3B%0A%20%20%20%20*(NonCacheable.init)%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__noncachedata_init_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_ncache_local%0A%0A%20%20.ncache%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20*(NonCacheable)%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__noncachedata_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_ncache_local%0A%0A%20%20.bss%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__bss_start__%20%3D%20.%3B%0A%20%20%20%20*(.bss)%0A%20%20%20%20*(.bss*)%0A%20%20%20%20*(COMMON)%0A%20%20%20%20.%20%3D%20ALIGN(4)%3B%0A%20%20%20%20__bss_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20.dtcm_bss%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__dtcm_bss_start__%20%3D%20.%3B%0A%20%20%20%20*(.dtcm_bss*)%0A%20%20%20%20*(DTCM_BSS*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__dtcm_bss_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20%2F*%20----------%20Audio%20OCRAM%20banks%20(non-cacheable%2C%20NOLOAD)%20----------%20*%2F%0A%20%20.audio1_bss%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__audio1_bss_start__%20%3D%20.%3B%0A%20%20%20%20*(.audio1_bss*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__audio1_bss_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_ncache_audio1%0A%0A%20%20.audio2_bss%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__audio2_bss_start__%20%3D%20.%3B%0A%20%20%20%20*(.audio2_bss*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__audio2_bss_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_ncache_audio2%0A%0A%20%20.audio3_bss%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__audio3_bss_start__%20%3D%20.%3B%0A%20%20%20%20*(.audio3_bss*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__audio3_bss_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_ncache_audio3%0A%0A%20%20%2F*%20----------%20Cacheable%20SDRAM%20(8MB)%20----------%20*%2F%0A%20%20__SDRAM_C_DATA_ROM%20%3D%20__NDATA_ROM%20%2B%20(__noncachedata_init_end__%20-%20__noncachedata_start__)%3B%0A%0A%20%20.sdram_c_data%20%3A%20AT(__SDRAM_C_DATA_ROM)%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__sdram_c_data_start__%20%3D%20.%3B%0A%20%20%20%20*(.sdram_c_data*)%0A%20%20%20%20*(SDRAM_C_DATA*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__sdram_c_data_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_sdram_c%0A%0A%20%20__sdram_c_data_load__%20%3D%20__SDRAM_C_DATA_ROM%3B%0A%0A%20%20.sdram_c_bss%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__sdram_c_bss_start__%20%3D%20.%3B%0A%20%20%20%20*(.sdram_c_bss*)%0A%20%20%20%20*(SDRAM_C_BSS*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__sdram_c_bss_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_sdram_c%0A%0A%20%20.sdram_nc_bss%20(NOLOAD)%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__sdram_nc_bss_start__%20%3D%20.%3B%0A%20%20%20%20*(.sdram_nc_bss*)%0A%20%20%20%20*(SDRAM_NC_BSS*)%0A%20%20%20%20.%20%3D%20ALIGN(32)%3B%0A%20%20%20%20__sdram_nc_bss_end__%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_sdram_nc%0A%0A%20%20.heap%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(8)%3B%0A%20%20%20%20__end__%20%3D%20.%3B%0A%20%20%20%20PROVIDE(end%20%3D%20.)%3B%0A%20%20%20%20__HeapBase%20%3D%20.%3B%0A%20%20%20%20.%20%2B%3D%20HEAP_SIZE%3B%0A%20%20%20%20__HeapLimit%20%3D%20.%3B%0A%20%20%20%20__heap_limit%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20.stack%20%3A%0A%20%20%7B%0A%20%20%20%20.%20%3D%20ALIGN(8)%3B%0A%20%20%20%20.%20%2B%3D%20STACK_SIZE%3B%0A%20%20%20%20__StackEnd%20%3D%20.%3B%0A%20%20%7D%20%26gt%3B%20m_dtcm%0A%0A%20%20__StackTop%20%20%20%3D%20ORIGIN(m_dtcm)%20%2B%20LENGTH(m_dtcm)%3B%0A%20%20__StackLimit%20%3D%20__StackTop%20-%20STACK_SIZE%3B%0A%20%20PROVIDE(__stack%20%3D%20__StackTop)%3B%0A%0A%20%20.ARM.attributes%200%20%3A%20%7B%20*(.ARM.attributes)%20%7D%0A%0A%20%20__SDRAM_BASE%20%20%20%20%20%20%3D%20SDRAM_BASE%3B%0A%20%20__SDRAM_SIZE%20%20%20%20%20%20%3D%20SDRAM_SIZE%3B%0A%20%20__SDRAM_C_BASE%20%20%20%20%3D%20SDRAM_BASE%3B%0A%20%20__SDRAM_C_SIZE%20%20%20%20%3D%20SDRAM_C_SIZE%3B%0A%20%20__SDRAM_NC_BASE%20%20%20%3D%20SDRAM_NC_BASE%3B%0A%20%20__SDRAM_NC_SIZE%20%20%20%3D%20SDRAM_NC_SIZE%3B%0A%7D%0A%7D%0A%0A%2F*%20MPU%20configuration.%20*%2F%0A%23if%20__CORTEX_M%20%3D%3D%207%0A%0Avoid%20BOARD_ConfigMPU(void)%0A%7B%0A%23if%20defined(__CC_ARM)%20%7C%7C%20defined(__ARMCC_VERSION)%0A%20%20%20%20extern%20uint32_t%20Image%24%24RW_m_ncache%24%24Base%5B%5D%3B%0A%20%20%20%20extern%20uint32_t%20Image%24%24RW_m_ncache_unused%24%24Base%5B%5D%3B%0A%20%20%20%20extern%20uint32_t%20Image%24%24RW_m_ncache_unused%24%24ZI%24%24Limit%5B%5D%3B%0A%20%20%20%20uint32_t%20nonCacheStart%20%3D%20(uint32_t)Image%24%24RW_m_ncache%24%24Base%3B%0A%20%20%20%20uint32_t%20size%20%20%20%20%20%20%20%20%20%20%3D%20((uint32_t)Image%24%24RW_m_ncache_unused%24%24Base%20%3D%3D%20nonCacheStart)%20%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200U%20%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20((uint32_t)Image%24%24RW_m_ncache_unused%24%24ZI%24%24Limit%20-%20nonCacheStart)%3B%0A%23elif%20defined(__MCUXPRESSO)%0A%23if%20defined(__USE_SHMEM)%0A%20%20%20%20extern%20uint32_t%20__base_rpmsg_sh_mem%3B%0A%20%20%20%20extern%20uint32_t%20__top_rpmsg_sh_mem%3B%0A%20%20%20%20uint32_t%20nonCacheStart%20%3D%20(uint32_t)(%26amp%3B__base_rpmsg_sh_mem)%3B%0A%20%20%20%20uint32_t%20size%20%20%20%20%20%20%20%20%20%20%3D%20(uint32_t)(%26amp%3B__top_rpmsg_sh_mem)%20-%20nonCacheStart%3B%0A%23else%0A%20%20%20%20extern%20uint32_t%20__base_NCACHE_REGION%3B%0A%20%20%20%20extern%20uint32_t%20__top_NCACHE_REGION%3B%0A%20%20%20%20uint32_t%20nonCacheStart%20%3D%20(uint32_t)(%26amp%3B__base_NCACHE_REGION)%3B%0A%20%20%20%20uint32_t%20size%20%20%20%20%20%20%20%20%20%20%3D%20(uint32_t)(%26amp%3B__top_NCACHE_REGION)%20-%20nonCacheStart%3B%0A%23endif%0A%23elif%20defined(__ICCARM__)%20%7C%7C%20defined(__GNUC__)%0A%20%20%20%20extern%20uint32_t%20__NCACHE_REGION_START%5B%5D%3B%0A%20%20%20%20extern%20uint32_t%20__NCACHE_REGION_SIZE%5B%5D%3B%0A%20%20%20%20uint32_t%20nonCacheStart%20%3D%20(uint32_t)__NCACHE_REGION_START%3B%0A%20%20%20%20uint32_t%20size%20%20%20%20%20%20%20%20%20%20%3D%20(uint32_t)__NCACHE_REGION_SIZE%3B%0A%23endif%0A%20%20%20%20(void)nonCacheStart%3B%0A%20%20%20%20(void)size%3B%0A%0A%23if%20defined(__ICACHE_PRESENT)%20%26amp%3B%26amp%3B%20__ICACHE_PRESENT%0A%20%20%20%20if%20(SCB_CCR_IC_Msk%20%3D%3D%20(SCB_CCR_IC_Msk%20%26amp%3B%20SCB-%26gt%3BCCR))%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20SCB_DisableICache()%3B%0A%20%20%20%20%7D%0A%23endif%0A%23if%20defined(__DCACHE_PRESENT)%20%26amp%3B%26amp%3B%20__DCACHE_PRESENT%0A%20%20%20%20if%20(SCB_CCR_DC_Msk%20%3D%3D%20(SCB_CCR_DC_Msk%20%26amp%3B%20SCB-%26gt%3BCCR))%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20SCB_DisableDCache()%3B%0A%20%20%20%20%7D%0A%23endif%0A%0A%20%20%20%20ARM_MPU_Disable()%3B%0A%0A%20%20%20%20%2F*%20Region%200%3A%20deny%20all%20(speculative%20prefetch%20workaround)%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(0%2C%200x00000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(1%2C%20ARM_MPU_AP_NONE%2C%200%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_4GB)%3B%0A%0A%20%20%20%20%2F*%20Region%201%3A%20Device%2C%20not%20shareable%2C%20non-cacheable%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(1%2C%200x80000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%202%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_512MB)%3B%0A%0A%20%20%20%20%2F*%20Region%202%3A%20Device%2C%20not%20shareable%2C%20non-cacheable%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(2%2C%200x60000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%202%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_512MB)%3B%0A%0A%20%20%20%20%2F*%20Region%203%3A%20Device%2C%20not%20shareable%2C%20non-cacheable%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(3%2C%200x00000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%202%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_1GB)%3B%0A%0A%20%20%20%20%2F*%20Region%204%3A%20Normal%2C%20WB%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(4%2C%200x00000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%200%2C%200%2C%201%2C%201%2C%200%2C%20ARM_MPU_REGION_SIZE_256KB)%3B%0A%0A%20%20%20%20%2F*%20Region%205%3A%20Normal%2C%20WB%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(5%2C%200x20000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%200%2C%200%2C%201%2C%201%2C%200%2C%20ARM_MPU_REGION_SIZE_256KB)%3B%0A%0A%20%20%20%20%2F*%20--------------------------------------------------------------------%0A%20%20%20%20%20*%20OCRAM%20(0x2024_0000..0x2033_FFFF%2C%201MB)%20must%20be%20NORMAL%20%2B%20NON-CACHEABLE%20%2B%20SHAREABLE.%0A%20%20%20%20%20*%20Use%203%20aligned%20regions%3A%0A%20%20%20%20%20*%20%20%20-%200x2024_0000%20size%20256KB%0A%20%20%20%20%20*%20%20%20-%200x2028_0000%20size%20512KB%0A%20%20%20%20%20*%20%20%20-%200x2030_0000%20size%20256KB%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20Attributes%3A%20Normal%2C%20SHAREABLE%2C%20non-cacheable%20(TypeExt%3D1%2C%20S%3D1%2C%20C%3D0%2C%20B%3D0)%0A%20%20%20%20%20*%20--------------------------------------------------------------------%20*%2F%0A%0A%20%20%20%20%2F*%20Region%206%3A%20OCRAM%20256KB%20(SHAREABLE%2C%20non-cacheable)%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(6%2C%200x20240000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%201%2C%201%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_256KB)%3B%0A%0A%20%20%20%20%2F*%20Region%207%3A%20OCRAM%20512KB%20(SHAREABLE%2C%20non-cacheable)%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(7%2C%200x20280000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%201%2C%201%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_512KB)%3B%0A%0A%20%20%20%20%2F*%20Region%2010%3A%20OCRAM%20256KB%20(SHAREABLE%2C%20non-cacheable)%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(10%2C%200x20300000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%201%2C%201%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_256KB)%3B%0A%0A%23if%20defined(CACHE_MODE_WRITE_THROUGH)%20%26amp%3B%26amp%3B%20CACHE_MODE_WRITE_THROUGH%0A%20%20%20%20%2F*%20---%20SDRAM%3A%20default%20NON-cacheable%2064MB%20---%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(11%2C%200x80000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%201%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_64MB)%3B%0A%0A%20%20%20%20%2F*%20---%20SDRAM%3A%20overlay%20first%208MB%20as%20cacheable%20(WT)%20---%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(12%2C%200x80000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%200%2C%200%2C%201%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_8MB)%3B%0A%23else%0A%20%20%20%20%2F*%20---%20SDRAM%3A%20default%20NON-cacheable%2064MB%20---%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(11%2C%200x80000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%201%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_64MB)%3B%0A%0A%20%20%20%20%2F*%20---%20SDRAM%3A%20overlay%20first%208MB%20as%20cacheable%20(WB)%20---%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(12%2C%200x80000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%200%2C%200%2C%201%2C%201%2C%200%2C%20ARM_MPU_REGION_SIZE_8MB)%3B%0A%23endif%0A%0A%23if%20defined(XIP_EXTERNAL_FLASH)%20%26amp%3B%26amp%3B%20(XIP_EXTERNAL_FLASH%20%3D%3D%201)%0A%20%20%20%20%2F*%20Region%208%3A%20XIP%20external%20flash%2C%20RO%2C%20WB%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(8%2C%200x30000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_RO%2C%200%2C%200%2C%201%2C%201%2C%200%2C%20ARM_MPU_REGION_SIZE_16MB)%3B%0A%23endif%0A%0A%23ifdef%20USE_SDRAM%0A%23if%20defined(CACHE_MODE_WRITE_THROUGH)%20%26amp%3B%26amp%3B%20CACHE_MODE_WRITE_THROUGH%0A%20%20%20%20%2F*%20Region%209%3A%20SDRAM%20overall%20WT%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(9%2C%200x80000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%200%2C%200%2C%201%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_64MB)%3B%0A%23else%0A%20%20%20%20%2F*%20Region%209%3A%20SDRAM%20overall%20WB%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(9%2C%200x80000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%200%2C%200%2C%201%2C%201%2C%200%2C%20ARM_MPU_REGION_SIZE_64MB)%3B%0A%23endif%0A%23endif%0A%0A%20%20%20%20%2F*%20Region%2013..15%3A%20Device%20peripheral%20windows%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(13%2C%200x40000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%202%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_16MB)%3B%0A%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(14%2C%200x41000000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%202%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_2MB)%3B%0A%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(15%2C%200x41400000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%202%2C%200%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_1MB)%3B%0A%0A%20%20%20%20ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk%20%7C%20MPU_CTRL_HFNMIENA_Msk)%3B%0A%0A%23if%20defined(__DCACHE_PRESENT)%20%26amp%3B%26amp%3B%20__DCACHE_PRESENT%0A%20%20%20%20SCB_EnableDCache()%3B%0A%23endif%0A%23if%20defined(__ICACHE_PRESENT)%20%26amp%3B%26amp%3B%20__ICACHE_PRESENT%0A%20%20%20%20SCB_EnableICache()%3B%0A%23endif%0A%7D%0A%0A%23elif%20__CORTEX_M%20%3D%3D%204%0A%0Avoid%20BOARD_ConfigMPU(void)%0A%7B%0A%20%20%20%20%2F*%20We%20still%20read%20these%20linker%20symbols%20for%20sanity%2Fcompatibility%2C%0A%20%20%20%20%20%20%20but%20OCRAM%20MPU%20policy%20is%20configured%20explicitly%20below.%20*%2F%0A%23if%20defined(__CC_ARM)%20%7C%7C%20defined(__ARMCC_VERSION)%0A%20%20%20%20extern%20uint32_t%20Image%24%24RW_m_ncache%24%24Base%5B%5D%3B%0A%20%20%20%20extern%20uint32_t%20Image%24%24RW_m_ncache_unused%24%24Base%5B%5D%3B%0A%20%20%20%20extern%20uint32_t%20Image%24%24RW_m_ncache_unused%24%24ZI%24%24Limit%5B%5D%3B%0A%20%20%20%20uint32_t%20nonCacheStart%20%3D%20(uint32_t)Image%24%24RW_m_ncache%24%24Base%3B%0A%20%20%20%20uint32_t%20nonCacheSize%20%20%3D%20((uint32_t)Image%24%24RW_m_ncache_unused%24%24Base%20%3D%3D%20nonCacheStart)%20%3F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200U%20%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20((uint32_t)Image%24%24RW_m_ncache_unused%24%24ZI%24%24Limit%20-%20nonCacheStart)%3B%0A%23elif%20defined(__MCUXPRESSO)%0A%20%20%20%20extern%20uint32_t%20__base_NCACHE_REGION%3B%0A%20%20%20%20extern%20uint32_t%20__top_NCACHE_REGION%3B%0A%20%20%20%20uint32_t%20nonCacheStart%20%3D%20(uint32_t)(%26amp%3B__base_NCACHE_REGION)%3B%0A%20%20%20%20uint32_t%20nonCacheSize%20%20%3D%20(uint32_t)(%26amp%3B__top_NCACHE_REGION)%20-%20nonCacheStart%3B%0A%23elif%20defined(__ICCARM__)%20%7C%7C%20defined(__GNUC__)%0A%20%20%20%20extern%20uint32_t%20__NCACHE_REGION_START%5B%5D%3B%0A%20%20%20%20extern%20uint32_t%20__NCACHE_REGION_SIZE%5B%5D%3B%0A%20%20%20%20uint32_t%20nonCacheStart%20%3D%20(uint32_t)__NCACHE_REGION_START%3B%0A%20%20%20%20uint32_t%20nonCacheSize%20%20%3D%20(uint32_t)__NCACHE_REGION_SIZE%3B%0A%23endif%0A%0A%20%20%20%20%2F*%20Only%20config%20non-cacheable%20region%20on%20system%20bus%20*%2F%0A%20%20%20%20assert(nonCacheStart%20%26gt%3B%3D%200x20000000U)%3B%0A%0A%20%20%20%20%2F*%20----%20Disable%20code%20bus%20cache%20(LMEM)%20----%20*%2F%0A%20%20%20%20if%20(LMEM_PCCCR_ENCACHE_MASK%20%3D%3D%20(LMEM_PCCCR_ENCACHE_MASK%20%26amp%3B%20LMEM-%26gt%3BPCCCR))%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20LMEM-%26gt%3BPCCCR%20%7C%3D%20LMEM_PCCCR_PUSHW0_MASK%20%7C%20LMEM_PCCCR_PUSHW1_MASK%20%7C%20LMEM_PCCCR_GO_MASK%3B%0A%20%20%20%20%20%20%20%20while%20((LMEM-%26gt%3BPCCCR%20%26amp%3B%20LMEM_PCCCR_GO_MASK)%20!%3D%200U)%20%7B%7D%0A%20%20%20%20%20%20%20%20LMEM-%26gt%3BPCCCR%20%26amp%3B%3D%20~(LMEM_PCCCR_PUSHW0_MASK%20%7C%20LMEM_PCCCR_PUSHW1_MASK)%3B%0A%20%20%20%20%20%20%20%20LMEM-%26gt%3BPCCCR%20%26amp%3B%3D%20~LMEM_PCCCR_ENCACHE_MASK%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%2F*%20----%20Disable%20system%20bus%20cache%20(LMEM)%20----%20*%2F%0A%20%20%20%20if%20(LMEM_PSCCR_ENCACHE_MASK%20%3D%3D%20(LMEM_PSCCR_ENCACHE_MASK%20%26amp%3B%20LMEM-%26gt%3BPSCCR))%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20LMEM-%26gt%3BPSCCR%20%7C%3D%20LMEM_PSCCR_PUSHW0_MASK%20%7C%20LMEM_PSCCR_PUSHW1_MASK%20%7C%20LMEM_PSCCR_GO_MASK%3B%0A%20%20%20%20%20%20%20%20while%20((LMEM-%26gt%3BPSCCR%20%26amp%3B%20LMEM_PSCCR_GO_MASK)%20!%3D%200U)%20%7B%7D%0A%20%20%20%20%20%20%20%20LMEM-%26gt%3BPSCCR%20%26amp%3B%3D%20~(LMEM_PSCCR_PUSHW0_MASK%20%7C%20LMEM_PSCCR_PUSHW1_MASK)%3B%0A%20%20%20%20%20%20%20%20LMEM-%26gt%3BPSCCR%20%26amp%3B%3D%20~LMEM_PSCCR_ENCACHE_MASK%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20ARM_MPU_Disable()%3B%0A%0A%20%20%20%20%2F*%20--------------------------------------------------------------------%0A%20%20%20%20%20*%20OCRAM%20(0x2024_0000..0x2033_FFFF%2C%201MB)%20must%20be%20NORMAL%20%2B%20NON-CACHEABLE%20%2B%20SHAREABLE.%0A%20%20%20%20%20*%20Use%203%20aligned%20regions%3A%0A%20%20%20%20%20*%20%20%20-%200x2024_0000%20size%20256KB%0A%20%20%20%20%20*%20%20%20-%200x2028_0000%20size%20512KB%0A%20%20%20%20%20*%20%20%20-%200x2030_0000%20size%20256KB%0A%20%20%20%20%20*%0A%20%20%20%20%20*%20Attributes%3A%20Normal%2C%20SHAREABLE%2C%20non-cacheable%20(TypeExt%3D1%2C%20S%3D1%2C%20C%3D0%2C%20B%3D0)%0A%20%20%20%20%20*%20--------------------------------------------------------------------%20*%2F%0A%0A%20%20%20%20%2F*%20Region%200%3A%20OCRAM%20256KB%20(SHAREABLE%2C%20non-cacheable)%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(0%2C%200x20240000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201%2C%20%2F*%20TypeExtField%3D1%20%3D%26gt%3B%20Normal%20non-cacheable%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201%2C%20%2F*%20Shareable%20%3D%201%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%2C%20%2F*%20Cacheable%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%2C%20%2F*%20Bufferable%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ARM_MPU_REGION_SIZE_256KB)%3B%0A%0A%20%20%20%20%2F*%20Region%201%3A%20OCRAM%20512KB%20(SHAREABLE%2C%20non-cacheable)%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(1%2C%200x20280000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%201%2C%201%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_512KB)%3B%0A%0A%20%20%20%20%2F*%20Region%202%3A%20OCRAM%20256KB%20(SHAREABLE%2C%20non-cacheable)%20*%2F%0A%20%20%20%20MPU-%26gt%3BRBAR%20%3D%20ARM_MPU_RBAR(2%2C%200x20300000U)%3B%0A%20%20%20%20MPU-%26gt%3BRASR%20%3D%20ARM_MPU_RASR(0%2C%20ARM_MPU_AP_FULL%2C%201%2C%201%2C%200%2C%200%2C%200%2C%20ARM_MPU_REGION_SIZE_256KB)%3B%0A%0A%20%20%20%20%2F*%20Optional%20sanity%20check%3A%20local%20ncache%20region%20should%20live%20inside%20OCRAM.%20*%2F%0A%20%20%20%20(void)nonCacheSize%3B%0A%20%20%20%20assert((nonCacheStart%20%26gt%3B%3D%200x20240000U)%20%26amp%3B%26amp%3B%20(nonCacheStart%20%26lt%3B%200x20340000U))%3B%0A%0A%20%20%20%20ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk%20%7C%20MPU_CTRL_HFNMIENA_Msk)%3B%0A%0A%20%20%20%20%2F*%20Invalidate%20and%20enable%20system%20bus%20cache%20*%2F%0A%20%20%20%20LMEM-%26gt%3BPSCCR%20%7C%3D%20LMEM_PSCCR_INVW0_MASK%20%7C%20LMEM_PSCCR_INVW1_MASK%20%7C%20LMEM_PSCCR_GO_MASK%3B%0A%20%20%20%20while%20((LMEM-%26gt%3BPSCCR%20%26amp%3B%20LMEM_PSCCR_GO_MASK)%20!%3D%200U)%20%7B%7D%0A%20%20%20%20LMEM-%26gt%3BPSCCR%20%26amp%3B%3D%20~(LMEM_PSCCR_INVW0_MASK%20%7C%20LMEM_PSCCR_INVW1_MASK)%3B%0A%20%20%20%20LMEM-%26gt%3BPSCCR%20%7C%3D%20LMEM_PSCCR_ENCACHE_MASK%3B%0A%0A%20%20%20%20%2F*%20Invalidate%20and%20enable%20code%20bus%20cache%20*%2F%0A%20%20%20%20LMEM-%26gt%3BPCCCR%20%7C%3D%20LMEM_PCCCR_INVW0_MASK%20%7C%20LMEM_PCCCR_INVW1_MASK%20%7C%20LMEM_PCCCR_GO_MASK%3B%0A%20%20%20%20while%20((LMEM-%26gt%3BPCCCR%20%26amp%3B%20LMEM_PCCCR_GO_MASK)%20!%3D%200U)%20%7B%7D%0A%20%20%20%20LMEM-%26gt%3BPCCCR%20%26amp%3B%3D%20~(LMEM_PCCCR_INVW0_MASK%20%7C%20LMEM_PCCCR_INVW1_MASK)%3B%0A%20%20%20%20LMEM-%26gt%3BPCCCR%20%7C%3D%20LMEM_PCCCR_ENCACHE_MASK%3B%0A%7D%0A%0A%23endif%20%2F*%20__CORTEX_M%20%3D%3D%204%20*%2F%3C%2FSTRING.H%3E%3C%2FSTDDEF.H%3E%3C%2FSTDINT.H%3E%3C%2FCODE%3E%3C%2FPRE%3E%3CP%3E%3CBR%20%2F%3EPrint%20log%3A%26nbsp%3B%3C%2FP%3E%3CP%20class%3D%22%22%3EEventsHandled%3A%201%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%202%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%203%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%204%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%205%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%206%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%207%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%208%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%209%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3CBR%20%2F%3EEventsHandled%3A%2010%2C%20Magic%3A%201413829460%2C%20Seq%3A%200%2C%20Len%3A%200%3C%2FP%3E%3CP%3E%3CBR%20%2F%3E%3CBR%20%2F%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2300710%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20Problem%20writing%2Freading%20shared%20ocram%20RT1170%20EVKB%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2300710%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHi%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F251274%22%20target%3D%22_blank%22%3E%40cyberhelmer%3C%2FA%3E%2C%3C%2FP%3E%0A%3CP%3EI%20do%20see%20your%20setup%20to%20make%20OCRAM%20non-cacheable%20on%26nbsp%3BBOARD_ConfigMPU()%2C%20but%20at%20the%20very%20end%20of%20this%20routine%2C%20you%20have%20the%20following%3A%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20%20language-markup%22%3E%3CCODE%3E%20%20%20%20%2F*%20Invalidate%20and%20enable%20system%20bus%20cache%20*%2F%0A%20%20%20%20LMEM-%26gt%3BPSCCR%20%7C%3D%20LMEM_PSCCR_INVW0_MASK%20%7C%20LMEM_PSCCR_INVW1_MASK%20%7C%20LMEM_PSCCR_GO_MASK%3B%0A%20%20%20%20while%20((LMEM-%26gt%3BPSCCR%20%26amp%3B%20LMEM_PSCCR_GO_MASK)%20!%3D%200U)%20%7B%7D%0A%20%20%20%20LMEM-%26gt%3BPSCCR%20%26amp%3B%3D%20~(LMEM_PSCCR_INVW0_MASK%20%7C%20LMEM_PSCCR_INVW1_MASK)%3B%0A%20%20%20%20LMEM-%26gt%3BPSCCR%20%7C%3D%20LMEM_PSCCR_ENCACHE_MASK%3B%0A%0A%20%20%20%20%2F*%20Invalidate%20and%20enable%20code%20bus%20cache%20*%2F%0A%20%20%20%20LMEM-%26gt%3BPCCCR%20%7C%3D%20LMEM_PCCCR_INVW0_MASK%20%7C%20LMEM_PCCCR_INVW1_MASK%20%7C%20LMEM_PCCCR_GO_MASK%3B%0A%20%20%20%20while%20((LMEM-%26gt%3BPCCCR%20%26amp%3B%20LMEM_PCCCR_GO_MASK)%20!%3D%200U)%20%7B%7D%0A%20%20%20%20LMEM-%26gt%3BPCCCR%20%26amp%3B%3D%20~(LMEM_PCCCR_INVW0_MASK%20%7C%20LMEM_PCCCR_INVW1_MASK)%3B%0A%20%20%20%20LMEM-%26gt%3BPCCCR%20%7C%3D%20LMEM_PCCCR_ENCACHE_MASK%3B%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3EBy%20the%20end%20of%26nbsp%3BBOARD_ConfigMPU()%2C%20which%20is%20basically%20the%20start%20of%20your%20application%2C%20you%20re-enable%20system%20and%20code%20bus%20cache%2C%20which%20might%20be%20causing%20a%20mismatch%20between%20what%20the%20M7%20is%20writing%20vs%20what%20the%20M4%20is%20reading.%3C%2FP%3E%0A%3CP%3ETry%20commenting%20out%20these%20lines%20as%20a%20quick%20test%20to%20see%20if%20this%20changes%20anything%20between%20the%20reading%2Fwriting%20of%20the%20shared%20memory%20address.%3C%2FP%3E%0A%3CP%3EBR%2C%3CBR%20%2F%3EEdwin.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2304837%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20Problem%20writing%2Freading%20shared%20ocram%20RT1170%20EVKB%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2304837%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EThanks%2C%20but%20I%20think%20the%20problem%20was%20with%20the%20linker%20and%20the%20memory%20I%20was%20testing%20was%20actually%20not%20ending%20up%20at%20the%20correct%20region%20which%20the%20mpu%20config%20had%20set%20to%20non%20cacheable!%26nbsp%3B%3CBR%20%2F%3E%3CBR%20%2F%3ESo%20I%20think%20it's%20solved%2C%20need%20to%20do%20some%20more%20test%20to%20me%20100%25%20sure.%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E