Is ITIM initialized from flash each time the application launched?
That depends on what your program code does.
ITIM is not used by default, but you can write code to explicitly copy something to ITIM, or you can use a linker script to place some section(s) at the ITIM address in which case the standard init code will copy it there from flash in the same way as initialized data sections are copied to DTIM.
In either case, one of your own code or the standard init code will run every time the board is reset.
I was thinking that running code out of the QSPI flash would be kind of sluggish when we have an instruction cache miss so I want to move my code that needs to snap to ITIM. Since it has nearly the same latency as the cache this should improve responsiveness in a predictable manner.
So what you are saying is what I suspected, there is some startup code that copies code from the QSPI flash to the ITIM memory the same as initialized data is copied every time the program is started (reset). I just wanted to confirm what I suspected, so thanks.
The ITIM is the instruction cache, just reconfigured, so you don’t want to put more than necessary there.
From memory, with the default SPI settings icache misses cost a couple of microseconds.
Worse, accesses to data in flash have the same latency (per access), so frequently accessed constant data should be put in a section that the linker will arrange to put in DTIM – the easiest can be to simply declare it non-constant.