Loading...
 

SW4STM32 and SW4Linux fully supports the STM32MP1 asymmetric multicore Cortex/A7+M4 MPUs

   With System Workbench for Linux, Embedded Linux on the STM32MP1 family of MPUs from ST was never as simple to build and maintain, even for newcomers in the Linux world. And, if you install System Workbench for Linux in System Workbench for STM32 you can seamlessly develop and debug asymmetric applications running partly on Linux, partly on the Cortex-M4.
You can get more information from the ac6-tools website and download (registration required) various documents highlighting:

System Workbench for STM32


STM32F4 DMA Interrupt big latency :(

I’m having a similar problem. I have two routines running, one using DMA2D to display bitmaps on the LCD and the other a simple timer that toggles LED2 every second. I have run this code through a different IDE and STM32 and in the case of the STM32, it runs at a distinctly slower pace. In fact, the display doesn’t run at all if I have any level of optimisation turned on, and only works when optimisations are turned off.

This is not a code issue as the LED is toggled precisely at 1s intervals in all configurations on all IDEs. So the underlying code is working but for some reason STM32W is causing my code to run in a non-optimal fashion. I’ve tried searching through the forum without luck. Any help will be appreciated.

France

Hi,

If optimizing your code cause a problem, probably this come from your code missing synchronization; the GCC compiler is optimizing your code quite aggresively, so when programming parallel devices like DMA you should be careful on two points:

  1. check that all registers and DMA descriptors are correctly declared as volatile
  2. check that, if there is ordering problems (like two writes that must occur in a definite order with one being to standard memory) you placed memory barriers between them (using the CMSIS __MSB() intrinsic


The LED code most probably do not have these kind of problems as this uses a simple register-based interface; however the DMA controller running in parallel with the CPU, you must be absolutly sure, when you validate the transfert, that all other information was correctly available to the DMA controller.

Hope this helps,

Bernard (Ac6)

Thanks for the response, Bernard.

The issue is that it is causing a slowdown of the DMA when there is *no* optimisation set. I’ve switched off GCC optimisation and experimented with different Debug levels (None to Max). If no code is being optimised then that should not be an issue, correct?

Also, I’m using code that came along with the Cube examples. I’ve only minimally modified it to use my own images; as I said I’ve tried using a different IDE and it works.

Thanks,
Aditya

France

Hi Aditya,

What kind of slowdown do you notice? Of course unoptimized code runs slower than optimized one, but, except if you are very close to the maximum MCU load, it should not be noticeable (except, of course, if you measure it in your code)...

As for the other IDEs, I can’t say but they may not optimize like GCC. Of course it is possible you ran in a GCC bug, but that is very improbable; I would rather bet that some code is not clean enough (either ST’s or your’s) and fools the optimizer...

Bernard (Ac6)