首页 > 解决方案 > STM32L1 - Malloc 问题(初学者问题)

问题描述

我对C有点陌生,但觉得我有很好的基本理解,因此在这里发布了这个问题。

我正在尝试移植一些用于 Waveshare 电子纸显示器的演示代码,以用于我的研究生项目中的应用程序。现在我只是想证明演示代码是有效的,但以后很可能会用到它的某些方面。

我目前遇到的问题是使用以下几行:

// 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. 我可以通过移动内存分配来解决这个问题吗?malloc 是否存储在特定类型的内存中?我知道术语堆本质上是可用内存,但是这与 uC 数据表中的哪种类型的内存相关?
  3. 有没有其他方法可以做到这一点?演示代码还包括一个存储在单独的 C 文件(附加 ImageData.c)中的数组,那么为什么要在这里使用 malloc 而不是以同样的方式呢?
  4. 围绕这个问题的最佳解决方案是什么?

提前感谢您的帮助!请指正我说的不正确的地方,我是来学习的!:D

编辑:下面的附加信息。

我正在使用具有 16kB RAM 的 STM32L152RB(STM32L-Discovery)。另请参阅下面的变量:

// 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 转换器。

标签: cmallocstm32stm32ldiscovery

解决方案


  1. 不要在嵌入式项目中使用 malloc 动态分配。
  2. 如果您决定 malloc(假设标准 STM 生成的启动),您需要更改定义堆大小的链接描述文件。要检查可用的堆内存(仍在考虑 STM glibc 实现),您需要修改 sbrk 实现。将静态堆位置更改为全局变量,并使用链接描述文件符号提供的检查剩余内存量。

推荐阅读