Библиотека, с которой у меня были проблемы - это ucGUI 3.24. Отыскал по тексту все переменные, которые читаются до инициализации, вставил инициализацию руками в текст программы. Однако все же остались проблемы с менеджером динамической памяти. Программа могла некоторое время работать, но в какой-то прекрасный момент все крушилось именно при вызове функций выделения памяти. Библиотека использует собственную реализацию менеджера динамической памяти. Для этой цели выделяется два массива фиксированного размера (задается на этапе компиляции) - массив дескрипторов и, собственно, куча. При вызове функции _Alloc(), отыскивается свободный дескриптор, затем дырка подходящего размера в куче, данная область помечается как занятая и возвращается номер дескриптора, соответстующий выделенному участку кучи. Номер дескриптора с помощью макроса можно преобразовать в указатель на void. Переписал данный модуль таким образом, чтобы использовались функции malloc() и free() из sdlib вместо собственной реализации на статическом массиве. Все заработало, однако значительно медленнее, чем на реализации микриума. Только после того, как проделал это, обнаружил в map-файле программы, что массив с кучей ложится в сегмент COMMON, причем COMMON начинается с адреса 0x00000000, а ОЗУ у меня начинается с 0x48000000. После того, как подправил скрипт линкера и указал расположение сегмента COMMON все заработало. Раньше я считал, что сегмент COMMON, если это не указано в скрипте линкера особо, должен ложится после сегмента bss. Разве нет?
|