Перейти к содержанию
    

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 байт!

 

В чем смысл? 

Изменено пользователем a9d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...