7.5 Tightly-Coupled Memories

The compiler supports attributes and options that allow the placement of code and objects into Tightly Coupled Memory (TCM). Accessing code and data in this memory avoids the intricacies of a system bus matrix and provides fixed latency and hence deterministic program execution.

Some Cortex-M7 devices implement TCM in SRAM, as separate instruction TCM (or ITCM), used to hold code, and data TCM (DTCM), used to hold data. These memories can be enabled and configured through independent device registers. The internal organization and size of the TCM areas vary greatly across devices, and this will be discussed in the data sheet for your selected device.

The tcm attribute places objects or functions into the appropriate TCM, for example uint32_t __attribute__((tcm)) var;, which will place the object var into DTCM.

In device families where separate ITCM and DTCM are present, independent driver options allow you to set the size of these memory areas, those being -mitcm=size and -mdtcm=size, which set the size (in bytes) of the instruction and data TCM respectively. The size specified must be one permitted by the device and can be specified as a decimal number or as a hexadecimal number with a leading 0x. When an invalid size has been specified, check the error message to see the sizes acceptable by that device. Use of these options will ensure that the device-specific runtime startup code and linker script enable and initialize TCM before your main() function is called. Once enabled, the preprocessor macros __XC32_ITCM_LENGTH and/or __XC32_DTCM_LENGTH will be defined and equated to the size of the respective TCM area.

By default, the vector table is allocated to TCM if possible. The option -mno-vectors-in-tcm keeps the vector table out of TCM, which might be desirable if the selected device has limited memory available.

The data stack can be moved to TCM by ensuring that the -mstack-in-tcm driver option is issued at both compile and link time. The linker will allocate a stack to DTCM and the startup code will transfer the stack from System SRAM to DTCM before calling your main() function.