【发布时间】: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;
}
我很确定我对此的理解是正确的,但本质上:
- 为 BlackImage 创建了一个指针
- 为 Blackimage 分配的内存大小取决于显示尺寸
- 在 if 语句中,BlackImage 从上面的行中分配了内存大小,并重新返回 BlackImage 的指针值。如果此指针值为 NULL(即 0),则尚未分配内存。
我的代码在“应用此内存”时总是失败。我认为原因是我没有足够的可用内存。但这是我的问题:
- 如果我没有足够的内存 - 我在哪里可以找到这个? (我使用的是 Keil uVision IDE)
- 我可以通过移动内存分配来解决这个问题吗? malloc 是否存储在特定类型的内存中?我知道术语堆本质上是可用内存,但是这与 uC 数据表中的哪种类型的内存相关?
- 是否有其他方法可以做到这一点?演示代码还包括一个存储在单独 C 文件(附加 ImageData.c)中的数组,那么为什么要在这里使用 malloc 而不是以同样的方式呢?
- 这方面的最佳解决方案是什么?
提前感谢您的帮助!请指正我说的不正确的地方,我是来学习的! :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