cancel
Showing results for 
Search instead for 
Did you mean: 

About performance in stm32f103c8t6

EGeno.1
Associate II

Would be the part of the program code executed faster if its section was linked to be moved from flash to ram on startup? This code is executed many times.

5 REPLIES 5
Uwe Bonnes
Principal III

Mostly linear code with run fast in flash. Jumps however will stall for the number of wait state cycle. Putting program in flash will keep RAM busy, maybe delaying loading data from ram or vice versa.

Is this a genuine STM32F103?

The counterfeits may behave differently, especially those which emulate FLASH by RAM loaded from an on-chip serial FLASH.

As Uwe said, running code from SRAM, while it's nominally faster and does not impose waitstates, will cause conflicts with other usage of the SRAM. The 'F1 is a relatively simplistic design compared to e.g. 'F2 - e.g. there's only one SRAM, SRAM can't be remapped to the I/D ports of processor - so there are not many degrees of freedom in what you can do to improve execution from SRAM, and it may quite well turn out that running from SRAM is no faster or even slower than running from FLASH.

You'd have to benchmark yourself, perhaps on the most computationally intensive part of your own code.

JW

The F1 is a sloth, the slowness of the FLASH is always shared with the processor, as there is no attempt to cache, or hold lines for the prefetch queue.

Putting critical code in RAM, including the vector table, would certainly be worth trying and benchmarking.

With questions like this, JUST TRY IT, it is not hard to do, or quantify.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
EGeno.1
Associate II

Thanks!

I tried on purpose with non-optimal code and its execution in RAM was 11% faster than in flash.

Reallocation in RAM is only on the code, without the vector table.

 uint32_t t1, t2, su, in;

   t1 = Millis();

   su = 0;

   in = 1;

   la1:

   su += in;

   in++;

   if(in < 1000000) goto la1;

   t2 = Millis();

       xprintf("R: %lu %lu %lu\n", t2, t1, (long)(t2-t1));

-------------------------------------------------

F: 153125 152754 371

R: 153453 153125 328

------------------------------------------------

/usr/local/bin/stm32flash -b 115200 /dev/ttyUSB0

stm32flash 0.5

http://stm32flash.sourceforge.net/

Interface serial_posix: 115200 8E1

Version     : 0x22

Option 1    : 0x00

Option 2    : 0x00

Device ID   : 0x0410 (STM32F10xxx Medium-density)

- RAM       : 20KiB (512b reserved by bootloader)

- Flash     : 128KiB (size first sector: 4x1024)

- Option RAM : 16b

- System RAM : 2KiB

EGeno.1
Associate II

Test shows faster execution of the code in RAM for this device.