我对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
编辑:下面的附加信息。
我正在使用具有 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 转换器。