2025-06-28 8:54 AM
Hello, I am working with a custom board using an STM32u5g9vjt6q and a DSI display in video mode. The screen consist of multiple elements including scrollwheels, text boxes, arcs and boxes with borders and using the double buffer strategy Originally I had the project running on FreeRTOS and all of the elements would update correctly by calling invalidate on the items that needed to be updated.
I have switched to running no OS for various reasons and now the only screen elements that update 100% of the time are the scrollwheels, I sometimes see a textbox wildcard flicker between the default value and the updated value but that is not very common.
If I call View::invalidate(); from inside of screen1::handleTickEvent() all of the screen elements will refresh and be displayed correctly but this kills the performance of the device as expected and I know this is not the solution to my problem. I have been doing a lot of reading on this forum and I started to look into the VSync functions inside of OSWrappers.cpp, Im not sure this is where my problem lies but its the only clue I have to go on.
OSWrappers::signalVSync() is being called around 70hz, OSWrappers::signalRenderingDone() is being called at 50hz and the output of the FRAME_RATE gpio is 25hz
OSWrappers::waitForVSync() is never being called, Im not sure if that has anything to do with my issue, just something that Ive noticed.
Any input would be great, I need to figure out how to remove the View::invalidate() call on every handleTickEvent() and be able to rely on invalidating each element as they need to be updated. Once again, this approach worked as expected when I was running FreeRTOS. Thanks!