Как добавить память в кучу во время выполнения? - PullRequest
1 голос
/ 30 ноября 2010

Я использую Keil ARM-MDK 4.11. У меня статически выделенный блок памяти, который используется только при запуске. Он используется до инициализации планировщика и из-за того, что RL-RTX получает контроль над управлением кучей, не может быть динамически распределен (иначе последующие выделения после запуска планировщика вызывают серьезную ошибку).

Я хотел бы добавить этот статический блок как свободный блок в системную кучу после инициализации планировщика. Казалось бы, что __ Heap_ProvideMemory () может дать ответ, это вызывается во время инициализации для создания начальной кучи. Однако это потребовало бы знания адреса дескриптора кучи, и я не могу найти никакого документированного способа получения этого.

Есть идеи?

Я подал запрос на поддержку в ARM / Keil для этого, но их больше интересует вопрос, почему я хотел бы сделать это, и предложение альтернативных решений. Я хорошо знаю об альтернативах, но в этом случае, если бы это можно было сделать, это было бы самым чистым решением.

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Один из методов, которые я использовал, состоит в том, чтобы включить мои собственные простые процедуры кучи и взять из библиотеки функции malloc() / calloc() / free().

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

Недостатком этого (по крайней мере, в моем случае) было то, что пользовательские подпрограммы кучи были далекоменее сложны, чем встроенные подпрограммы библиотеки, и, вероятно, более подвержены фрагментации, чем встроенные подпрограммы.Это не было серьезной проблемой в этом конкретном приложении.Если вам нужны возможности встроенных библиотечных подпрограмм, возможно, вы можете отложить malloc() на встроенные подпрограммы кучи до тех пор, пока она не вернет ошибку, а затем попытаться выделить ее из своей пользовательской кучи.

Другим недостатком является то, что мне было гораздо сложнее убедиться, что пользовательские подпрограммы не содержат ошибок, чем я думал, что это будет на первый взгляд, хотя я и не пытался делать что-то слишком причудливое (просто простой список свободных блоков).которые могут быть разделены при выделении и объединены при освобождении).

Одно из преимуществ этого метода заключается в том, что он довольно переносим (если ваши пользовательские подпрограммы переносимы) и не ломается, если цепочка инструментов меняет свои внутренние компоненты.,Единственная часть, которая требует портирования, - это использование интерфейса malloc() / free() и уверенность, что вы инициализированы достаточно рано.

1 голос
/ 01 декабря 2010

Мы используем компилятор Rowley Crossworks, но у нас была похожая проблема - куча настраивалась в коде запуска CRT компилятора. К сожалению, SDRAM не был инициализирован до начала main (), и поэтому куча не была настроена должным образом. Я обошел его, повторно инициализировав кучу в начале main (), после инициализации SDRAM.

Я посмотрел на ассемблерный код, который компилятор использует при запуске для разработки структуры - это было не сложно. Впоследствии я также получил исходный код malloc / free от Роули - возможно, вы могли бы спросить у Кейла их версию?

...