c - 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;
}
我很确定我对此的理解是正确的,但本质上是:
- 为 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 转换器。
解决方案
- 不要在嵌入式项目中使用 malloc 动态分配。
- 如果您决定 malloc(假设标准 STM 生成的启动),您需要更改定义堆大小的链接描述文件。要检查可用的堆内存(仍在考虑 STM glibc 实现),您需要修改 sbrk 实现。将静态堆位置更改为全局变量,并使用链接描述文件符号提供的检查剩余内存量。
推荐阅读
- android - 无法在 Android Studio 中读取或写入 SQLite 数据库
- sql - 如何让 pl/sql 代码跳过多列中的 NULL 值
- python - 如何从时间戳索引数据框中获取值
- arrays - 数组作为字符串保存到数据库,现在需要将字符串从数据库中发布到单独的输入字段中 - Laravel
- github - Github API:列出最后 N 个公共仓库
- css - 如何在 Chrome 中修复 input[type=number] 的宽度?
- java - 从用户定义的字符串数组中删除用户定义的元素
- aem - 如何在 RTE 中覆盖 List 插件
- python - 在 Numpy/PyTorch 中快速查找值大于阈值的索引
- javascript - 为以太坊错误安装 web3