1

我面临着很大的担忧。我目前正在参加一个三明治课程,我正在自学如何在嵌入式系统上开发软件——碰巧是在 open1788 板上。

我计划实现双缓冲功能,因为我可以在我的 LCD 屏幕上看到闪烁。确实可以在绘制时查看形状!

使用双缓冲,重绘整个屏幕的速度足够快。也许我应该深入研究管理剪辑,这样我只需要重绘需要的部分屏幕?但这不是问题。

所以,我写了几个函数来处理双缓冲选项的选择。如果我不希望软件使用双缓冲,那么我不会为它分配内存;否则我会。

问题是为堆分配的默认空间高达 1024 字节。我的临时缓冲区的长度为 261120 字节!(481 像素宽每 272 像素高,每个 16bpp)。

结果,malloc 返回 NULL。

我采取的第一个解决方案是放置一个静态缓冲区,我的意思是:

static WORD s_double_buf[481*272];

但明显的缺点是即使您不使用双缓冲,它仍然会被分配。

第二种解决方案是编辑配置文件以使堆更大,每替换 1024 字节,例如 1048576 字节 (0x100000)。我不喜欢这个解决方案,因为我应该专注于节省内存空间。

也许我非常怀念嵌入式编程技能?根据这一点,最好的解决方案是什么?我怎样才能取得进步?我不会告诉你我阅读和挖掘数据表的杂乱能力。

如果有人可以为我提供初学者参考资料,我将非常感激,这些参考资料主要适用于我正在编程的电路板。

提前致谢!

4

2 回答 2

5

在嵌入式空间中,您通常会决定是否在编译时而不是在运行时使用双缓冲等基本方面。因此使用预处理器和条件编译是完全可以接受的:

#ifdef WITH_DOUBLEBUFFERING

    static WORD s_double_buf[481*272];
    #define SCREEN s_double_buf

#else

    #define SCREEN your_real_framebuffer

#endif

在您的 GUI 库的实现中,您将绘制到 SCREEN。

于 2013-01-09T14:53:27.840 回答
4

对于嵌入式系统,您通常希望在启动时分配所有内存。这意味着你已经知道你有足够的能力去做你想做的一切,这意味着它不会在运行中失败,这通常是一件好事,尤其是对于嵌入式系统而言。

静态分配内存——这很容易,而且看起来你有多余的空间。如果以后您发现内存不足并且可以在没有双缓冲的情况下逃脱,那么您可以轻松地将其取出。

如果您确实使用malloc,请在启动时完成所有操作,那么您将不必在正常操作期间从内存不足中恢复。

于 2013-01-09T13:28:34.040 回答