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

FreeRTOS и параметр portBYTE_ALIGNMENT

Вроде давно уже работаю с 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.

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


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

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

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

 

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

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


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

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

 

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

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


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

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

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

 

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

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

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


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

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

 

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

 

 

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


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

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

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

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

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

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

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

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

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

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