Jump to content
    

pvPortMalloc. Правильно вычисляет размер?

Здравствуйте. 

Заметил, что pvPortMalloc стал работать по другому. Некоторые сегменты стали занимать больше памяти чем раньше. Стал копаться и обнаружил изменения в коде, смысл которых мне не совсем понятен.

Раньше было 

            xWantedSize += xHeapStructSize;

            /* Ensure that blocks are always aligned to the required number
             * of bytes. */
            if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )
            {
                /* Byte alignment required. */
                xAdditionalRequiredSize = portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK );

Добавляем размер заголовка, проверяем выравнивание, выравниваем память.

 

К пример хотим выделить 20 байт, выравнивание 4, размер заголовка 8 . Будет выделено 28 байт.

 

Теперь стало

        if( xWantedSize > 0 )
        {
            /* The wanted size must be increased so it can contain a BlockLink_t
             * structure in addition to the requested amount of bytes. Some
             * additional increment may also be needed for alignment. */
            xAdditionalRequiredSize = xHeapStructSize + portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK );

            if( heapADD_WILL_OVERFLOW( xWantedSize, xAdditionalRequiredSize ) == 0 )
            {
                xWantedSize += xAdditionalRequiredSize;
            }

Теперь просто добавляется выравнивание. Причем всегда.

 

К пример хотим выделить 20 байт, выравнивание 4, размер заголовка 8 . Будет выделено 32 байт!

 

В чем смысл? 

Edited by a9d

Share this post


Link to post
Share on other sites

Может, для выравнивания начальной позиции стека к 8 байтам, согласно ARM AAPCS (если речь об ARM). Это правильнее.

Share this post


Link to post
Share on other sites

Так файлы heap_*.c для всех микроконтроллеров одинаковые. 

Да и если хотим выделить 24 байта, то будет выделено 36 байт. Мне кажется это баг, который добавили на ровном месте.

Share this post


Link to post
Share on other sites

Да это баг. Нашел источник проблемы. 

Проверил репозиторий FreeRTOS, в репозитории все правильно. Начал проверять откуда эти странный файлы взялись. С оф. сайта можно скачать архив FreeRTOSv202212.01.zip и в нем уже есть этот баг! Архив и репозиторий не идентичны

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...