Jump to content

    
Sign in to follow this  
yashok

FreeRTOS и параметр portBYTE_ALIGNMENT

Recommended Posts

Вроде давно уже работаю с FreeRTOS, но недавно обнаружил одну странность. Параметр portBYTE_ALIGNMENT всегда был у меня равен 8. Но вдруг в большом проекте начал подглючивать FreeRTOS, при выделении или освобождении памяти (heap_2). Поменял portBYTE_ALIGNMENT на 4 и глюки прекратились, но перестали работать такие библиатечные функции как sprintf и scanf, стека во всех задачах предостаточно.

Все это набшлюдается на микроконтроллерах на ядре Cortex-m3 (NXP и Luminary).

Использую Keil 4.10

 

И еще если в Keil играться включить опцию Use cross-module optimization начинает работать sprintf и scanf.

 

Может я чего-то не понимаю о параметре portBYTE_ALIGNMENT и опции Use cross-module optimization. Разъясните ПОЖАЛУЙСТА.

 

PS На ядре ARM7 единтичный проект работает без глюков с portBYTE_ALIGNMENT равным 8.

Share this post


Link to post
Share on other sites

portBYTE_ALIGNMENT для ARM7/Cortex-M3 должен быть равен 8.

Влияние включения cross-module optimization является случайным.

 

Так что нужно разбираться с "подглючиваниями". Уточните, что скрывается за этим термином.

Share this post


Link to post
Share on other sites

При выделении или очистки памяти, а именно в макросе prvInsertBlockIntoFreeList, вылитаем на HardFault. Скорее всего получается ,что в каком-то блоке указатель на следующий свободный блок не указывает на какой-нибудь блок и не ревен нулю, просто содержет левое значение. Или в блоке портится размер блока.

 

Но очень не понятно как portBYTE_ALIGNMENT может влиять на sprintf.

Share this post


Link to post
Share on other sites
При выделении или очистки памяти, а именно в макросе prvInsertBlockIntoFreeList, вылитаем на HardFault. Скорее всего получается ,что в каком-то блоке указатель на следующий свободный блок не указывает на какой-нибудь блок и не ревен нулю, просто содержет левое значение. Или в блоке портится размер блока.

Надо искать ошибку в вашем коде - сам по себе heap_2 исправен.

 

Но очень не понятно как portBYTE_ALIGNMENT может влиять на sprintf.

Нарушается требование по выравниванию стека по границе двух слов.

Share this post


Link to post
Share on other sites

Еще бывают моменты когда xStart указывает на следующий блок, а указатель pxNextFreeBlock в этом блоке указывает на себя (на этот же блок).

 

В проекте куча используется для динамического выделения памяти обсолютно под все нужды, поэтому используется самодельная функция поиска и объединения рядом находящихся участков памяти.

 

 

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.

Sign in to follow this