STM32L1 - вопрос Mallo c (вопрос для начинающих) - PullRequest
1 голос
/ 20 февраля 2020

Я вроде как новичок в C, но чувствую, что у меня хорошее понимание основ c и поэтому разместил вопрос здесь.

Я пытаюсь перенести какой-то демонстрационный код для Waveshare E дисплей для использования в приложении в моем выпускном проекте. Сейчас я просто хотел доказать, что демонстрационный код работает, но, скорее всего, позже буду использовать его аспекты.

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

// Create a new image cache
UBYTE *BlackImage; 
UWORD Imagesize = ((EPD_WIDTH % 8 == 0)? (EPD_WIDTH / 8 ): (EPD_WIDTH / 8 + 1)) * EPD_HEIGHT;
if((BlackImage = (UBYTE *)malloc(Imagesize)) == NULL)
    {
    printf("Failed to apply for memory...\r\n");
    return -1;
}

Я почти уверен, что мое понимание этого верно, но по сути:

  1. Указатель создан для BlackImage
  2. Размер памяти, выделяемой для Blackimage, определяется на основе размеры экрана
  3. В операторе if BlackImage назначается размер памяти из вышеуказанной строки и возвращается значение указателя для BlackImage. Если это значение указателя равно NULL (то есть 0), то память не была выделена.

Мой код всегда терпит неудачу при «применении этой памяти». Я предполагаю, что причина в том, что мне не хватает памяти ... но вот мои вопросы:

  1. Если мне не хватает памяти - где я могу найти это? (Я использую Keil uVision IDE)
  2. Могу ли я решить эту проблему путем смещения объема памяти? Хранится ли Mallo c в памяти определенного типа c? Я знаю, что термин «куча» - это полезная память, но с каким типом памяти это соотносится с таблицей u C?
  3. Существуют ли альтернативные способы сделать это? Демонстрационный код также включает в себя массив, хранящийся в отдельном файле C (ImageData. c прилагается), так почему бы вам использовать здесь mallo c, а не делать то же самое?
  4. Что такое лучшие решения вокруг этого?

Заранее спасибо за любую помощь! Пожалуйста, поправьте меня, где я изложил что-то неверное, я здесь, чтобы узнать! : D

РЕДАКТИРОВАТЬ: Дополнительная информация ниже.

Я использую STM32L152RB (STM32L-Discovery), который имеет 16 КБ ОЗУ. Также см. Переменные ниже:

// Display resolution
#define EPD_WIDTH       122
#define EPD_HEIGHT      250

ПОЛНЫЙ демонстрационный код можно найти здесь: https://www.waveshare.com/wiki/File: 2.13inch_e-paper_code (V2) .7z

Все, что у меня есть Все, что нужно сделать, это перенести контакты и удалить строки printf / debug, поскольку у меня нет конвертера USB в TTL на данный момент.

1 Ответ

1 голос
/ 20 февраля 2020
  1. не использовать распределение mallo c dynamici c во встроенных проектах.
  2. если вы решите выполнить mallo c (при условии стандартного запуска, сгенерированного STM), вам нужно изменить скрипт компоновщика, в котором определен размер кучи. Чтобы проверить доступную кучную память (все еще рассматривая STM glib c Implementatn), вам нужно изменить реализацию sbrk. измените положение кучи stati c на глобальную переменную и, используя символы сценария компоновщика, проверьте, сколько памяти осталось.
...