【问题标题】:STM32L1 - Malloc issue (Beginner Question)STM32L1 - Malloc 问题(初学者问题)
【发布时间】:2020-02-20 00:50:30
【问题描述】:

我对 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

编辑:以下附加信息。

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

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

完整的演示代码可以在这里找到:https://www.waveshare.com/wiki/File:2.13inch_e-paper_code(V2).7z

我所做的只是将引脚移植过来并移除 printf/调试线,因为我目前没有 USB 到 TTL 转换器。

【问题讨论】:

  • ImageSize 有多大?您在微控制器中有多少内存。您通常对malloc() 使用的堆没有太多控制权,因此在微控制器中您通常必须自己进行内存管理。
  • *在 if 语句中,BlackImage 分配了上一行的内存大小,* 不正确。 BlackImage 分配了malloc(ImageSize) 返回的指针,然后将该指针与NULL 进行比较以查看分配是否成功。在任何情况下,内存大小都不会分配给BlackImage
  • 除非您在项目中明确配置了它(大小和位置),否则您没有到 malloc 的堆 - 所以它总是会失败。
  • @Barmar 我有 16kB RAM 并且正在使用 STM32L152,问题已更新以反映。
  • 源代码中没有。它将在您的链接器配置和项目设置中。

标签: c malloc stm32 stm32ldiscovery


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

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2020-11-23
    • 2015-03-16
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多