[chbot] Volatile struct puzzle

Robin Gilks gb7ipd at gmail.com
Sat Feb 5 04:41:24 GMT 2022


Hmmm - thanks Mark, I  hadn't thought of packing issues.
It's not like I'm trying a union to another struct so positioning would be
critical. That being the case I think I'll keep that thought on the back
burner for now..

Cheers


On Sat, Feb 5, 2022 at 4:10 PM Mark Atherton <markaren1 at xtra.co.nz> wrote:

> I have seen issues with data segments, where large chunks (u32, u8*)
> follow small chunks (u8).
>
> Try changing
>
>  > uint8_t State;
>  > uint8_t *DataBuffer;
>  > uint32_t DataBufferSize;
>
> to
>
>  > uint32_t DataBufferSize;
>  > uint8_t *DataBuffer;
>  > uint8_t State;
>
> -Mark
>
>
>
>
> On 5/02/2022 1:50 PM, Robin Gilks wrote:
> > Some may recall that a year or 2 ago I had great problems getting the
> > hardware JPEG encode to work on an STM32 processor. It turned out that
> > the memory cache attributes manifested as a race condition between DMA
> > and CPU access.
> > The problem has just reappeared as a result of updating
> > from arm-none-eabi-gcc-9.2.1-1.1 to arm-none-eabi-gcc-10.3.1-2.3.
> >
> > After a few pokes at the code I've narrowed the issue down to whether a
> > volatile struct element is initialized statically  or at run time.
> > Interestingly the issue is inverted between compiler versions
> > The buffer referenced by the structure element 'DataBuffer'  is defined
> > and instantiated in a reserved section of memory that has the correct
> > cache attributes
> >
> > typedef struct
> > {
> > uint8_t State;
> > uint8_t *DataBuffer;
> > uint32_t DataBufferSize;
> > }JPEG_Data_BufferTypeDef;
> > uint8_t
> >
> JPEG_Data_InBuffer[CHUNK_SIZE_IN]__attribute__((section(".MCU_Data_section")));
> > original code - works with gcc-9; fails with gcc-10:
> > volatile JPEG_Data_BufferTypeDef Jpeg_IN_BufferTab = {JPEG_BUFFER_EMPTY,
> > JPEG_Data_InBuffer, 0};
> > current code fails with gcc-9 works with gcc-10:
> > volatileJPEG_Data_BufferTypeDefJpeg_IN_BufferTab= {0, 0, 0};
> > ...
> > Jpeg_IN_BufferTab.DataBufferSize = 0;
> > Jpeg_IN_BufferTab.State = JPEG_BUFFER_EMPTY;
> > Jpeg_IN_BufferTab.DataBuffer = JPEG_Data_InBuffer;
> >
> > Note that NO other changes (apart from the compiler version) were made!!
> > I'm at a total loss as to what is going on, hopefully someone can shine
> > a light ;)
> >
> > --
> > Robin Gilks
> >
> >
> > _______________________________________________
> > Chchrobotics mailing list Chchrobotics at lists.ourshack.com
> > https://lists.ourshack.com/mailman/listinfo/chchrobotics
> > Mail Archives: http://lists.ourshack.com/pipermail/chchrobotics/
> > Meetings usually 3rd Monday each month. See http://kiwibots.org for
> venue, directions and dates.
> > When replying, please edit your Subject line to reflect new subjects.
> >
>
>
> _______________________________________________
> Chchrobotics mailing list Chchrobotics at lists.ourshack.com
> https://lists.ourshack.com/mailman/listinfo/chchrobotics
> Mail Archives: http://lists.ourshack.com/pipermail/chchrobotics/
> Meetings usually 3rd Monday each month. See http://kiwibots.org for
> venue, directions and dates.
> When replying, please edit your Subject line to reflect new subjects.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ourshack.com/pipermail/chchrobotics/attachments/20220205/226f81e2/attachment.html>


More information about the Chchrobotics mailing list